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 区别:
- ArrayList 是动态数组,长度可以变化;Array 长度固定。
- ArrayList 可以自动扩容,支持元素的增加和删除;Array 没有这些功能。
- Array 既可以使用基本数据类型,也可以使用对象;ArrayList 只能使用对象。对于基本数据类型,需要将其转换为包装类型。
ArrayList 和 LinkedList 区别:
- ArrayList 是基于动态数组实现的;而 LinkedList 是基于双向链表实现的。
- ArrayList 查询元素的时间复杂度是 O(1),因为其内部是数组,可以直接根据索引查找元素,速度快;LinkedList 查询元素的时间复杂度是 O(n),因为需要从链表头部开始遍历。
- ArrayList 在尾部添加和删除元素的时间复杂度是 O(1),但在其他位置由于需要移动后面的元素,时间复杂度是 O(n);LinkedList 添加和删除元素只需要改变节点的引用,速度优于 ArrayList。
- ArrayList 有自动扩容机制,这个过程涉及新数组的创建和旧数组内容的复制,会存在一定的开销;LinkedList 没有。
ArrayList 扩容机制?
- ArrayList 是基于动态数组实现的。当创建一个新的 ArrayList 对象时,其内部数组默认初始容量一般为 10。
- 当添加元素导致元素个数要超过数组容量时,就会触发扩容机制。
- 首先确定扩容之后的数组容量。一般是原数组容量的 1.5 倍。这是通过 ArrayList 的 grow 方法实现的,将原数组容量右移一位再加上原数组,正好等于 1.5 倍。
- 然后新建一个扩容后容量的新数组,将原数组的数据逐个拷贝到新数组中。这是通过 Arrays.copyOf() 方法实现的。
- 拷贝完成后,将 ArrayList 内部的数组引用指向新数组。这样就完成了一次扩容。随后可以继续进行增加元素操作。
以上就是我对这个问题的理解。
Java集合类及线程安全性详解
1858

被折叠的 条评论
为什么被折叠?



