• HashMap 和 Hashtable 有什么区别?

。HashMap为线程不安全,Hashtable线程安全

。HashMap允许使用null作为key或value,Hashtable不允许

。Hashtable使用Enumeration遍历,HashMap没有专门的迭代器,但是可以通过遍历key的集合或者entry对,也可以使用java8的函数接口进行遍历

  • 如何决定使用 HashMap 还是 TreeMap?

。HashMap为无序集合,TreeMap为有序集合

。HashMap底层存储结构为数组,TreeMap为红黑树

。数据量大且需要按照key排序时,使用TreeMap

。数据量小且对顺序无要求时,使用HashMap

  • 若查找操作占大部分时,使用HashMap,插入删除大部分时使用TreeMap

。说一下 HashMap 的实现原理?

。HashMap底层封装了一个Entry数组,元素位置基于Object类的hashCode函数计算

。当出现哈希冲突时,采用拉链法解决冲突

。当前数组达到阈值时,触发扩容

  • 相关成员属性

1,HashMap是JAVA集合框架的一个存储key-value对的实现类,有关于扩容机制的成员属 性主要有三个

2,默认值为16的capicity

3,默认值为0.75的loadFactory

4,默认值为0的size

  • 触发时机

1,插入元素时

  • 实现

1,JDK 1.7

(1)传入newCapicity参数

(2)新建newCapicity长度的Entry数组

(3)将原数组元素重新hash放入新数组

(4)将原有数组引用指向新数组

2,JDK 1.8之后

1,如果节点的链表元素个数大于8时,原有的数组链表会转换成数组红黑树的逻辑结构 进行使用

2,如果当前size大于loadFactory*capicity的阈值,触发扩容机制

(1)新建一个newCap的int变量,大小为2*oldCapicity

(2)新建一个大小为newCap的数组

(3)原数组元素索引进行2次幂的计算放入新数组

(4)将newCap赋值给原有的capicity

(5)返回新数组

  • 说一下 HashSet 的实现原理?

。HashSet底层为HashMap,方法几乎都是调用HashMap相关方法实现

  • ArrayList 和 LinkedList 的区别是什么?

。ArrayList底层实现为数组,当数组元素个数达到数组长度时,数组将进行动态扩容

。LinkedList底层实现为链表,原则上不存在元素个数饱和的情况

。ArrayList常用于随机访问场景

。在添加删除场景中,ArrayList主要耗时为System.arrayCopy,Linked

。List则是通过for循环寻找插入位置。

。数据量小于30,两者没有明显差别,当数据量大于容量1/10时,LinkedList的效率没有A rrayList高

。在元素个数大致相等的情况下,两者遍历的性能差不多


  • 如何实现数组和 List 之间的转换?

。List转Array

  •  调用List成员方法toArray
  • for循环生成Array

。Array转List

  •  调用Arrays类方法asList
  •  for循环生成

  • ArrayList 和 Vector 的区别是什么?

。Vector为jdk1.0的集合类,内部通过数组实现,支持Enumeration遍历

。ArrayList为1.2的集合类,内部通过数组实现,支持Iterator遍历

。Vector线程同步,ArrayList线程不同步

。内存不足时,Vector默认扩展1倍,ArrayList默认扩展1.5倍

  • Array 和 ArrayList 有何区别?

。Array可以含有基本数据类型和引用类型,ArrayList只能包括引用类型

。Array的大小是固定的,ArrayList大小可以动态增加

。ArrayList对数据的处理方法比Array多,ArrayList为Array的加强版

。Array的元素数据类型一样,ArrayList在未指定泛型的前提下数据类型可以多样

。实际开发中Array不常用,主要用于确定元素个数的场景中。多用ArrayList