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方法
  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值