Java后台研发-面试攻略-集合类

今天公司面试了一个小伙,工作经验3年,Java开发岗,因为没啥面试官的经验就把自己找工作时候的面试题拎出来问了问,明显感觉小伙准备不足,很多面试宝典常见的问题都答不上来。好记性不如烂笔头,自己也记下来吧万一哪天用得上。那么就以JDK1.8为例进行总结吧。

1. ArrayList和LinkedList的联系和区别

ArrayList和LinkedList

联系:

ArrayList与LinkedList都实现了List接口,List接口又继承自Collection接口。两者都不是线程安全的。

区别:

1. 内部实现:ArrayList是基于动态数组的数据结构;LinkedList是基于链表的数据结构

2. 随机访问:ArrayList存取操作时间复杂度为O(1);LinkedList存取需要遍历链表,时间复杂度为O(n)

3. 增删操作:ArrayList增删需要移动数组,时间复杂度为O(n);LinkedList只需要移动指针,时间复杂度为O(1)

深入理解:
深入理解-ArrayList源码解读

2. HashMap和Hashtable的联系和区别

HashMap

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable

Hashtable

public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable

联系:

两者都实现了Map接口

区别:

  1. HashMap是非线程安全的,Hashtable是线程安全的
  2. HashMap继承自AbstractMap类,Hashtable继承自Hashtable类
  3. HashMap是支持null键和null值的,HashTable在遇到null时,会抛出NullPointerException异常
  4. 可以看到HashTable默认的初始大小为11,之后每次扩充为原来的2n+1;HashMap默认的初始化大小为16,之后每次扩充为原来的2倍

3. HashMap和ConcurrentHashMap的联系和区别

HashMap和ConcurrentHashMap的比较是Java面试中频度非常高的问题,个人认为有必要对两者进行深入理解,尤其是ConcurrentHashMap数据结构设计非常巧妙

深入理解-HashMap源码解读
深入理解-ConcurrentHashMap源码解读

联系:

都是键值对数据结构

区别:

  1. 底层实现不同
  2. HashMap是非线程安全的,ConcurrentHashMap是线程安全的
  3. 所在包不同,HashMap在java.util包中,ConcurrentHashMap在java.util.concurrent包中

4. List和Set的联系和区别

List和Set是最常用的集合类,也是面试中的常见问题。List常用的实现类有ArrayList、LinkedList和Vector;Set常用的实现类有HashSet、LinkedHashSet以及TreeSet

image.png

联系:

两者都是接口,并且都继承自Collection接口

区别:

  1. List中允许有重复的元素,Set中元素是唯一的。元素是否唯一通过对象的equals判断
  2. List可以通过索引来操作元素,Set不能通过索引
  3. List会按照插入元素的顺序排序,Set不能保证元素顺序

5. HashSet和TreeSet的联系和区别

联系:

两者都是Set接口的实现类

区别:

  1. HashSet中元素是无序的,TreeSet可以自然排序或者自定义排序
  2. 内部实现不同,HashSet底层是哈希表实现的,TreeSet底层是二叉树,是SortedSet的唯一实现类
  3. HashSet可以放入null,TreeSet元素不能为null

6. HashSet和LinkedHashSet

联系:

LinkedHashSet继承自HashSet

区别:

HashSet内部是通过HashMap实现的,LinkedHashSet内部使用的是LinkHashMap。这样做的意义是LinkedHashSet中的元素顺序是可以保证的,也就是说遍历序和插入序是一致的。

HashSet如何保证元素可以参考 深入理解-HashSet源码解读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 4,451评论 1 14
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • 最近被诗和远方冲昏了头脑,脑袋里装的全部是各种学习学习学习还是学习,自己的脑袋一下子绷的紧紧的,像是塞满了什么东西...
    沛沛美牙阅读 142评论 0 0
  • 江南小巷。 湿湿滑滑的石板小路,瘦高的民居,粉墙黛瓦上积满了墨绿的苔藓,墙头上不时伸出一两枝石榴,翠绿的密叶间挂着...
    隼浮阅读 1,103评论 6 14
  • 稻盛和夫·商界中的哲学家,1959年创办京瓷公司,创新性地提出了ECOSYS理念,开发京瓷a-Si非晶硅高光鼓并运...
    hiElena阅读 661评论 0 1