面试题总结:Set Map List 的异同点

1.java集合和数组的区别

1.数组大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)

2.JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。

2.JAVA集合主要分为三种类型:

  1. Set(集)
  2. Map(映射)
  3. List(列表)

2.1: Set【无序,不可以重复的集合】

2.1.1:HashSet【线程不安全,存取速度快,底层是hash实现】
  • 底层:哈希表
  • 解析:hashSet实现了Set接口,底层采用的是hash表,实际上采用的是一个HashMap的实例,在HashSet中,所有的元素都是存储到HashMap键值对的key上面,而value有一个统一的值,new Object()

hashSet不存入相同的元素是因为,重写了hashCode()和equals()

2.1.2:TreeSet 【红黑树数据结构,默认对元素自然排序】
  • 底层:红黑树,可以实现元素的自然排序定制排序
  • 解析:TreeSet底层是用TreeMap实现的,构造方法中会创建一个TreeMap的实例,用于存放元素。添加元素时,需要先判断当前有无比较器,如果有,则根据比较器的比较规则进行排序,如果没有,则根据元素本身的特性进行排序。

2.2 Map 【存储键值对的容器接口,不允许重复】

2.2.1 HashMap【使用hash映射存储元素】

HashMap实现原理链接

  • 底层: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,则将链表变成树结构
2.2.2 TreeMap 【基于红黑树的Map】
  • 底层:红黑树,可以实现对添加元素的key进行自然排序或者定制排序
  • 解析:TreeMap基于红黑树实现,该树总处于平衡之中。
    排序实现
    方式一:自然排序
    要求:添加 元素的key的类型,必须实现Comparable接口,并实现compareTo方法
    方式二:定制排序
    要求:构建TreeMap对象时,必须传入Comparator的比较器,并且实现compare方法

2.3List【有序,可以重复,有角标的集合】

2.3.1ArrayList 【顺序数组】
  • 底层:可变数组
  • 源码解析
    ArrayList底层维护了一个Object类型的数组elementData。

当创建对象的时候

如果不指定容量,则默认初始化elementData数组容量为0(jdk1.8)
如果指定容量,则初始化elementData数组容量为指定的capacity

当添加元素的时候
首先判断是否需要扩容
-------如果不需要,则直接赋值到对应的位置,
-------若需要,
      -----则先扩容再赋值,
         ----如果是第一次添加&需要扩容,则扩容为10
         ----如果其他次添加&需要扩容,则扩容1.5倍

2.3.2LinkedList 【链表】
  • 底层:双向链表
  • 源码分析: 、
    LinkedList里面维护了两个节点Node类型变量first和last,分别指向首节点和尾节点

当每次添加元素的时候,需要先将新元素封装成一个Node对象,里面维护了prev和next属性,分别指向前一个节点和后一个节点。并且将prev属性指向原来尾节点last
---------如果是第一次添加,则LinkedList中的first和last都指向新对象
---------如果其他次添加,则需要将LinkedList中的last指向新对象

链接:java基础面试题总结链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值