java集合体系

20 阅读3分钟

List, Set, Queue和Map是Java集合框架中的四个主要接口,它们用于存储和操作数据。以下是他们的总介绍,他们分别有各自适用于不同场景的实现类。 

 List 是一个有序的集合,可以包含重复元素。 

 Set 是一个不允许包含重复元素的无序集合。 

 Queue 是一个先进先出(FIFO)的集合,常用于任务调度等场景。 

 Map 是一个键值对的集合,每个键只能对应一个值。

数据结构:

       数组:一块连续的内存空间,可通过连续内存地址查找上一个下一个。

       链表:不连续内存空间,每个单元存储自身信息和上下一个的单元的内存地址。

       哈希表:开辟一块数组空间,将需存储的value值通过函数映射得到一个key值,将这个                           value存到内存地址为key的地方去。查找快,增删快,但无序。空间利用率不                         高。数组很多地方空着。

有/无序集合:集合的有序无序是指在插入的时候,保持插入的顺序性,先插入的放在集合前面,后插入的放在集合后面。

线程安全性:即多线程增删改查时,是否结果可能跟预期不一致。可使用synchronized等方式进行修正。

List的常见实现类:

ArrayList:在内部使用数组来存储元素,有序集合,非线程安全,如果在多个线程同时修改ArrayList时,需要进行外部同步或使用线程安全的替代类,如CopyOnWriteArrayList。

LinkedList 内部使用双向链表来存储元素,适用于需要频繁进行插入和删除操作的场景,特别是在实现队列和栈时。

vector:是一个动态数组(类似于ArrayList)的线程安全版本。与ArrayList相比,Vector具有额外的同步机制,可以在多线程环境中安全地使用。现已被CopyOnWriteArrayList替代。

Stack: 实现了"后进先出"(Last-In-First-Out,LIFO)的数据结构,继承自Vector类,因此具有Vector的所有特性,在不需要线程安全操作的情况下,可以考虑使用ArrayDeque代替Stack。

CopyOnWriteArrayList: arraylist的线程安全版本,写操作会创建新的副本,因此在多个线程同时进行写操作时,不会发生数据不一致的情况。最终输出的列表中包含了所有写线程添加的元素。

set的常见实现类:

Set 接口是 Collection 容器的一种实现,它用于存储不重复的元素集合,提供了添加、删除、遍历等基本操作。 与 List 接口不同的是,Set 接口不允许存储重复的元素,因此它可以用来去重。 在 Set 接口中,元素的存储顺序是无序的,因为它是通过哈希表来实现的。 

HashSet 最常用的 Set 实现类之一,它是通过哈希表来实现的。 

LinkedHashSet 是 HashSet 的一个子类,它继承了 HashSet 的功能,并且增加了维护插入顺序的特性。LinkedHashSet 内部维护了一个双向链表,用来维护插入顺序。由于 LinkedHashSet 需要维护一个链表,因此在插入和删除元素时,会比 HashSet 慢一些。 

TreeSet 是另一个常用的 元素有序的Set 实现类,它是基于红黑树(一种自平衡的二叉查找树)来实现的。

Map的常见实现类

Map集合是一种以键值对形式存储和操作数据的数据结构。

HashMap:基于哈希表实现,提供快速的键值查找和插入操作。不保证键值对的顺序

LinkedHashMap:基于哈希表和双向链表实现,保留插入顺序或访问顺序(可以通过构造函数参数指定)。

TreeMap:基于红黑树实现,按照键的自然顺序或者指定的比较器进行排序。