集合

集合

#属性说明

  • 默认容量 / DEFAULT_CAPACITY

  • 负载因子 / Factor

    扩容门槛 / Threshold == 当前容量 * 负载因子

  • 扩容容量

  • 链表转红黑树的阈值/ TREEIFY_THRESHOLD

#Collection子类

默认容量 负载因子 扩容门槛 扩容容量
ArrayList / 静态链表 10 1 10 右移一位,扩容原来的一半
Vector/ 静态链表 10 1 10 右移一位,扩容原来的一半
HashSet/ 数组 + 链表 + 红黑树 16 0.75 12 同HashMap

注意点:

  1. set允许存储一个null

  2. 以上除了Vector线程安全以外, 其余线程都不安全

但是要用如下方法替代Vector

  • Collections.synchronizeList()
  • CopyOnWriterList<>()

同理Set

  • Collections.synchronizeSet()
  • CopyOnWriterSet<>()
  1. Arrays.asList()

    • 返回的是该工具类的内部类, 没有add()remove()方法

      如果调用就会报出java.lang.UnsupportedOperationException

    • 该方法不能传入基本类型的数组, 但是可以传入Object类型的数组

       Integer[] a = {1,2,3,4}; //有效
       int[] b = {1,2,3,4}; //无效
      

      参数是一个可变参数, 打印会调用该内部类的toString()方法

  2. 对集合遍历时不能添加和删除

    遍历时调用ItrcheckForComodification(),会检查modCountexceptedModCount,而exceptedModCount的值就是modeCount, 如果两者不同, 就会抛出异常, 但是add或是remove时会修改modCount

#Map

map不属于Collection子类, 但是同属于java.util包下

默认容量 负载因子 扩容门槛 扩容容量 转红黑树
HashMap/ 数组 + 链表 + 红黑树 16 0.75 12 原来的一倍 8

先按照hash值找到需要存储的位置, 然后通过对应key, 找到value

链表中元素超过8, 转为红黑树

数组用于存储Entry(对应原码中table, 包含键值对)

存储时通过Key的hash值找到对应table上的位置, 将Entry键入

HashMap线程不安全, 使用如下方法替代

  • Collections.synchronizeMap()

  • ConCurrentHashMap<>()

#LinkedList

#LinkedHashMap

HashMap比较, LinkedHashMap使用链表存储Entry

  • HashMap

    使用iterator遍历时有序, 而HashMap无序

        Map<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("name1", "josan1");
        hashMap.put("name2", "josan2");
        hashMap.put("name3", "josan3");
        Set<Map.Entry<String, String>> set = hashMap.entrySet();
        Iterator<Map.Entry<String, String>> iterator = set.iterator();
        while(iterator.hasNext()) {
            Map.Entry entry = iterator.next();
            String key = (String) entry.getKey();
            String value = (String) entry.getValue();
            System.out.println("key:" + key + ",value:" + value);
        }

结果:

key:name3,value:josan3
key:name2,value:josan2
key:name1,value:josan1
  • 普通for或是forEach, 实质上还是iterator
        Map<String, Object> map = new HashMap<>();
        map.put("1",1);
        map.put("张三",2);
        map.put("3",3);
        map.put("打发",4);
        map.put("5",5);
        map.put("李四",6);
        for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {
            System.out.println(stringObjectEntry);
        }

结果:

1=1
李四=6
张三=2
打发=4
3=3
5=5

原文地址:https://www.cnblogs.com/kikochz/p/13307360.html