1.集合框架里面基础Map面试题
了解Map吗?用过哪些Map的实现
说下 HashMap和Hashtable 的区别
2.对象的比较、排重 hashcode和equals经常需要重写,也是map和set里面常用知识
介绍下对象的 hashCode()和equals(),使用场景
代码实战: 编写一个User对象,重写里面的hashcode和equal方法
import java.util.Date;
import java.util.Objects;
public class User {
private int age;
private String name;
private Date time;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
@Override
public int hashCode() {
//int code = age/name.length()+time.hashCode();
//return code
//推荐下面这个
return Objects.hash(age, name, time);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
User user = (User) obj;
return
age == user.age &&
Objects.equals(name,user.name)&&
Objects.equals(time,user.time);
}
}
3.Map 相关基础知识掌握情况
HashMap和TreeMap应该怎么选择,使用场景
Set和Map的关系
常见Map的排序规则是怎样的?
4.集合框架里面基础Map面试题进阶
如果需要线程安全,且效率高的Map,应该怎么做?
为什么Collections.synchronizedMap后是线程安全的?
5.深入底层HashMap实现原理
看过HashMap源码吗,介绍下你了解的HashMap
能否解释下什么是Hash碰撞?常见的解决办法有哪些,hashmap采用哪种方法
补充知识
链表法
开放地址法
再哈希法
总结
以上总结内容转载自:解决哈希冲突的三种方法(拉链法、开放地址法、再哈希法)
https://blog.csdn.net/qq_32595453/article/details/80660676
立即前往 6.深入底层HashMap实现原理
你说HashMap底层是 数组+链表+红黑树,为什么要用这几类结构呢?
为啥选择红黑树而不用其他树,比如二叉查找树,为啥不一直开始就用红黑树,而是到8的长度后才变换
7.是否掌握HashMap的底层实现,put、get流程
说下hashmap的put和get的核心逻辑(JDK8以上版本)
put核心流程
转载自小滴课堂
get核心流程
final Node<K,V> getNode(int hash, Object key) {
Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
if ((tab = table) != null && (n = tab.length) > 0 &&
(first = tab[(n - 1) & hash]) != null) {
//获取首节点,hash碰撞概览小,通常链表第一个节点就是值,没必要去循环遍历,处于效率
if (first.hash == hash && // always check first node
((k = first.key) == key || (key != null && key.equals(k))))
return first;
//如果不止一个节点,就需要循环遍历,存在多个hash碰撞
if ((e = first.next) != null) {
//判断是否是红黑树,如果是则调用树的查找
if (first instanceof TreeNode)
return ((TreeNode<K,V>)first).getTreeNode(hash, key);
//链表结构,则循环遍历获取节点
do {
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
} while ((e = e.next) != null);
}
}
return null;
}
8.是否掌握并发包下的ConcurrentHashMap基础和原理
了解ConcurrentHashMap吗?为什么性能比hashtable高,说下原理
jdk1.7和jdk1.8里面ConcurrentHashMap实现的区别有没了解
9.解读并发包里面ConcurrentHashMap核心Put源码
说下ConcurrentHashMap的put的核心逻辑(JDK8以上版本)
推荐资料:
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html
https://www.jianshu.com/p/5dbaa6707017