Java集合框架

概况

Collection

List

ArrayList

  1. ArrayList由数组实现数据存储
  2. ArrayLisst基本等同于Vector,但是ArrayList线程不安全,多线程不推荐使用

ArrayList无参构造

ArrayList list = new ArrayList();
  for (int i = 0; i < 10; i++) {
  list.add(i);
}
list.add(11);

  1. 如果是无参构造,刚开始ArrayList是一个空数组
  2. 第一次扩容,初始大小为10


3. 以后扩容,按照1.5倍扩容

int newCapacity = oldCapacity + (oldCapacity >> 1);

ArrayList有参构造

 ArrayList list = new ArrayList(8);
for (int i = 0; i < 10; i++) {
  list.add(i);
  }
list.add(11);

  1. 以指定的长度初始化
  2. 扩容直接按照1.5倍扩容

Vector

  1. Vector底层是一个数组
  2. Vector是线程安全的,但是效率慢

Vector无参构造

Vector vector = new Vector();
 for (int i = 0; i < 10; i++) {
  vector.add(i);
}
vector.add(11);

  1. 无参构造直接调用有参构造,并且初始值为10
  2. 按照2倍扩容

Vector有参构造

 Vector vector = new Vector(6);
for (int i = 0; i < 6; i++) {
  vector.add(i);
}
vector.add(11);

  1. 按照指定的长度初始化数组
  2. 按2倍扩容

LinkedList

  1. 底层是一个双向链表
  2. 可重复添加元素、可添加任意元素
  3. 线程不安全
  4. 增加、删除效率高

LinkedList添加元素

LinkedList linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);

LinkedList删除元素

 LinkedList linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
linkedList.remove(0);

Set

HashSet

  1. HashSet底层是一个HashMap,第一次添加数据,table数组扩容到16
  2. 如果table数组到了临界值 16 * 0.75 =》12,会扩容到32,新的临界值即为24,以此类推
  3. 每添加一个node,size都会++
  4. 在Java8中,如果一条链表的元素到达8个,并且 table的大小大于等于64,就会转化为红黑树
HashSet hashSet = new HashSet();
hashSet.add("java");
hashSet.add("python");
hashSet.add("java");

LinkedHashSet

  1. 底层是一个LinkedHashMap,维护了一个hash表和双向链表
  2. 每个结点都有before和after
  3. 遍历LinkedHashSet是有序的
  4. 底层原理和HashSet相同

TreeSet

  1. 底层是一个TreeMap
  2. 构造函数传入的比较器赋给了 TreeMap 的comparator
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}
private final Comparator<? super K> comparator;
public TreeMap(Comparator<? super K> comparator) {
  this.comparator = comparator;
}
  1. 排序规则
 Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            do {
                parent = t;
                cmp = cpr.compare(key, t.key);
                if (cmp < 0)
                    t = t.left;
                else if (cmp > 0)
                    t = t.right;
                else
                    return t.setValue(value);
            } while (t != null);
        }

Map

HashMap

  1. 以键值对形式存储
  2. 线程不安全
  3. 如果添加相同的key,会覆盖之前的值
  4. 为了方便遍历,有一个EntrySet存放HashMap$Node的引入地址
  5. 底层原理同上HashSet

Hashtable

  1. 以键值对形式存储
  2. 线程不安全
  3. key和value都不能为null
  4. 扩容:int newCapacity = (oldCapacity << 1) + 1; => oldCapacity * 2 +1
  5. 初始化大小为11
public Hashtable() {
  this(11, 0.75f);
}

TreeMap

同TreeSet

posted @ 2021-01-14 11:54  翻蹄亮掌一皮鞋  阅读(75)  评论(0)    收藏  举报