Java集合分类和特性简介

发布时间:2023年12月17日

目录

1. Map(映射)

HashMap:

LinkedHashMap:

TreeMap:

Hashtable:

ConcurrentHashMap

ConcurrentSkipListMap

2. List(列表)

ArrayList:

LinkedList:

Vector:

3. Set(集合)

HashSet:

LinkedHashSet:

TreeSet:

4. Queue(队列)

PriorityQueue:

5.其他集合类

Arrays:

Collections:


Java集合框架提供了许多接口和类,以下是Java中的主要集合接口和类:

1. Map(映射)

HashMap:

介绍:

基于哈希表实现,提供快速的查找性能。

优点:

查找性能高。

缺点:

不保证元素顺序。

数据结构:

哈希表。

并发情况:

非同步,不适合多线程操作。

LinkedHashMap:

介绍:

LinkedHashMap 是 Java 中的一种哈希表实现,它继承自 HashMap 类,同时使用一个双向链表维护键值对的插入顺序或者访问顺序。具体而言,LinkedHashMap 可以按照元素插入的顺序(插入顺序)或者元素最近访问的顺序(访问顺序)来迭代元素。

优点:

保持插入或访问顺序: LinkedHashMap 可以保持元素插入的顺序或者元素最近访问的顺序,这对于一些需要按照特定顺序遍历元素的场景很有用。

迭代性能较好: 由于内部使用双向链表维护顺序,迭代性能比一般的哈希表实现要好。

缺点:

内存占用相对较高: 由于需要维护双向链表,相对于简单的哈希表,LinkedHashMap 在内存占用上会有一些额外开销。

数据结构:

LinkedHashMap 的数据结构包含两部分:

哈希表(HashMap): 用于存储键值对,提供快速的查找性能。

双向链表: 用于维护元素的插入顺序或者访问顺序。

并发情况:

LinkedHashMap 不是线程安全的,因此在多线程环境下,需要通过外部手段(例如使用 Collections.synchronizedMap 或者使用 java.util.concurrent 包提供的并发容器)来保证线程安全。

LinkedHashMap 适用于需要按照插入顺序或者访问顺序遍历元素的场景,但需要注意在多线程环境下的线程安全性。

TreeMap:

介绍:

TreeMap 是 Java 中的一种有序映射表实现,它基于红黑树(Red-Black Tree)数据结构。红黑树是一种自平衡的二叉搜索树,它保持了插入、删除、查找等操作的较低时间复杂度。

优点:

有序性: TreeMap 中的元素是有序的,可以按照键的自然顺序或者通过提供的比较器进行排序。

自动排序: 由于基于红黑树实现,插入元素时会自动进行排序,无需手动排序操作。

范围查询: TreeMap 提供了一些方法,如 headMap、tailMap 和 subMap,可以用于获取指定范围内的子映射。

缺点:

相对性能: 相对于哈希表实现的集合,如 HashMap,TreeMap 的性能较低。红黑树的维护和平衡操作会导致一些额外的开销。

不允许 null 键: TreeMap 不允许键为 null。如果需要使用 null 作为键,应该使用 HashMap。

数据结构:

TreeMap 的数据结构是基于红黑树的,红黑树是一种二叉搜索树,其中每个节点都带有一个额外的表示节点颜色的位(红或黑),用于确保树在平衡状态下快速进行操作。

并发情况:

TreeMap 不是线程安全的,因此在多线程环境下,需要通过外部手段(例如使用 Collections.synchronizedMap 或者使用 java.util.concurrent 包提供的并发容器)来保证线程安全。

使用示例:

TreeMap<Integer, String> treeMap = new TreeMap<>();

treeMap.put(3, "Three");

treeMap.put(1, "One");

treeMap.put(4, "Four");

treeMap.put(2, "Two");

System.out.println(treeMap);

// Output: {1=One, 2=Two, 3=Three, 4=Four}

在上述示例中,TreeMap 会按照键的自然顺序进行排序。如果要按照自定义的顺序进行排序,可以在构造 TreeMap 时传入比较器。

TreeMap<Integer, String> customOrderTreeMap = new TreeMap<>(Comparator.reverseOrder());

customOrderTreeMap.put(3, "Three");

customOrderTreeMap.put(1, "One");

customOrderTreeMap.put(4, "Four");

customOrderTreeMap.put(2, "Two");

System.out.println(customOrderTreeMap);

// Output: {4=Four, 3=Three, 2=Two, 1=One}

TreeMap 适用于需要有序映射表的场景,其中元素的排序是关键。如果对性能要求较高,且无需有序性,可以考虑使用 HashMap。

Hashtable:

介绍:

早期的实现类,类似HashMap,但是同步的,性能相对较差。

