美文网首页
List、Set和Map

List、Set和Map

作者: pluss | 来源:发表于2018-06-01 20:28 被阅读0次

    java 常用集合list与Set、Map区别及适用场景总结
    Java中容器[Collection(List,Set,Queue),Map],迭代器(Iterator)和比较器(Comparator)及列表排序

    关于 Java Collections 的几个常见问题


    • List,Set都是继承自Collection接口,Map则不是
      List特点:元素有放入顺序,元素可重复
      Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉

    • Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。

    • ArrayList
      动态数组
      初始化若容量为0,默认建一个容量为10的数组
      超过容量扩容1.5倍。oldCapacity+(oldCapacity>>1)
      只序列化有元素的数据

    • Vector
      线程安全的ArrayList
      多数public方法都是sychronized
      capacityIncrement 扩展因子,扩容 → 原+(扩展因子>0?扩展因子:原)

    • LinkedList
      双向链表
      get(int index)看index离中间距离判断正序找还是倒序找。


    • HashSet
      不允许存储重复元素,无序
      用hashMap实现,key是存放的数据,value统一是PRESENT
      允许一个null的key
    private static final Object PRESENT = new Object();
    
    • TreeSet
      自动排序
      红黑树,不允许null

    • TreeMap
      红黑树
      适用于按自然顺序或自定义顺序遍历键(key)。

    • HashTable
      线程安全的HashMap,用synchronize,性能低
      key不允许为null,因为它对key直接hashcode(),为null会抛异常。
      value也不允许为null

        public synchronized V put(K key, V value) {
            // Make sure the value is not null
            if (value == null) {//value为null抛异常
                throw new NullPointerException();
            }
    
            // Makes sure the key is not already in the hashtable.
            Entry<?,?> tab[] = table;
            int hash = key.hashCode();//key为null抛异常
            int index = (hash & 0x7FFFFFFF) % tab.length;
            @SuppressWarnings("unchecked")
            Entry<K,V> entry = (Entry<K,V>)tab[index];
            for(; entry != null ; entry = entry.next) {
                if ((entry.hash == hash) && entry.key.equals(key)) {
                    V old = entry.value;
                    entry.value = value;
                    return old;
                }
            }
    
            addEntry(hash, key, value, index);
            return null;
        }
    

    作为hashmap的key的类必须重写hashcode方法,包装类都重写了hashcode方法?

    • Arrays.asList()
    1. 该方法对于基本数据类型的数组支持并不好,当数组是基本数据类型时不建议使用
    2. 当使用asList()方法时,数组就和列表链接在一起了。当更新其中之一时,另一个将自动获得更新。因为asList获得的List实际引用的就是数组 注意:仅仅针对对象数组类型,基本数据类型数组不具备该特性。
    3. asList得到的数组是的没有add和remove方法的。因为asList返回的List是Arrays中的内部类,而该类并没有定义add和remove方法。
    • 边遍历边删除的正确做法是用iterator的remove方法,而不是直接用list的remove方法

    相关文章

      网友评论

          本文标题:List、Set和Map

          本文链接:https://www.haomeiwen.com/subject/xznksftx.html