前言
本文是Java面试复习系列中的Java集合矿建,后面会陆续有该系列其他篇章,并且会一直维护。本系列都为网上资源整理而来,如有问题,及时联系。
Java集合框架
1.ArrayList和LinkList
| ArrayList | LinkList |
---|
线程 | 多线程不安全 | 多线程不安全 |
底层数据结构 | Object数组 | 双链表 |
特点 | 查找 | 插入、删除 |
默认容量 | 10 | |
扩容 | 1.5倍+1 | |
内存占用 | 低 | 高 |
| | |
2.ArrayList和Vector
| ArrayList | Vector |
---|
线程 | 多线程不安全 | 多线程安全 |
同步 | 不同步 | 所有方法都同步 |
容量 | 10 | 10 |
扩容 | 1.5n+1 | 2n |
3.HashMap
- HashMap底层是数组和链表结合在一起使用也就是链表散列。
- 拉链法:将链表和数组结合。数组中每一格就是一个链表。
- Jdk1.8之后,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,减少搜索时间。
- HashMap总是使用2的幂作为哈希表的大小。为了提高效率,需要对hash值进行取模运算,计算方法为“(n - 1) & hash”
4.HashMap和Hashtable
| HashMap | Hashtable |
---|
线程 | 非线程安全 | 线程安全(synchronized) |
效率 | 高 | 低(基本淘汰) |
容量 | 16 | 11 |
扩容 | 2倍 | 2n+1 |
5.HashSet和HashMap区别
HashMap | HashSet(底层基于HashMap) |
---|
实现了Map接口 | 实现Set接口 |
存储键值对 | 存储对象 |
put方法向map添加元素 | add方法向set添加函数 |
使用key计算Hashcode | 使用成员对象计算HashCode |
速度快 | 慢 |
6.总结
| 线程 | 容量 | 扩容 | 底层 |
---|
ArrayList | 多线程不安全 | 10 | 1.5n+1 | 数组 |
LinkList | 多线程不安全 | | | 双链表 |
Vector | 多线程安全 | 10 | 2n | 数组 |
HashMap | 非线程安全 | 16 | 2n | 链表散列 |
HashTable | 线程安全 | 11 | 2n+1 | |
HashSet | 非线程安全 | 16 | 2n | 基于HashMap |
7.List、Map、Set 三个接口,存取元素时,各有什么特点?
- List 以特定次序来持有元素,可有重复元素。
- Set 无法拥有重复元素,内部排序。
- Map 保存 key-value 值,value 可多值。
8.Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()?
- Set 里的元素是不能重复的,用 equals ()方法来区分重复与否。
- 覆盖 equals() 方法用来判断对象的内容是否相同,而“==”判断地址是否相等,用来决定引用值是否指向同一对象。