1.ArrayList和LinkedList的区别
- 数据结构不同
ArrayList是基于动态数组,LinkedList是基于链表
- 效率不同
ArrayList查询和更新效率高;
LinkedList增加和删除效率高;
- 自由性不同
ArrayList自由性较低,但是使用比较方便;
LinkedList自由性较高,但是它不便于使用。
- 主要控件开销不同
LinkedList的主要控件开销比ArrayList的大。
2.HashMap和HashTable的区别
- 两者父类不同
HashMap继承AbstractMap类,HashTable继承Dictionary类。
- 对外提供的接口不同
HashTable比HashMap多提供了elments()和contains()两个方法。
- 对null的支持不同
HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性;可以有多个key值对应的value为null;
HashTable:key和value都不能为null。
- 安全性不同
HashMap线程不安全,多线程并发环境下,可能会产生死锁,但是效率高。
HashTable线程安全,但是效率低。
3.Collection和Collections的区别
Collection | Collections |
---|---|
集合类的上级接口,子接口有Set,List。 | 是一个工具类,有很多静态方法,用于实现对各种集合的排序,搜索,线程安全化等操作。 |
4.泛型
“泛型” 意味着编写的代码可以被不同类型的对象所重用。
5.List,Set,Map三者的区别
接口类型 | 特点 |
---|---|
List | 有序可重复 |
Set | 无序不可重复 |
Map | 使用键值对存储 |
6.HashMap的底层存储原理
-
HashMap继承自
AbstractMap
。 -
该集合的数据结构:
JDK1.8之前
,采用的是数组+链表
;JDK1.8之后
,采用的是数组+链表+红黑树
。引入红黑树的目的是为了提高查询效率。 -
JDK1.8之前,当创建了一个HashMap对象,构造方法底层会默认创建一个长度为16的Entry数组,用来存储键值对数据;JDK1.8之后是在第一次调用put方法时创建一个Node数组用来存储。
-
存储时会先调用key的hashcode()方法计算出值,再结合数组长度采用某种算法计算出向Node数组中存储数据的空间的索引值,若该索引代表的空间没有数据,则直接将键值对存储到该索引代表的空间中。当计算出的索引相同时,此时该空间已有数据,那么底层就会比较两个key的hash值是否一致,如果不一致,则在该空间上划出一个结点来存储键值对数据,这种方式称为拉链法。若索引相同,hash(比如重地,通话)值也相同,就会发生哈希碰撞,然后底层会调用equals方法比较key的内容是否相等,若相等,则其value后值覆盖前值,若不相等,则划出一个结点来存储数据。
-
当链表长度>8且数组长度>64,将链表转换为红黑树(平衡二叉树的一种),只满足链表长度>8,并不会转换为红黑树,而是对数组进行扩容,一般是先扩容为原来容量的2倍,再将原有的数据复制过来。