常见Java集合介绍(面试向)

1.常用的List接口的实现类和Set接口的实现类的继承关系图

在这里插入图片描述

2.ArrayList,LinkedList与Vector

LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储。
ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储

ArrayList list = new ArrayList();
jdk7:底层创建了长度是10的Object[]数组elementData。如果添加导致底层elementData数组容量不够,则扩容。默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
jdk8:底层Object[] elementData初始化为{}.并没创建长度为10的数组。list.add(123),第一次调用add()时,底层才创建了长度为10的数组,并将数据123添加到elementData[0]。后续的添加和扩容操作与jdk 7 无异。

Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储。jdk7和jdk8中通过Vector()构造器创建对象时,底层都创建了长度为10的数组。在扩容方面,默认扩容为原来的数组长度的2倍

3.HashSet,LinkedHashSet与TreeSet

HashSet底层就是基于 HashMap 实现的。(HashSet 的 源码⾮常⾮常少,因为除了 clone() 、writeObject() 、readObject()是HashSet⾃⼰不得不实现之外,其他⽅法都是直接调⽤HashMap中的⽅法。)

调用add()方法向HashSet中添加元素时,底层将添加的元素作为key,HashSet类中定义的全局常量Object作为value值放入HashSet在内部定义的HashMap中。
在这里插入图片描述
LinkedHashMap:作为HashSet子类;遍历其内部数据时,可以按照添加的顺序遍历。对于频繁的遍历操作,LinkedHashSet效率高于HashSet。

TreeSet底层就是基于 TreeMap 实现的。可以照添加对象的指定属性,进行排序。两种排序方式:自然排序(实现Comparable接口 和 定制排序(Comparator)。

1.自然排序中,比较两个对象是否相同的标准为:compareTo()返回0。不再是equals()。
2.定制排序中,比较两个对象是否相同的标准为:compare()返回0。不再是equals()。

常用方法:
floor(E e) 方法返回在这个集合中小于或者等于给定元素的最大元素,如果不存在这样的元素,返回null。
ceiling(E e) 方法返回在这个集合中大于或者等于给定元素的最小元素,如果不存在这样的元素,返回null。

4.Map接口

  1. HashMap
    jdk7及之前:在实例化以后,底层创建了长度是16一维数组Entry[] tablemap.put(key1,value1)调用key1所在类的hashCode()计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。当面临哈希冲突,即两个Entry数组的存放位置相同时,使用链表将两个Entry连接起来。
    jdk8:new HashMap():底层并没有创建一个长度为16的数组。jdk 8底层的数组是:Node[],而非Entry[]。首次调用put()方法时,底层创建长度为16的数组。默认加载因子:0.75。之后每次扩充,容量变为原来的2倍。相⽐于之前的版本, JDK1.8之后在解决哈希冲突时有了较大的变化,当链表⻓度⼤于阈值(默认为8)时,将链表转化为红⿊树,以减少搜索时间。

  2. LinkedHashMap:继承于HashMap。能够保证在遍历map元素时,可以照添加的顺序实现遍历。原因:在原的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。

  3. TreeMap:TreeMap的底层是由节点Entry组成的红黑树

  4. HashTable:作为古老的实现类;线程安全的,效率低;不能存储null的key和value。
    在这里插入图片描述

  5. ConcurrentHashMap
    JDK1.7及以前:
    首先将数据分为⼀段⼀段的存储,然后给每⼀段数据配⼀把锁,当⼀个线程占⽤锁访问其中⼀个段数据时,其他段的数据也能被其他线程访问。
    ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。
    Segment实现了ReentrantLock,所以Segment是⼀种可重⼊锁,扮演锁的⻆⾊。HashEntry⽤于存储键值对数据。
    在这里插入图片描述
    JDK1.8:
    ConcurrentHashMap取消了Segment分段锁,采⽤CASsynchronized来保证并发安全。数据结构跟 HashMap1.8的结构类似,数组+链表/红⿊⼆叉树。Java 8在链表⻓度超过⼀定阈值(8)时将链表(寻 址时间复杂度为O(N))转换为红⿊树(寻址时间复杂度为O(log(N)))。在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44998067/article/details/115416450