八股训练营第 27 天 | Java的集合类有哪些,那些是线程安全的,那些是线程不安全的?ArrayList 和 Array 有什么区别、ArrayList 和 LinkedList 的区别是什么?

Java集合类及线程安全性详解

Java的集合类有哪些,那些是线程安全的,那些是线程不安全的?

Java 的集合类由 Collections 和 Map 这两个接口派生而出,Collections 接口又派生出了 List、Set、Queue 这三个接口。Java 所有的集合类都是 List、Set、Queue、Map 这四个接口的实现类。

  • List:有序集合,允许重复元素。常见实现类包括 ArrayList 和 LinkedList。
  • Set:无序集合,不允许重复元素。常见实现类包括 HashSet、TreeSet 和 LinkedHashSet。
  • Queue:队列。常见实现类包括 LinkedList 和 PriorityQueue。
  • Map:无序键值对的集合,不允许重复的 key。常见实现类包括 HashMap、TreeMap 和 LinkedHashMap。

线程不安全的集合有:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap 等。

线程安全的集合有:

  • Vector:线程安全的列表。但加了锁效率不高。
  • HashTable:线程安全的哈希表。也是加了锁效率不高。
  • ConcurrentHashMap:线程安全的哈希表。通过分段锁实现,性能好。
  • Collections.synchronizedList、Collections.synchronizedSet、Collections.synchronizedMap:将线程不安全的集合包装成线程安全的集合,也是通过加锁实现的,效率较低。

ArrayList 和 Array 有什么区别?ArrayList 和 LinkedList 的区别是什么?

ArrayList 和 Array 区别:

  1. ArrayList 是动态数组,长度可以变化;Array 长度固定。
  2. ArrayList 可以自动扩容,支持元素的增加和删除;Array 没有这些功能。
  3. Array 既可以使用基本数据类型,也可以使用对象;ArrayList 只能使用对象。对于基本数据类型,需要将其转换为包装类型。

ArrayList 和 LinkedList 区别:

  1. ArrayList 是基于动态数组实现的;而 LinkedList 是基于双向链表实现的。
  2. ArrayList 查询元素的时间复杂度是 O(1),因为其内部是数组,可以直接根据索引查找元素,速度快;LinkedList 查询元素的时间复杂度是 O(n),因为需要从链表头部开始遍历。
  3. ArrayList 在尾部添加和删除元素的时间复杂度是 O(1),但在其他位置由于需要移动后面的元素,时间复杂度是 O(n);LinkedList 添加和删除元素只需要改变节点的引用,速度优于 ArrayList。
  4. ArrayList 有自动扩容机制,这个过程涉及新数组的创建和旧数组内容的复制,会存在一定的开销;LinkedList 没有。

ArrayList 扩容机制?

  1. ArrayList 是基于动态数组实现的。当创建一个新的 ArrayList 对象时,其内部数组默认初始容量一般为 10。
  2. 当添加元素导致元素个数要超过数组容量时,就会触发扩容机制。
  3. 首先确定扩容之后的数组容量。一般是原数组容量的 1.5 倍。这是通过 ArrayList 的 grow 方法实现的,将原数组容量右移一位再加上原数组,正好等于 1.5 倍。
  4. 然后新建一个扩容后容量的新数组,将原数组的数据逐个拷贝到新数组中。这是通过 Arrays.copyOf() 方法实现的。
  5. 拷贝完成后,将 ArrayList 内部的数组引用指向新数组。这样就完成了一次扩容。随后可以继续进行增加元素操作。

以上就是我对这个问题的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值