zoukankan      html  css  js  c++  java
  • 集合

    集合

    #属性说明

    • 默认容量 / 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
    
    
  • 相关阅读:
    JCTF 2014(Reverse)
    JCTF 2014(Misc)
    实验吧CTF题库-密码学(部分)
    第四章 Jinja2模版
    第三章 URL与视图
    flask学习导航主页
    flask调试模式
    rontab踩坑(三):crontab定时任务调度机制与系统时间/时区的不一致
    crontab踩坑(二):Unit crond.service could not be found.
    crontab踩坑(一)
  • 原文地址:https://www.cnblogs.com/kikochz/p/13307360.html
Copyright © 2011-2022 走看看