聊聊List、Set、Map

1. List哪些实现类

Java List一共三个实现类分别是ArrayList、Vector和LinkedList。

(1) ArrayList是最常见用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已有数组的数据复制到新的存储空间中。当ArrayList的中间位置需要插入或删除元素的时候,需要对数组进行移动、赋值,代价比较高。因此他适合随机读和遍历,不适合添加和删除元素。扩容过程:初始大小为空数组,当插入数据后,初始容量为10,当容量不够时会扩容50%,如果扩容后还是不够则直接扩容至所需的最小容量大小,扩容后通过Arrays.copyOf()将原数组复制到新数组。

(2) Vector和ArrayList一样是通过数组实现的,不同的是它支持线程的同步(是通过synchronized实现的,高并发效率低,会采用并发容器处理高并发场景),但实现同步需要很高的花费,因此他的效率比ArrayList差。扩容过程:初始大小为10,当容量不够时会扩容1倍(当在构造函数中设置了指定扩容大小,则扩容指定大小),如果扩容后还是不够则直接扩容至所需的最小容量大小,扩容后通过Arrays.copyOf()将原数组复制到新数组。

(3) LinkedList是用于链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外它还提供了List接口中没有定义的方法,专门用于操作表头和表尾数据,可以当堆栈、队列和双向对列使用。是一种双向链表,无扩扩容问题。

2. Set哪些实现类

Set实现有HashSet、TreeSet、LinkedHashSet

(1) HashSet是无序的、不可重复的。通过对象的hashCode和equals方法保证对象的唯一性。 HashSet内部的存储结构是哈希表,是线程不安全的。通过HashMap的key来实现不重复和无序效果。

(2) TreeSet对元素进行排序,内部是通过TreeMap 实现。

a. 自然排序,元素实现Comparable接口,并覆盖compareTo方法,>1正序,<1倒序, =0只存储当前第一个对象,Integer、String均已实现了该接口,所以可以直接进行排序。

b. 定制排序,newTreeSet时需要传入Comparator实现接口,并覆盖compare方法,>1正序,<1倒序, =0只存储当前第一个对象

(3) LinkedHashSet是一种有序的Set集合,即其元素的存入和输出的顺序是相同的。内部是通过LinkedHashMap实现,继承HashSet,而且LinkedHashMap是一个双链表结构,节点为LinkedHashMap.Entry继承HashMap的Node。。!!!!!!!!!!!!!!!!!!!!!!!!

3. Map有哪些实现类

(1) HashMap是最常见和使用最广泛的Map实现类。它是基于哈希表(散列表)实现的,通过键的哈希码将键值对映射到数组中的一个位置,从而实现快速的插入、查找和删除操作。HashMap允许null键和null值,并且不保证元素的顺序。

Hash冲突:键(key)经过hash函数得到的结果作为地址去存放当前的键值对(key-value)(hashmap的存值方式),但是却发现该地址已经有值了,就会产生冲突。换句话说就是:如果两个不同对象的hashCode相同,这种现象称为hash冲突。

线程安全:当多线程的情况下,可能产生条件竞争。当重新调整HashMap大小的时候,确实存在条件竞争,如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的数组位置的时候,HashMap并不会将元素放在LinkedList的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了

(2) TreeMap是基于红黑树实现的,它可以保持键的有序性。在TreeMap中,键按照自然顺序或指定的比较器进行排序,因此可以通过键的范围进行查找操作。TreeMap的插入、删除和查找操作的时间复杂度是O(log n),其中n是元素的数量。

(3) LinkedHashMap继承自HashMap,在HashMap的基础上增加了一个双向链表,使得键值对保持插入的顺序。因此,遍历LinkedHashMap时可以按照插入顺序或者访问顺序(最近访问的在前)进行。LinkedHashMap保持了插入顺序的特性,但相比于HashMap可能稍微增加了一些额外的空间和性能开销。

(4) ConcurrentHashMap,用于高并发场景

posted @ 2023-07-25 18:27  yifanSJ  阅读(60)  评论(0编辑  收藏  举报