常用集合类的数据结构

177 阅读1分钟

集合体系

  • Collection

    • List(有序集;线程安全的是CopyOnWriteArrayList

      • ArrayList

        • 底层结构是数组transient Object[] elementData;,适合获取元素。

        • 扩容时变成原来的1.5倍。int newCapacity = oldCapacity + (oldCapacity >> 1);

        • 默认初始长度为0。 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

        • 第一次扩容小于10会直接扩容到10。

          if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
          	return Math.max(DEFAULT_CAPACITY, minCapacity);
          }
          
        • 实现了RandomAccess接口,使用for循环比使用Iterator遍历效率高。

      • LinkedList

        • 底层结构是双向链表,适合增删元素。
        • 使用for循环遍历LinkedList效率低。
    • Set(不能包含重复的元素;线程安全的是CopyOnWriteArraySet

      • HashSet
        • 内部维护一个HashMap变量。 private transient HashMap<E,Object> map;
        • 通过元素的hashCode方法和equals方法来确定元素是否重复。
      • LinkedHashSet
        • 底层结构是数组 + 单 / 红黑树 + 双链表。
        • 元素保持插入顺序。
      • TreeSet
        • 内部维护一个TreeMap变量。
        • 元素可以排序。
  • Map(键值对,键不能重复;keySet()、values()和entrySet()返回的是视图,即不具有独立的数据;线程安全的是ConcurrentHashMapHashTableConcurrentHashMap加锁粒度更细)

    • HashMap

      • 底层结构是数组 + 单链表 / 红黑树。
      • 默认负载因子是0.75。static final float DEFAULT_LOAD_FACTOR = 0.75f;
      • 容量是2的幂。
      static final int tableSizeFor(int cap) {
      	int n = cap - 1;
      	n |= n >>> 1;
      	n |= n >>> 2;
      	n |= n >>> 4;
      	n |= n >>> 8;
      	n |= n >>> 16;
      	return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
      }
      
    • LinkedHashMap

      • 底层结构是数组 + 单链表 / 红黑树 + 双链表。
      • 元素保持插入顺序。
    • TreeMap

      • 底层结构是红黑树。
      • 元素可以排序。