Java - 集合、Map 相关
集合相关
List、Set、Map的区别
类型 | 描述 |
List | 允许重复对象,可插入多个null元素,有序 |
Set | 不允许重复对象,只允许一个null元素,无序 |
Map | 不是collection的子接口或实现类,是一个接口,每个元素都是entry,一个键一个值 |
Vector、ArrayList、LinkedList的区别
类型 | 描述 |
Vector | 动态数组,安全,扩容提高1倍 |
ArrayList | 动态数组,不安全,扩容增加50%,初始容量10 |
LinkedList | 双向链表,不安全,不需要调整容易 |
Vector:动态数组,安全,扩容提高1倍
ArrayList:动态数组,不安全,扩容增加50%,初始容量10
LinkedList:双向链表,不安全,不需要调整容易
TreeSet为什么有序
实现了SortedSet接口,还是通过 Comparator 或者 Comparable 维护了一个排序顺序
HashMap方面
HashMap的内部数据结构
底层使用哈希表(链表( O(n) )+数组),若链表长度过长会转成红黑树实现(O(logn))
HashMap小知识点
知识点 | 答案 |
HashMap初始容量 | 16 |
HashMap扩容增量 | 原容量的1倍(2的平方) |
HashMap调整容量大小的值 | 需要调整容量大小的指定值=当前容量*负载因子 |
HashMap如何保证随机性 | 通过key的hashCode值,调用hash函数 |
HashMap的容量为什么是2的倍数 | 因为hash算法的原因,为了最大随机性,让key的hashcode去决定索引值 |
HashMap的容量为什么是2的倍数 | hash算法的原因,为了最大随机性,让key的hashcode去决定索引值 |
HashCode的作用 | 确定对象在哈希表的索引位置 |
什么是Hash碰撞? | 当不同key通过hash算法定位键值对存储位置时,两个key会定位到相同位置 |
如何解决Hash碰撞? | 链地址(拉链法)法(即链表形式) |
HashMap为什么线程不安全 | Hashmap没有实现锁的机制,1.5之后提供了ConcurrentHashMap高效的线程安全类 |
HashMap线程不安全的表现 | 会出现更新丢失,存储了B put的值,但是丢失了A put的值 |
HashTable、HashMap、TreeMap、LinkedHashMap的区别
类型 | 底层数据结构 | 是否同步 | others |
HashTable | 哈希表 | Yep | 不支持null键和null值,无序 |
HashMap | 哈希表 | Yep | 支持null键和null值,无序 |
TreeMap | 红黑树 | No | 通过Comparator或实现Comparable接口对键的顺序关系决定有序 |
LinkedHashMap | 双向链表 | No | 遍历顺序决定有序 |