优点:

同步,支持多线程操作。

缺点:

同步影响性能。

不推荐使用,可以使用ConcurrentHashMap代替。

数据结构:

哈希表。

并发情况:

同步,支持多线程操作。

ConcurrentHashMap

介绍:

ConcurrentHashMap 是 Java 中用于高并发环境下的哈希表实现,继承自 AbstractMap,实现了 ConcurrentMap 接口。

优点:

高并发性能:采用分段锁机制,每一把锁只锁住当前操作的段,不影响其他段的操作,提高了并发度。

可扩展性:允许多个线程同时读取,提高了并发读取的性能。

动态扩容:在添加元素时,不需要对整个表进行加锁。

缺点:

写操作相对慢:由于需要维护多个段的一致性,写操作需要较多的开销。

不适用于大规模的并发写操作。

数据结构:

哈希表,采用分段锁机制实现。

并发情况:

适用于高并发场景,支持多线程的读写操作。

ConcurrentSkipListMap

介绍:

ConcurrentSkipListMap 是 Java 中基于跳表(Skip List)实现的有序映射表,实现了 ConcurrentNavigableMap 接口。

优点:

并发性能好:通过跳表的结构,插入、删除、查找等操作的时间复杂度都是 O(log n)。

有序性:元素按照键的自然顺序或者自定义比较器的顺序排列。

可扩展性:支持并发读写,不同部分的数据可以独立操作。

缺点:

相对复杂:相比于 ConcurrentHashMap,实现相对复杂。

内存占用相对较高。

数据结构:

基于跳表实现,通过多层索引提高查询效率。

并发情况:

适用于高并发的有序映射表,支持多线程的读写操作。

总体来说,选择 ConcurrentHashMap 还是 ConcurrentSkipListMap 取决于具体的应用场景和需求。如果对有序性要求较高且并发读写操作较多,可以选择 ConcurrentSkipListMap。如果对无序性的哈希表实现要求高并发读写操作,可以选择 ConcurrentHashMap。

2. List(列表)

ArrayList:

介绍:

基于动态数组实现,支持随机访问和快速插入/删除。

优点:

随机访问快,适合读取操作。

在尾部插入/删除元素较快。

缺点:

插入/删除元素时需要移动其他元素,效率较低。

不适合大量的插入/删除操作。

数据结构:

基于动态数组。

并发情况:

非同步,不适合多线程操作。

LinkedList:

介绍:

基于双向链表实现,特别适合频繁插入/删除操作。

优点:

频繁插入/删除效率高,特别适合在中间插入/删除元素。

迭代时性能较好。

缺点:

随机访问性能差,需要遍历链表。

数据结构:

基于双向链表。

并发情况:

非同步,不适合多线程操作。

Vector:

介绍:

类似ArrayList,但是是同步的,支持多线程操作。

优点:

同步,支持多线程操作。

缺点:

同步会影响性能。

不推荐在高并发场景使用。

数据结构:

基于动态数组。

并发情况:

同步,支持多线程操作。

3. Set(集合)

HashSet:

介绍:

基于哈希表实现,提供快速的查找性能。

优点:

查找性能高。

缺点:

不保证元素顺序。

数据结构:

哈希表。

并发情况:

非同步,不适合多线程操作。

LinkedHashSet:

介绍:

类似HashSet,但保持元素插入顺序。

优点:

保持元素插入顺序。

缺点:

性能略低于HashSet。

数据结构:

哈希表和双向链表。

并发情况:

非同步,不适合多线程操作。

TreeSet:

介绍:

基于红黑树实现,支持有序性。

优点:

有序。

缺点:

相对HashSet性能较低。

不允许null元素。

数据结构:

红黑树。

并发情况:

非同步,不适合多线程操作。

4. Queue(队列)

PriorityQueue:

介绍:

基于优先级堆实现,用于按照自然顺序或者定制顺序提取元素。

优点:

按照优先级提取元素。

缺点:

不适用于并发操作。

数据结构:

堆。

并发情况:

非同步,不适合多线程操作。

5.其他集合类

Arrays:

介绍:

提供了数组操作的各种方法。

优点:

提供了丰富的数组操作方法。

缺点:

不适用于动态数组。

数据结构:

对原生数组的封装。

并发情况:

非同步,不适合多线程操作。

Collections:

介绍:

提供了对集合进行操作的静态方法,如排序、洗牌等。

支持对集合进行不可变的创建。

优点:

提供了丰富的静态方法。

缺点:

不适用于对原始数据类型的集合操作。

数据结构:

不存储元素,是一个工具类。

并发情况:

非同步,不适合多线程操作。

文章来源:https://blog.csdn.net/qq877507054/article/details/135044725
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。