集合框架学习(21.2.8)

集合

集合框架图

集合框架图

集合与数组的区别:

数组:长度固定,可以存放基本类型和引用类型

集合:长度不固定,只能存放引用类型。因此需要包装类将基本类型包装,int变Integer

Collection父接口

Collection:无序,无下标,不能重复

1. 创建 Collection collection = new ArrayList();

2. 删除 collection.remove(); collection.clear(); collection.removeAll()
        remove:删除一个
        clear:全部删除
        removeAll:作差,例如A.removeAll(B),A中重复元素均删除
3. 遍历元素(重点)

   	3.1使用增强for(因为无下标)

	for(Object object : collection){
    
     }

	3.2使用迭代器

        //haNext(); 有没有下一个元素
        //next(); 获取下一个元素
        //remove(); 删除当前元素
        Iterator it = collection.iterator();
        while(it.hasNext()){
    
    
          String object = (String)it.next(); //强转
          // 可以使用it.remove(); 进行移除元素
          // collection.remove(); 不能用collection其他方法 会报并发修改异常
        }
4. 判断 collection.contains(); collection.isEmpty();      

List子接口

有序,有下标,元素可重复

        List list = new ArrayList();
        list.add(0);
        list.add("hhh");
        list.add(new int[]{
    
    5,6,7});
        for(int i=0; i<list.size(); i++){
    
    
            System.out.println(list.get(i));
        }

        List<Integer> integers = new ArrayList<>();
        integers.add(8);
        integers.add(9);
        integers.add(15);
        for(Integer it : integers){
    
    
            System.out.println(it);
        }
        Iterator<Integer> iterator1 = integers.iterator();//迭代器
        while (iterator1.hasNext()){
    
    
            Integer next = iterator1.next();
            System.out.println(next);
        }
        ListIterator<Integer> iterator = integers.listIterator();//列表迭代器,可以从后往前
        while (iterator.hasNext()){
    
    
            System.out.println(iterator.next());
        }
        while (iterator.hasPrevious()){
    
    
            System.out.println(iterator.previous());
        }
        List subList = list.subList(1,3); //返回子集合,左闭右开,返回1,2

List实现类

ArrayList

数组实现,连续空间,查询快,增删慢

线程不安全

源码分析:默认容量为10,每次扩容是之前的1.5倍

Vector

与ArrayList大体一致,除了:

线程安全,一次只有一个线程用Vector,因此速度比ArrayList慢

每次扩容是之前的2倍

		Vector<String> strings = new Vector<>();
        strings.add("kkk");
        strings.add("ppp");
        strings.add("fdfsfs");
        for(String str : strings){
    
    
            System.out.println(str);
        }
        strings.remove(2);
        Iterator<String> iterator = strings.iterator();
        while (iterator.hasNext()){
    
    
            System.out.println(iterator.next());
        }

LinkedList

链表实现,非连续空间,查询慢,增删块

Set集合

无序,无下标,元素不能重复,全部继承自Collection类

HashSet

存储结构:哈希表

1.8之前是数组+链表

1.8之后是数组+链表+红黑树 (HashSet是一个HashMap的实例)

HashSet:内部的数据结构是哈希表,是线程不安全的。

HashSet中保证集合中元素是唯一的方法:通过对象的hashCode和equals方法来完成对象唯一性的判断。

如果对象的hashCode值不同,则不用判断equals方法,就直接存到HashSet中。

如果对象的hashCode值相同,需要用equals方法进行比较,如果结果为true,则视为相同元素,不存,如果结果为false,视为不同元素,进行存储。

注意:如果元素要存储到HashCode中,必须覆盖hashCode方法和equals方法。

HashSet<Integer> integers = new HashSet<>();
        integers.add(1);
        integers.add(2);
        integers.add(3);
        integers.add(4);

        for(Integer tmp : integers){
    
    
            System.out.println(tmp);
        }

TreeSet

使用红黑树

TreeSet:可以对Set集合中的元素进行排序,是线程不安全的。

TreeSet中判断元素唯一性的方法是:根据比较方法的返回结果是否为0,如果是0,则是相同元素,不存,如果不是0,则是不同元素,存储。

TreeSet对元素进行排序的方式:

元素自身具备比较功能,即自然排序,需要实现Comparable接口,并覆盖其compareTo方法。

元素自身不具备比较功能,则需要实现Comparator接口,并覆盖其compare方法。

TreeSet<Integer> integers = new TreeSet<>(new Comparator<Integer>() {
    
    
            @Override
            public int compare(Integer o1, Integer o2) {
    
    
                return o2 - o1;
            }
        });
        integers.add(5);
        integers.add(9);
        integers.add(7);
        integers.add(1);
        for(Integer tmp : integers){
    
    
            System.out.println(tmp);
        }

Map接口

具有键值对Key-Value

键:无序,无下标,不能重复

值:无序,无下标,可以重复

Map<Integer, Integer> hashMap = new HashMap<>();
        hashMap.put(56, 65);
        hashMap.put(89, 89);
        hashMap.put(56, 100); //替换第一个

        Set<Integer> set = hashMap.keySet();
        for(Integer key : set){
    
    
            System.out.println(hashMap.get(key));
        }

        Set<Map.Entry<Integer, Integer>> set1 = hashMap.entrySet();
        for(Map.Entry<Integer, Integer> entry : set1){
    
    
            System.out.println(entry.getKey() + "\t" + entry.getValue());
        }

HashMap

1.8之前是数组+链表

1.8之后是数组+链表+红黑树

  1. 刚创建时,table是null,添加第一个元素后,容量为16

  2. 当元素个数大于阈值(16*0.75),会扩容,大小×2,减少树的高度

  3. 链表长度>8,数组元素个数>=64,调整为红黑树

  4. 链表长度< 6,调整为链表

  5. 1.8之前为头插入,之后为尾插入

HashTable

线程安全,运行效率慢,不允许null作为key或者value

Properties

hashtable的子类,要求key和value都是string,用于配置文件读取

TreeMap

实现了SortedMap接口(是map的子接口),可以对key自动排序

猜你喜欢

转载自blog.csdn.net/qq_40033947/article/details/113758664