Java技术面试“小抄”——集合类(实时更新)

写在之前:

这篇文章是自己面试过程中,总结出来的关于Java集合类的总结。每次面试之前来出来看看,速度快,也能很迅速的回忆一些细节问题。发布这篇文章,不仅仅是希望大家“临阵磨枪”,更希望大家能够以此学习其内在原理。毕竟,源码才是最正确的。

问题汇总:

1.ArrayList

  • 实现方式:数组;
  • 超出容量的话,增加50%,使用System.arraycopy()复制到新的数组;
  • 默认容量为10
  • get()和set()性能很高,但是add()/remove()性能差。

2.LinkedList

  • 实现方式:双向循环链表;
  • 没有容量限制;
  • get()和set()性能差,但是add()/remove()性能很快。

3.Vector

  • 与ArrayList类似
  • 线程同步
  • 使用Iterator方式遍历
  • 自动增长原来一倍的数组长度

4.HashMap

  • 实现方式:Entry[]数组实现的哈希桶数组;
  • 初始容量为16,填充因子为0.7,扩容为2倍
  • 用Key的哈希值取模桶数组的大小可得到数组下标;
  • 计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸
  • Entry用一个next属性实现多个Entry以单向链表存放;
  • JDK8里,当一个桶里的Entry超过8后,就不以单向链表而以红黑树来存放以加快Key的查找速度。

5.HashMap和HashTable区别

  • HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。
  • HashTable不允许null值(key和value都不可以) ;HashMap允许null值(key和value都可以)。
  • HashTable有一个contains(Objectvalue)功能和containsValue(Objectvalue)功能一样。
  • HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。
  • HashTable中hash数组默认大小是11,增加的方式是old*2+1HashMap中hash数组的默认大小是16,而且一定是2的指数
  • 哈希值的使用不同,HashTable直接使用对象的hashCode; HashMap重新计算hash值,而且用与代替求模。

6.Collection和Collections的区别

  • java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
  • java.util.Collections 是一个包装。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

7.HashMap为什么容量是2的幂次

  • 详见hashMap为啥初始化容量为2的次幂

8.hashCode和equals方法的关系

  • equals相等,hashcode必相等;hashcode相等,equals可能不相等。

9.Java集合类框架的基本接口

  • Collection:代表一组对象,每一个对象都是他的子元素;
  • Set:不包含重复元素的Collection;
  • List:有序的Collection,可以包含重复元素;
  • Map:将key映射到value的对象,key不能重复。

10.Enumeration接口与Iterator接口的区别

  • Enumeration接口比Iterator速率的2倍
  • Iterator线程比Enumeration安全

你可能感兴趣的:(java)