Java集合原理

1. List

名称 特点 get(index) add(E) add(index, E) remove(E)
ArrayList 高效,线程不安全 O(1) O(1) O(n) O(n)
LinkedList 删除更高效,查询低效 O(n) O(1) O(n) O(1)
Vector 低效,线程安全 O(1) O(1) O(n) O(n)

ArrayList

  1. 底层是数组
  2. 默认装Object
  3. 初始为10,(Jdk8之后默认添加数据的时候才开始给默认长度)。
  4. 每次扩容是原长度的一半(取整):第一次扩到15,第二次22
  5. 扩容方式:Arrays.copyOf,默认把原数组复制到新数组
  6. 不是线程安全的
  7. 手写一个Demo证明ArrayList是线程不安全的
public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    for(int i = 0; i < 30; i++){
        new Thread(() -> {
            list.add(UUID.randomUUID().toString().substring(0, 8));
            System.out.println(list);
        }, String.valueOf(i)).start();
    }
}

2. Set

名称 特点 add(E) remove(E) contains(E)
HashSet 线程不安全,可存储null值 O(1) O(1) O(1)
LinkedHashSet 查询时有序 (存储还是无序) O(log n) O(log n) O(log n)
TreeSet 可根据指定值排序(基于红黑树) O(1) O(1) O(1)

HashSet

  1. 底层是Map,初始大小为16

  2. 添加过程

在这里插入图片描述

3. Map

名称 特点 get(key) put(key)
HashMap 线程不安全,高效 O(1)~O(log n) O(1)
LinkedHashMap 查询时有序 (存储还是无序) O(1)~O(log n) O(1)
TreeMap 可根据指定值排序(取决于Compare返回值) O(log n) O(1)
Hashtable 线程安全,低效 O(1)~O(log n) O(1)
Properties 键值对都是String类型 O(1)~O(log n) O(1)

HashMap

  1. 底层:数组 + 链表 + 红黑树
  2. 首次添加操作创建数组,长度16,存的是一维数组Entry[]
  3. 扩容:超过临界值(Capacity * Load Factory),则扩容为原来2倍,并将元数据复制过来。
  4. 添加过程
    在这里插入图片描述
发布了89 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42103026/article/details/104236082