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集合总结大全的主要内容,如果未能解决你的问题,请参考以下文章

巨人的肩膀JAVA面试总结

阿里巴巴面试题之List集合去重

Java面试题:Java中的集合及其继承关系

容器集合(集合的进阶,Collection,List,Set,Map,Map集合的综合使用--斗地主案列,并发修改异常,列表迭代器,Java面试中几个集合面试题)

java面试_集合框架001_ListSetMap三者的区别_说出ArrayListLinkListVector的区别

[Java复习02] 集合框架Collection - 面试题小结