JAVA面试常见问题之常见集合篇

1、List和Set区别

  • List
    1.可以允许重复的对象
    2.可以插入多个null元素
    3.有序容器
  • Set
    1.不允许重复对象
    2.只能插入一个null元素
    3.无序容器,可以通过TreeSet实现有序

2、Set和hashCode以及equals方法的联系

 set集合中存放的数据有一个特点,那就是无序且不重复。无序是因为set集合中的元素没有下标,不重复的原因就是set集合中有hashcode和equals这两个方法。

3、List和Map的区别

  • 结构:List是单列结构,Map是双列结构。
  • 重复性:List为可重复,Map为双列集合(key-value),key不可以重复。
  • 有序性:List为有序集合,Map的key是无序的。

4、ArrayList和LinkedList的区别

  • 数据结构:ArrayList基于动态数组的数据结构,LinkedList基于链表的数据结构。
  • 操作性:ArrayList查询快,增删慢;LinkedList查询慢,增删快。

5、ArrayList与Vector的区别

  • 同步性:Vector线程安全,用synchronized实现线程安全。ArrayList线程不安全。
  • 数据容量增长:二者都有一个初始容量大小,采用线性连续存储空间,当存储的元素的个数超过了容量时,就需要增加二者的存储空间,Vector增长原来的一倍,ArrayList增加原来的0.5倍。

6、HashMap 和 Hashtable 的区别

  • 继承不同父类:Hashtable继承自Dictionary,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
  • 线程安全:Hashtable线程安全,HashMap线程不安全。
  • 是否提供contains方法:HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
  • key和value的是否可以为null值:Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

7、HashSet和HashMap的区别

HashMap HashSet
HashMap实现了Map接口 HashSet实现了Set接口
HashMap储存键值对 HashSet仅仅存储对象
使用put()方法将元素放入map中 使用add()方法将元素放入set中
HashMap中使用键对象来计算hashcode值 HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一的键来获取对象 HashSet较HashMap来说比较慢

8、HashMap 和 ConcurrentHashMap 的区别

  • 线程安全性:HashMap线程不安全,ConcurrentHashMap线程安全。
  • ConcurrentHashMap特性:性能与安全性兼得。加入分段锁的概念,相当于一个大集合,根据hashcode值分成多个hashtable,根据key.hashCode()来决定把key放到哪个HashTable中。

9、HashMap 的工作原理及代码实现,什么时候用到红黑树

  • 工作原理:通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况(当键值对的数量大于容量(capacity)*负载因子(load factor 默认值0.75)时)自动调整容量(超过Load Facotr则resize为原来的2倍)。获 取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。
  • 代码实现:参考 http://www.cnblogs.com/mzc-blogs/p/5800084.html, 也可以直接查看源码
  • 什么时候用到红黑树:当链表(bucket)的数量大于8时,后面的使用红黑树。使用红黑树增加检索的速度。

10、多线程情况下HashMap死循环的问题

  • 原因:HashMap是采用链表解决Hash冲突,因为是链表结构,那么就很容易形成闭合的链路(原因:多线程操作时,可能会有两个或以上的线程同时触发rehash--重新计算hash值--操作,容易造成闭合的链路),这样在循环的时候只要有线程对这个HashMap进行get操作就会产生死循环。
  • 解决思路:用ConcurrentMap代替HashMap

11、HashMap出现Hash DOS攻击的问题

  • 原因

12、ConcurrentHashMap 的工作原理及代码实现,如何统计所有的元素个数

  • ConcurrentHashMap工作原理:容器中有多把锁,每一把锁锁一段数据,这样在多线程访问时不同段的数据时,就不会存在锁竞争了,这样便可以有效地提高并发效率。这就是ConcurrentHashMap所采用的"分段锁"思想。
  • 代码实现:参考https://www.cnblogs.com/chengxiao/p/6842045.html 或查看源码
  • 如何统计所有的元素个数:size()

13、手写简单的HashMap

参考: https://blog.csdn.net/lishaoran369/article/details/61920036

posted @ 2020-09-21 21:33  JW_Chen9596  阅读(74)  评论(0)    收藏  举报