Java中List,Set,Map区别
在Java开发面试中,面试官最常问到的就是Java集合,免不了要让面试者说出之间的区别,下面博主就对其做了总结。
1、集合与数组的区别
- 长度区别:数组是固定长度,集合长度可变;
- 内容区别:数组可以是基本类型,也可以是引用类型;集合只能是引用类型;
- 元素内容:数组只能存储同一种类型;集合可以存储不同类型;
2、List接口,Set接口是Collection接口的子接口
List一共有三个实现类:ArrayList,Vector,LinkedList
ArrayList 和 LinkedList,Vector (数组实现,线程同步)都是继承了AbstractList类,实现了List接口的容器类,用于存储一系列的对象引用。
List有序,可重复
ArrayList | LinkedList | Vector | |
---|---|---|---|
底层结构 | 动态有序数组 | 双向循环链表 | 有序数组 |
操作速度 | 查询快,增删慢,效率高 | 查询慢,增删快,效率高 | 查询快,增删慢,效率低 |
线程是否安全 | 线程不安全 | 线程不安全 | 线程安全,效率低 |
容量不足时 | 当前容量*1.5+1 | 默认扩展一倍容量 | |
是否可重复 | 排列有序,可重复 | 排列有序,可重复 | 排列有序,可重复 |
使用场景 | 查询多,插入、删除较少 | 查询少,插入、删除较多 |
3、HashSet(Hash表)和TreeSet继承了AbstractSet类,实现了Set接口,LinkedHashSet继承了HashSet类,实现了Set接口
Set无序,唯一
HashSet | TreeSet | LinkedHashSet | |
---|---|---|---|
底层原理结构 | Hash表(无序,唯一) | 红黑树(有序,唯一) | 链表和哈希表 (FIFO插入有序,唯一) |
保证元素唯一性的方法 | 依赖两个方法:hashCode(), equals() | 自然排序,比较排序(有序) 根据比较返回值是否是0(唯一) | 链表保证元素有序 哈希表保证元素唯一 |
存取速度 | 快 | 排序存储 | Hash表存储,并用双向链表记录插入顺序 |
是否可重复 | 排列无序,不可重复 | 排列有序,不可重复 | |
内部结构 | HashMap | TreeMap,SortedSet | LinkedHashMap |
HashSet存储元素的顺序是按照哈希值来存的,也是按照哈希值取得,元素的哈希值是通过元素的hashcode方法来获取,HashSet首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals方法,如果equals结果为true,HashSet就视为同一个元素,否则不是同一个元素。
4、TreeMap和HashMap继承了AbstractMap类,实现了Map接口,HashTable实现了Map接口,TreeMap实现了SortedMap接口
HashMap | TreeMap | HashTable | |
---|---|---|---|
是否有序 | 无序 | 有序 | 无序 |
(K,V)是否可重复 | K不可重复,V可重复 | K不可重复,V可重复 | K不可重复,V可重复 |
底层原理 | 哈希表 | 红黑树 | 哈希表 |
线程是否安全 | 不安全 | 不安全 | 安全 |
(K,V)是否可允许为空 | K允许,V允许 | K不允许,V不允许 | |
方法是否同步 | 方法不同步 | 方法同步 |