Java的集合框架机制与泛型

Java集合:就是一种容器,用于存储,获取,操作对象的容器

数组与集合的比较

1. 数组的长度不可变,数组没有提供可以查看有效元素个数的方法

2. 集合的长度是可变的,集合可以存储任意类型的对象,集合只能存储对象

Java的集合框架接口主要有两个接口派生二次:Collection和Map, 这两个接口是Java集合框架的根接口。这两个接口又包含了一些接口和实现类;Set 和List接口是Collection派生的两个子接口。

Set接口实现类:HashSet, TreeSet;

List接口实现类:Arraylist, LinkedList, Vector;

Map接口实现的类型HashMap, HashTable;

 集合框架
一,Collection集合

java.util.Collection : Java集合框架的根接口

    |--- java.util.List: 有序的,可以重复的。

        |--- ArrayList: 采用数组结构存储元素。 查询快,增删慢,线程不安全,轻量级

        |--- LinkedList: 采用链表结构存储元素。 增删快,查询慢

        |--- Vector: 采用数组结构存储元素,线程安全,重量级(很少用到)

    |--- java.util.Set: 无序的,不允许重复。

        |--- HashSet : 是 Set 接口的典型实现类。

            判断元素是否存在的依据是:先比较 hashCode 值,若 hashCode 存在,再通过 equals() 比较内值,若 hashCode 值不存在,则直接存储

            注意:重写 hashCode 和 equals 二者需要保持一致

           |--- LinkedHashSet: 相较于HashSet多了链表维护元素的顺序。遍历效率高于 HashSet,增删效率低于 HashSet

        |--- TreeSet : 使用元素的自然顺序对元素排序,或根据创建set时提供的Comparator进行排序

            |-- 自然排序(Comparable):

                ①需要添加 TreeSet 集合中对象的类实现  Comparable 接口

                ②实现 compareTo(Object o) 方法

            |-- 定制排序(Comparator)

                ①创建一个类实现 Comparator 接口

                ②实现 compare(Object o1, Object o2) 方法

                ③将该实现类的实例作为参数传递给 TreeSet 的构造器  

         |--- Iterator:遍历接口,用于遍历元素对象;

1) 增强for循环 -for(被遍历的数据类型 变量名:被遍历的集合){}

ArrayList al = new Arraylist()
al.add("AA");
al.add("BB");
for(Object obj : al){
    System.out.println(obj);
}

2) 使用Iterator迭代器

Iterator it = al.iterator();
while(it.hasNext()){
    Object obj = it.next();
    System.out.println(obj);
}

3) ListIterator : 列表迭代器,是List特有的迭代器;

ListIterartor li = al.listIterator();
While(li.hasNext()){
Object obj = li.next();
If(obj.equals.(“obj”)){
li.set(“bobs”);
}
}

二. Map集合

java.util.Map : 用于存储成对对象的集合。具有key(键)-value(值)对映射关系的集合,key不允许重复,但value可以重复,允许null的键或值。

    |--- HashMap:是 Map接口的典型实现类。key不能重复,但是value可以重复;key的实现就是HashSet;value对应着放;允许null的键或值

        |--- LinkedHashMap: 相较于 HashMap 多了链表维护元素的顺序,存储的数据是有序的

    |--- Hashtable: 是线程安全的,不允许null的键或值;

        |--- Properties : key和value都是String类型,用来读配置文件

    |--- TreeMap : 根据 key 拥有自己的排序方式, key就是TreeSet, Key要实现Comparable接口

        |-- 自然排序(Comparable):

        |-- 定制排序(Comparator):

//1. Map的常用方法:添加、删除操作
Object put(Object key,Object value)
Object remove(Object key)
void putAll(Map t)
void clear()

//元素查询的操作:
Object get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
int size()
boolean isEmpty()
boolean equals(Object obj)

//2. Map 的遍历:
Map map = new HashMap();
map.put("AA", 123);
map.put("BB", 456);

Propetities操作属性文件

public void test1() throws FileNotFoundException, IOException{
        //1. 创建 Properties 对象
        Properties props = new Properties();

        //2. 通过 load() 方法加载属性文件
        props.load(new FileInputStream("hello.properties"));

        //3. 通过  getProperty() 方法根据key获取对应的value
        String userName = props.getProperty("username");
        String password = props.getProperty("password");

        System.out.println(userName);
        System.out.println(password);
}

KeySet的遍历

keySet();
//遍历Map的方式一: 获取 Map 中所有的 key   
Set set = map.keySet();

values();
//遍历Map的方式二:获取 Map中所有的 value
Collection coll = map.values();

//遍历Map的方式三: 获取Map中所有的 Entry (是Map 的一个内部类,一个Entry对应着Map中的一个key和一个value)
Set entrySet = map.entrySet();
for(Object obj : entrySet){
    Entry entry = (Entry)obj;
    Object key = entry.getKey();
    Object value = entry.getValue();
}
Iterator it = entrySet.iterator();
while(it.hasNext()){
    Entry entry = (Entry)it.next();
    Object key = entry.getKey();
    Object value = entry.getValue();
}

为什么使用泛型:若集合中不使用泛型,意味着集合中可以添加任意类型的对象。若需要具体到某一个类型时,需要强制类型转换可能引发 ClassCastException

泛型: Java 中以 "<>" 的形式呈现,<> 中写引用数据类型

           用于限制集合中存放元素的类型










猜你喜欢

转载自blog.csdn.net/qq_23031939/article/details/80784667