Java面试题集合

1.Java的HashMap是如何工做的?

HashMap是一个针对数据结构的键值,每一个键都会有相应的值,关键是识别这样的值。面试

HashMap 基于 hashing 原理,咱们经过 put ()和 get ()方法储存和获取对象。当咱们将键值对传递给 put ()方法时,它调用键对象的 hashCode ()方法来计算 hashcode,让后找到 bucket 位置来储存值对象。当获取对象时,经过键对象的 equals ()方法找到正确的键值对,而后返回值对象。HashMap 使用 LinkedList 来解决碰撞问题,当发生碰撞了,对象将会储存在 LinkedList 的下一个节点中。 HashMap 在每一个 LinkedList 节点中储存键值对对象。算法

2.什么是快速失败的故障安全迭代器?

快速失败的Java迭代器可能会引起ConcurrentModifcationException在底层集合迭代过程当中被修改。故障安全做为发生在实例中的一个副本迭代是不会抛出任何异常的。快速失败的故障安全范例定义了当遭遇故障时系统是如何反应的。例如,用于失败的快速迭代器ArrayList和用于故障安全的迭代器ConcurrentHashMap。数组

3.Java BlockingQueue是什么?

Java BlockingQueue是一个并发集合util包的一部分。BlockingQueue队列是一种支持操做,它等待元素变得可用时来检索,一样等待空间可用时来存储元素。缓存

4.何时使用ConcurrentHashMap?

在问题2中咱们看到ConcurrentHashMap被做为故障安全迭代器的一个实例,它容许完整的并发检索和更新。当有大量的并发更新时,ConcurrentHashMap此时能够被使用。这很是相似于Hashtable,但ConcurrentHashMap不锁定整个表来提供并发,因此从这点上ConcurrentHashMap的性能彷佛更好一些。因此当有大量更新时ConcurrentHashMap应该被使用。安全

5.哪个List实现了最快插入?

LinkedList和ArrayList是另个不一样变量列表的实现。ArrayList的优点在于动态的增加数组,很是适合初始时总长度未知的状况下使用。LinkedList的优点在于在中间位置插入和删除操做,速度是最快的。数据结构

LinkedList实现了List接口,容许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操做使LinkedList可被用做堆栈(stack),队列(queue)或双向队列(deque)。多线程

ArrayList实现了可变大小的数组。它容许全部元素,包括null。 每一个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增长,可是增加算法并无定义。当须要插入大量元素时,在插入前能够调用ensureCapacity方法来增长ArrayList的容量以提升插入效率。并发

6.Iterator和ListIterator的区别

  • ListIterator有add()方法,能够向List中添加对象,而Iterator不能。
  • ListIterator和Iterator都有hasNext()和next()方法,能够实现顺序向后遍历,可是ListIterator有hasPrevious()和previous()方法,能够实现逆向(顺序向前)遍历。Iterator就不能够。
  • ListIterator能够定位当前的索引位置,nextIndex()和previousIndex()能够实现。Iterator没有此功能。
  • 均可实现删除对象,可是ListIterator能够实现对象的修改,set()方法能够实现。Iierator仅能遍历,不能修改。

7.什么是CopyOnWriteArrayList,它与ArrayList有何不一样?

CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中全部可变操做(add、set等等)都是经过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操做要慢一些,由于它须要实例的快照。性能

CopyOnWriteArrayList中写操做须要大面积复制数组,因此性能确定不好,可是读操做由于操做的对象和写操做不是同一个对象,读之间也不须要加锁,读和写之间的同步处理只是在写完后经过一个简单的"="将引用指向新的数组对象上来,这个几乎不须要时间,这样读操做就很快很安全,适合在多线程里使用,绝对不会发生ConcurrentModificationException ,所以CopyOnWriteArrayList适合使用在读操做远远大于写操做的场景里,好比缓存。线程

 

8.迭代器和枚举之间的区别

若是面试官问这个问题,那么他的意图必定是让你区分Iterator不一样于Enumeration的两个方面:

  • Iterator容许移除从底层集合的元素。
  • Iterator的方法名是标准化的。

9.Hashmap如何同步?

当咱们须要一个同步的HashMap时,有两种选择:

  • 使用Collections.synchronizedMap(..)来同步HashMap。
  • 使用ConcurrentHashMap的

这两个选项之间的首选是使用ConcurrentHashMap,这是由于咱们不须要锁定整个对象,以及经过ConcurrentHashMap分区地图来得到锁。

10.IdentityHashMap和HashMap的区别

IdentityHashMap是Map接口的实现。不一样于HashMap的,这里采用参考平等。

  • 在HashMap中若是两个元素是相等的,则key1.equals(key2)
  • 在IdentityHashMap中若是两个元素是相等的,则key1 == key2
相关文章
相关标签/搜索