• 集合


    集合

    #属性说明

    • 默认容量 / 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
    
    
  • 相关阅读:
    Android 图片文字单位 px、dp、sp区别
    替换Fragment 报错 The specified child already has a parent. You must call removeView() on the child's parent first.
    Android 程序怎么打log
    Android 启动项 Activity
    Actiivity 生命周期
    Oracle 监听/数据库 启动/关闭
    【HDU-2049】不容易系列之(4)——考新郎
    Linux内存子系统——Locking Pages(内存锁定)
    command三国杀开发日记20200915
    command三国杀开发日记20200914
  • 原文地址:https://www.cnblogs.com/kikochz/p/13307360.html
Copyright © 2020-2023  润新知