集合
集合
#属性说明
- 
默认容量 / DEFAULT_CAPACITY 
- 
负载因子 / Factor 扩容门槛 / Threshold == 当前容量 * 负载因子 
- 
扩容容量 
- 
链表转红黑树的阈值/ TREEIFY_THRESHOLD 
#Collection子类
| 默认容量 | 负载因子 | 扩容门槛 | 扩容容量 | |
|---|---|---|---|---|
| ArrayList / 静态链表 | 10 | 1 | 10 | 右移一位,扩容原来的一半 | 
| Vector/ 静态链表 | 10 | 1 | 10 | 右移一位,扩容原来的一半 | 
| HashSet/ 数组 + 链表 + 红黑树 | 16 | 0.75 | 12 | 同HashMap | 
注意点:
- 
set允许存储一个null值
- 
以上除了 Vector线程安全以外, 其余线程都不安全
但是要用如下方法替代Vector
- Collections.synchronizeList()
- CopyOnWriterList<>()
同理Set
- Collections.synchronizeSet()
- CopyOnWriterSet<>()
- 
Arrays.asList()- 
返回的是该工具类的内部类, 没有 add()和remove()方法如果调用就会报出 java.lang.UnsupportedOperationException
- 
该方法不能传入基本类型的数组, 但是可以传入 Object类型的数组Integer[] a = {1,2,3,4}; //有效 int[] b = {1,2,3,4}; //无效参数是一个可变参数, 打印会调用该内部类的 toString()方法
 
- 
- 
对集合遍历时不能添加和删除 遍历时调用 Itr的checkForComodification(),会检查modCount和exceptedModCount,而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

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号