Java面试题之List,Set和Map集合总结大全
Posted 程序员超时空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面试题之List,Set和Map集合总结大全相关的知识,希望对你有一定的参考价值。
常见集合总结
ps:总结不易,转载请注明出处 —Mr.Song
----| Iterable
----------------| Collection 【描述所有集合共性的接口】
-------------------------------| List接口 【有序,可以重复,有角标的集合】
-------------------------------------------> ArrayList 【】
-------------------------------------------> LinkedList 【】
-------------------------------| Set接口 【无序,不可以重复的集合】
-------------------------------------------> HashSet 【线程不安全,存取速度快,底层是hash实现】
-------------------------------------------> TreeSet 【红黑树数据结构,默认对元素自然排序】
----------------| Map 【存储键值对的容器接口,不允许重复】
-------------------------------| HashMap【使用hash映射存储元素】
-------------------------------| TreeMap 【基于红黑树的Map】
ArrayList
- 底层:可变数组
- 源码解析
ArrayList底层维护了一个Object类型的数组elementData。
当创建对象的时候,如果不指定容量,则默认初始化elementData数组容量为0(jdk1.8)
如果指定容量,则初始化elementData数组容量为指定的capacity
当添加元素的时候,首先判断是否需要扩容,如果不需要,则直接赋值到对应的位置,若需要,
则先扩容再赋值,
如果是第一次添加&需要扩容,则扩容为10
如果其他次添加&需要扩容,则扩容1.5倍 - 初始容量:jdk7—>10,jdk8—>0
LinkedList
- 底层:双向链表
- 源码分析: LinkedList里面维护了两个节点Node类型变量first和last,分别指向首节点和尾节点
当每次添加元素的时候,需要先将新元素封装成一个Node对象,里面维护了prev和
next属性,分别指向前一个节点和后一个节点。并且将prev属性指向原来尾节点last
如果是第一次添加,则LinkedList中的first和last都指向新对象
如果其他次添加,则需要将LinkedList中的last指向新对象。
HashSet
- 底层:哈希表
- 解析:hashSet实现了Set接口,底层采用的是hash表,实际上采用的是一个HashMap的实例,在HashSet中,所有的元素都是存储到HashMap键值对的key上面,而value有一个统一的值,new Object(),这里借鉴一个HashSet深度剖析
https://blog.csdn.net/sugar_rainbow/article/details/68257208 - 其它:hashSet不存入相同的元素是因为,重写了hashCode()和equals()
TreeSet
- 底层:红黑树,可以实现元素的自然排序和定制排序
- 解析:treeSet底层是用TreeMap实现的,构造方法中会创建一个TreeMap的实例,用于存放元素。添加元素时,需要先判断当前有无比较器,如果有,则根据比较器的比较规则进行排序,如果没有,则根据元素本身的特性进行排序。借鉴深度剖析https://blog.csdn.net/dch9210/article/details/50951690
HashMap
- 底层:jdk7:数组+链表
jdk8: 数组+链表+红黑树 - 解析:jdk8:
HashMap中维护了Node类型的数组table,初始为null,(jdk7数组类型为Entry,初始为16)
1.创建对象时,将加载因子loadFactor初始化为0.75,其它成员保持默认值
2.添加元素时,相当于putVal方法,需要先将元素的key哈希值取出来,并且运算得出在数组中存放索引。
如果该索引处没有其它元素,那么可以直接存放。
如果该索引处有其它元素,则需要先判断是否相等,如果相等,则覆盖,否则,继续判断,是否为树结构或者链表结构,根据不同的结构进行不同的处理。
3.如果需要扩容,则进行相应的扩容。
如果第一次添加,则扩容table的capacity为16,临界值threshold为12
如果其他次扩容,则扩容table的capacity为2倍,临界值threshold为2倍。
4.当链表中节点数>=7 && capacity >=64,则将链表变成树结构
TreeMap
- 底层:红黑树,可以实现对添加元素的key进行自然排序或者定制排序
- 解析:TreeMap基于红黑树实现,该树总处于平衡之中。
方式一:自然排序
要求:添加 元素的key的类型,必须实现Comparable接口,并实现compareTo方法
方式二:定制排序
要求:构建TreeMap对象时,必须传入Comparator的比较器,并且实现compare方法
以上是关于Java面试题之List,Set和Map集合总结大全的主要内容,如果未能解决你的问题,请参考以下文章
容器集合(集合的进阶,Collection,List,Set,Map,Map集合的综合使用--斗地主案列,并发修改异常,列表迭代器,Java面试中几个集合面试题)