文章目录
- Java集合框架
- 说说有哪些常见的集合?
- ArrayList和LinkedList的区别?
- List和Set的区别?
- HashMap的数据结构?把你了解的所有都讲一讲?
- 数据结构:
- put流程
- Hashmap的resize方法的执行过程?
- get流程
- JDK8 HashMap为什么引入红黑树?解决了什么问题?
- HashMap什么情况下会触发扩容呢?
- HashMap与ConcurrentHashMap的区别是什么?
- HashMap和HashTable的区别?
- HashMap和HashTable的区别?
- HashCode和equals方法?
Java集合框架
说说有哪些常见的集合?
集合相关类和接口都在Java.util中,主要分为3种:List(列表)、Map(映射)、Set(集)。
ArrayList和LinkedList的区别?
ArrayList基于动态数组实现,所以它的查找效率高,增删效率慢
LinkedList基于双向循环链表实现,它的查找效率低,增删效率快
List和Set的区别?
List:有序,按对象进入的顺序保存对象,可重复,允许多个null元素对象,可以使用迭代器去除所有元素,再逐一遍历,也可使用get(int index)获取指定下标的元素。
set:无序,不可重复,最多允许有一个null元素对象,取元素时只能通过iterator迭代器接口取得所有元素,再逐一遍历各个元素。
HashMap的数据结构?把你了解的所有都讲一讲?
数据结构:
1.7 数组+链表 1.8 采用数组+链表+红黑树
数组用来确定元素的位置;链表用来解决哈希冲突;红黑树提高查询效率
红黑树:
根节点必须是黑色
所有结点非黑即红
红结点两个子结点一定是黑色
任意结点到叶子结点,包含的黑色结点数目相同
put流程
1.首先hash算法计算出哈希值
2.判断数组是否需要扩容,是就执行resize方法扩容
3.然后根据哈希值去数组寻找下标
4.判断下标对应位置是否为空
是的话就直接插入
否的话就判断key是否相同
相同的话直接覆盖
不相同转到5
5.判断是否为树节点(判断是否为红黑树)
是的话在树中插入键值对
否的话进行下一步
6.遍历链表,判断key是否存在,
存在的话就覆盖
不存在的话插入链表尾部
插入之后判断链表长度是否>8
大于转为红黑树
不大于就结束
7.判断容量是否达到扩容阈值
是就执行resize方法扩容
否就结束
Hashmap的resize方法的执行过程?
两种情况会调用resize方法
1.第一次调用Hashma的put方法时,会调用resize方法对table数组进行初始化,如果不传入指定值,默认为16.
2.扩容时会调用resize方法,即size大于数组阈值threshold时,数组大小翻倍。
get流程
1.根据哈希值到数组对应下标寻找元素
判断是否是要查找的元素
是就返回
2.判断是否为树节点
是就遍历红黑树查找
3.判断是否为链表
是就遍历链表查找
JDK8 HashMap为什么引入红黑树?解决了什么问题?
引入红黑树我认为是这样,当产生hash冲突时会形成链表,当数据多了冲突多了,链表会越来越长,造成链化,此时查询特别耗时间,本来时间复杂度为O(1)结构可能达到O(n),引入红黑树可以优化查询。
HashMap什么情况下会触发扩容呢?
当它未初始化,第一个put时会触发扩容。后面插入值,当大于扩容阈值时
HashMap与ConcurrentHashMap的区别是什么?
HashMap不是线程安全的,而ConcurrentHashMap是线程安全的.
ConcurrentHashMap采用锁分段技术,整个ConcurrentHashMap由一个个Segment组成,Segment通过继承ReentrantLock来进行加锁,所以每次需要加锁的操作锁住的是一个segment,这样只要保证每个Segment是线程安全的,也就实现了全局的线程安全。
HashMap和HashTable的区别?
HashMap线程不安全(效率高), 也可以使用Collections.synchronizedMap(hashMap)使其实现同步,Hashtable线程安全(效率比较低)
HashMap和HashTable的区别?
HashMap线程不安全(效率高), 也可以使用Collections.synchronizedMap(hashMap)使其实现同步,Hashtable线程安全(效率比较低)
HashMap的key和value都允许为null,而Hashtable的key和value都不允许为null,Hashtable遇到null,直接返回NullPointerException
HashCode和equals方法?
如果两个对象相等,则hashCode一定也是相同的
两个对象的hashcode值相同,它们不一定是相等的
equals方法被重写,则hashCode方法也必须被重写