Java集合框架
1、List、Set、Map的区别
- List: List接口是有序可重复的,常用实现类有ArrayList、LinkedList等
- Set: Set接口是无序不重复的, 常用的实现类有hashSet、TreeSet、LinkedHashSet等
- Map: 使用键值对的存储形式,key不能重复,一般使用String为key,也可以是任何对象类型
2、ArrayList和LinkedList的区别
ArrayList | LinkedList | |
---|---|---|
是否线程安全 | 否 | 否 |
底层数据接口 | Object数组 | 双向链表(1.6之前是循环链表) |
插入和删除元素是否受位置的影响 | 是,数组是线性结构,ArrayList在添加操作时,默认时添加到末尾 | 否,链表不受影响 |
是否支持快速随机访问 | 是,可以通过下标索引快速访问 | 否 |
双向链表和循环链表
- 双向链表:包含两个指针,一个指针prev指向前一个结点,一个指针next指向后一个节点
- 双向循环链表:最后一个节点的next指向头节点的next,头节点的prev指向尾节点的prev构成一个环
3、ArrayList的扩容机制
-
默认初始大小为10,当初始化ArrayList指定了初始容量时则初始容量为指定的
-
当添加的元素数量大于初始容量时,则容量扩充为原来的1.5倍
|
|
| ------------------------------------------------------------ |
4、HashMap 和 Hashtable 的区别
线程是否安全: HashMap 是⾮线程安全的,HashTable 是线程安全的;HashTable 内部的⽅法
基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使⽤ ConcurrentHashMap吧)
效率: 因为线程安全的问题,HashMap 要⽐ HashTable 效率⾼⼀点。另外,HashTable 基本被
淘汰,不要在代码中使⽤它;
对Null key和Null value的⽀持: HashMap 中,null 可以作为键,这样的键只有⼀个,可以有⼀个或多个键所对应的值为 null。但是在 HashTable 中 put 进的键值只要有⼀个 null,直接抛出 NullPointerException。
初始容量⼤⼩和每次扩充容量⼤⼩的不同 : ①创建时如果不指定容量初始值,Hashtable 默认
的初始⼤⼩为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化⼤⼩为16。之后
每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使⽤
你给定的⼤⼩,⽽ HashMap 会将其扩充为2的幂次⽅⼤⼩(HashMap 中的 tableSizeFor() ⽅
法保证,下⾯给出了源代码)。也就是说 HashMap 总是使⽤2的幂作为哈希表的⼤⼩,后⾯会介
绍到为什么是2的幂次⽅。
底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突时有了⼤的变化,当链表⻓度⼤于
阈值(默认为8)时,将链表转化为红⿊树,以减少搜索时间。Hashtable 没有这样的机制。
5、HashSet如何检查重复
当你把对象加⼊ HashSet 时,HashSet会先计算对象的 hashcode 值来判断对象加⼊的位置,同时也会
与其他加⼊的对象的hashcode值作⽐,如果没有相符的hashcode,HashSet会假设对象没有重复出
现。但是如果发现有相同hashcode值的对象,这时会调⽤ equals() ⽅法来检查hashcode相等的对
象是否真的相同。如果两者相同,HashSet就不会让加⼊操作成功。
6、HashMap**的原理图
|
|
| ------------------------------------------------------------ |
476.png) |
---|