Java集合框架 面试问题整理

简介

java集合类是java.util 包中的重要内容。java集合框架包含了大量集合接口以及这些接口的实现类和操做他们的算法。java

java集合框架图

java集合框架图 示例图片

主要提供的数据结构

  • List

又称有序的Collection。它按照对象的进入顺序保存对象,能够对列表中的每一个元素的出入和删除元素位置进行精确的控制。同时,它能够保存重复的对象。 LinkedList、ArrayList、Vector都实现了List接口。算法

  • Set

Set 是数学意义上的集合。集合中元素不可重复。所以存入set的每一个元素都必须经过equals()方法来肯定对象的惟一性。 Set 接口有两实现类,HashSet和TreeSet其中<u>TreeSet 实现了SrotedSet接口</u>因此TreeSet是有序的。数组

  • Map

Map 提供一个从键映射到值得数据结构。它用于保存键值对,其中值能够重复,可是键必定惟一,不能重复。Java类库中有多个实现该接口的类:HashMap、LinkedHashMap、TreeMap、WeakHashMap、IdentityHashMap。安全

Collection和Collections有什么区别

  • Collection是一个集合的接口。它提供了对集合对象进行基本操做的通用接口方法。实现该类的主要方法有List和Set。
  • Collections是针对集合类的一个包装类,它提供一系列的静态方法以实现对各类集合的搜索、排序、线程安全化等操做。(其中大多数方法都是用来处理线性表)

List

ArrayList,LinkedList和Vector的区别

  • ArrayList和Vector都是由Object[]实现的,LinkedList是由双向链表实现的。
  • Vector是线程安全的,Vector中绝大多数的方法都是直接或者间接同步的。
  • ArrayList每次扩容1.5倍,Vector每次扩容2倍。

Map

HashMap添加的过程

  1. 调用Key的hashCode()方法生成一个hash值h1。 >> + 若是这个h1在HashMap中不存在,那么直接将<key,value>添加到HashMap中。 >> + 若是这个h1已经存在了那么找出HashMap中全部Hash值为h1的key。
  2. 分别调用equals()方法判断当前添加的key是否与已经存在的key值相同 >> 若是相同,说明当前的Key已经存在。HashMap会使用新的value覆盖原有的value。 >> 若是没有相同,说明当前的Key不存在。HashMap会建立新的映射关系。
  3. Hash冲突的解决。(当新增的key的Hash值在HashMap中存在时,就会产生冲突。通常有开放地址法、再Hash法、链地址法等解决Hash冲突问题。 HashMap使用的是链地址法来解决冲突的

HashMap的查找过程

  1. 调用hashCode()方法获取Key的Hash值h,肯定键为Key的全部值存储的首地址。
  2. 若是Key的值有多个,程序会遍历全部结果,并经过调用key的equals()方法来判断key的内容是否相等。只有当equals()方法的返回值为true时,对应的value才是正确值。

HashMap和HashTable的区别

  • 继承的父类不一样:HashTable继承自Dictionary类,而HashMap继承自Abstract Map类可是都二者实现了Map接口数据结构

  • 线程安全性不一样:HashTable 的方法是线程安全的,其中的每一个方法都加入了Synchronized同步。框架

  • 提供的方法不一样:HashMap和HashTable类似度很高,可是也有区别,在HashMap中将contain方法去掉了,改为了containsValue和containsKey。(contains容易形成误解spa

  • key和value是否能够为空值(null):在HashMap中容许且只容许一个key值为null,容许多个value值为null。HashTable中Key和value都不容许为null。线程

  • 遍历方式实现不一样:HashTable和HashMap都是用了迭代器Iterator ^迭代器Iterator
    HashTable中还使用了Enumeration方式。3d

  • Hash值不一样:HashTable直接将对象的HashCode做为Hash值。HashMap则从新计算key的Hash值。code

  • 数组的初始化不一样:HashTable默认为11,扩容为(old*2+1),HashMap 默认为16,扩容为(old*2)

WeakHashMap 和 HashMap 的异同

  • WeakHashMap 和 HashMap相似。两者不一样的地方在于WeakHashMap中的Key采用的是“弱引用”的方式,只要WeakHashMap中的Key再也不被外部引用。它就能够被垃圾回收器回收。
  • 而HashMap采用的是“强引用”的方式。当HashMap中的Key没有被外部引用时,只有在这key从HashMap中被删除以后,才能够被垃圾回收器回收。

HashMap、LinkedHashMap和TreeMap的异同

  • HashMap里面存入的键值对在取出时没有固定的顺序,是随机的。
  • TreeMap实现了SortMap的接口,可以把保存的记录根据键排序。所以取出来的是排序好的键值对。
  • LinkedHashMap 是HashMap的一个子类,若是须要输入和输出顺序相同则使用LinkedHashMap能够实现。(LinkedHashMap还能够按照读取顺序排序)

HashMap 上下文中,同步指的是什么?

同步意味着,在同一时刻中只有一个线程能够修改Hash表,任何线程在执行HashTable的更新操做前都要获取对象锁,其余线程则等待线程锁的释放。

如何实现HashMap的同步?

HashMap以使用

Map m = Collections.synchronizedMap(new HashMap());

来达到同步的效果。

相关文章
相关标签/搜索