- 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线程不同步
- Array 和 ArrayList 有何区别?
。Array可以含有基本数据类型和引用类型,ArrayList只能包括引用类型
。Array的大小是固定的,ArrayList大小可以动态增加
。ArrayList对数据的处理方法比Array多,ArrayList为Array的加强版
。Array的元素数据类型一样,ArrayList在未指定泛型的前提下数据类型可以多样
。实际开发中Array不常用,主要用于确定元素个数的场景中。多用ArrayList