Java面试准备——Java集合

Java集合

本文学习自GitHub上的JavaGuide项目,感谢大佬的资源,此处为自我学习与整理,原项目链接 JavaGuide

List, Set, Map三者的区别?

  1. List(注重顺序):List接口存储一组有序的,可存在duplicate的对象。(可以有多个元素引用相同的对象)
  2. Set(注重独一无二):不存在duplicate,不允许重复的集合。
  3. Map(key索引):键值对存储,Map会维护与Key关联的Value,两个Key可以有相同的Value,但是Key是不能有duplicate的。

ArrayList与LinkedList

  1. 线程安全性:两者都不具备线程安全性,非同步。
  2. 底层数据结构:ArrayList底层使用Object数组,LinkedList底层使用双向链表。
  3. 插入的时间复杂度:因为ArrayList是数组,所以插入的时间复杂度和插入位置有关,LinkedList由于是链表,add(E e)方法时间复杂度近似为O(1),但是插入到具体位置需要遍历,时间复杂度近似为O(n)。
  4. 内存空间对比:ArrayList末尾会预留一部分的容量空间,造成空间浪费,LinkedList由于是双向链表,所以每一个元素占用的内存大于ArrayList。

ArrayList与Vector

最大的区别就是线程安全。Vector花费大量时间实现线程同步安全,所以在单线程建议使用ArrayList提高效率,考虑线程安全的情况下使用Vector。

HashSet如何检查重复

  1. 当新加入对象到HashSet中时,首先会计算对象的hashcode来判断插入位置。如果当前hashcode没有duplicate,则直接加入。如果已存在相同的hashcode值,则调用equals()方法来判断对象是否相等,如果相等,不加入,如果不相等,加入一个新的位置。
  2. hashCode()与equals():
    (1)如果两个对象equals,那么hashcode也相等
    (2)如果两个对象hashcode相同,并不一定equals
    (3)所以如果equals()被覆盖过,hashCode()也必须被覆盖
    (4)hashCode()默认计算对象在堆上的位置,如果没有重写hashCode(),就算两个对象引用同一数据也不会相等
  3. ==和equals():==比较的是基本数据类型的值或者对象的引用地址,而equals()比较的是对象的值。

HashMap和HashTable

  1. 线程安全:HashMap线程不安全,HashTable线程安全(内部方法都用synchronized修饰)。
  2. 效率:HashMap高于HashTable,HashTable事实上已被淘汰,想要保证线程安全用Java后期产生的ConcurrentHashMap。
  3. 对于空值的容忍性:HashMap可以接受Key为null,有且仅有一个,可以接受Value为null; HashTable不可以接受null值作为Key或者Value。
  4. 初始大小和扩容:HashTable默认初始化大小为11,之后每次扩容变为原先的2n+1;HashMap默认初始化大小为16,每次扩容为2n。如果给定初始大小,HashTable会使用给定的大小,HashMap则会扩充为2的n次幂,这取决于HashMap的TableSizeFor()方法。也就是说HashMap总会使用2的n次幂作为哈希表的大小。
  5. 底层数据结构:Java1.8以后HashMap在解决数据冲突时采用红黑树,当链表长度大于8时使用红黑树结构,使得搜索时间复杂度降低。而HashTable没有这种机制。

HashMap和HashSet

  1. 实现接口:HashMap实现Map接口,HashSet实现Set接口
  2. HashMap存储键值对,HashSet存储对象
  3. HashMap使用Key计算hashcode,HashSet使用成员对象计算hashcode,如果对象hashcode相等,再去判断equals()。

总结

List

  1. ArrayList:Object数组
  2. Vector:Object数组,支持线程安全,但是效率低
  3. LinkedList:双向链表

Set

  1. HashSet:无序,存储对象,唯一性,底层采用HashMap来保存元素
  2. LinkedHashSet:继承于HashSet,内部其实是通过LinkedHashMap实现的。笔者常用这个数据结构来对一组对象去重且排序,关于其内部原理并不是特别了解,只知道它可以对基本数据类型的一组数据进行排序同时去重。
  3. TreeSet:有序,唯一,红黑树(自平衡的排序二叉树)

Map

  1. HashMap:JDK1.8之前HashMap使用数组+链表的底层结构,1.8之后当链表长度大于8时使用红黑树来提高搜索效率。
  2. LinkedHashMap:继承自HashMap,底层也是数组+链表+红黑树,在HashMap的基础上增加了一条双链表,使得上面的结构可以保持键值对的插入顺序,同时通过对链表的相应操作实现了访问顺序的相关逻辑。
  3. TreeMap:红黑树,即自平衡的排序二叉树。
发布了5 篇原创文章 · 获赞 0 · 访问量 1919

猜你喜欢

转载自blog.csdn.net/weixin_40407203/article/details/105190711