Java面试题系列(二)——Java集合

2021-05-22  本文已影响0人  嗨吖呀

1. Collection 和 Collections

2. 常用的集合

image.png
Collection 接口的接口对象的集合(单列集合) 
├——List 接口:元素按进入先后有序保存,可重复 
│     ├ LinkedList 接口实现类,链表,插入删除,没有同步,线程不安全 
│     ├ ArrayList 接口实现类,数组, 随机访问,没有同步,线程不安全 (Collections.synchronizedList(new ArrayList<>());copyOnWriteArrayList是线程安全的)
│     └ Vector 接口实现类 数组,同步,线程安全
│         └ Stack 是Vector类的实现类 
└——Set 接口:仅接收一次,不可重复,并做内部排序 
│     └HashSet 使用hash表(数组)存储元素 
│         └ LinkedHashSet 链表维护元素的插入次序 
└ —————TreeSet 底层实现为二叉树,元素排好序

Map 接口键值对的集合 (双列集合) 
├———Hashtable 接口实现类,同步,线程安全 
├———HashMap 接口实现类,没有同步,线程不安全 
│         ├ LinkedHashMap 双向链表和哈希表实现 
│         └ WeakHashMap 
├ ——–TreeMap 红黑树对所有的key进行排序 
└———IdentifyHashMap
image.png

3. ArrayList扩容机制

4. 数组(Array)和列表(ArrayList)的区别

5. HashSet如何保证元素唯一性

  HashSet集合的底层数据结构是哈希表。哈希表的存储依赖两个方法:hashCode()和equals()。首先判断对象的hashCode()哈希值是否相同:

6. 为什么重写equals还要重写hashcode?

  equals()方法来自object对象,默认比较的是对象的引用是否指向同一块内存地址,重写的目的是为了比较两个对象的value值是否相等。
  如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode。
为了保证这种一致性,必须满足以下两个条件:

7. map的分类和常见的情况

java.util.Map:它有四个实现类,分别是HashMap、Hashtable、LinkedHashMap 和TreeMap.

8. HashMap

9. Hashmap扩容原理

  e.hash & oldCap,就是用于计算位置b到底是0还是1用的,只要其结果是0,则新散列下标就等于原散列下标,否则新散列坐标要在原散列坐标的基础上加上原table长度。


image.png

10. Hashmap拓展问题

11. ConcurrentHashMap

1)HashEntry中value,以及next(链表)都是 volatile 修饰的,保证了获取时的可见性。
2)原理上来说:ConcurrentHashMap 采用了分段锁技术,其中 Segment 继承于 ReentrantLock。不会像HashTable那样不管是 put 还是 get 操作都需要做同步处理,理论上 ConcurrentHashMap 支持 CurrencyLevel (Segment 数组数量,默认为16)的线程并发。每当一个线程占用锁访问一个 Segment 时,不会影响到其他的 Segment。

12. 线程安全的Map

13. HashMap和Hashtable 的区别

JDK 1.8 中 HashMap 和 Hashtable 主要区别如下:

14. TreeMap底层实现

15. HashMap和TreeMap

16. Java中集合遍历的方式

17. Iterator和ListIterator的区别

  迭代器定义:Iterator提供了统一遍历操作集合元素的统一接口, Collection接口实现Iterable接口,每个集合都通过实现Iterable接口中iterator()方法返回Iterator接口的实例, 然后对集合的元素进行迭代操作.

18. 快速失败(fail-fast)和安全失败(fail-safe)的区别

19. 为什么集合类没有实现Cloneable和Serializable接口?

  克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。

上一篇 下一篇

猜你喜欢

热点阅读