1因为hash比equals的速度快得多,判断对象是否相等先进行hashcode进行比较,如果hashcode不相等了,那么就没有必要进行equals的比较了。
2equals相等的话,hashcode有可能不相同,如果是hash类型的容器,就会出现问题。
public class HashSetDemo {
public static void main(String[] args) {
Set set = new HashSet<>();
User s1 = User.builder().name("s").age("1").build();
User s2 = User.builder().name("s").age("1").build();
set.add(s1);
set.add(s2);
System.out.println(set.size()); // 输出2
}
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class User {
private String name;
private String age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return name.equals(user.name) && age.equals(user.age);
}
// 如果不重写hashcode的话,使用hash类型的容器时,会认为两个对象不相等
// @Override
// public int hashCode() {
// return Objects.hash(name, age);
// }
}
2.ReentrantLock公平锁和非公平锁哪个效率高,为什么
非公平锁效率高。
公平锁维护一个有序队列,后来的线程要获取锁时,即使锁空闲,也要检查队列是否为空。如果不为空,那么自己也要进入队列挂起,然后唤醒队列首部的线程。挂起和唤醒消耗资源较高。
非公平锁每个线程获取锁的顺序是随机的,后来的线程获取锁时,不会检查队列,先通过CAS获取锁,如果此时锁空闲。直接获取到锁,避免了挂起和唤醒的过程。
参考:
公平锁与非公平锁+效率差异原因_rootkiss的博客-CSDN博客_非公平锁为什么比公平锁快
3.Eden from to 为什么要有个eden如果没有新生代,那么进行fullgc的效率太低。
4.hashmap为什么线程不安全,通过代码演示一下线程1:map.put(1,2);
线程2:map.get(1);
线程1:map.put(1,3);
线程1进行map.put(1,2)执行之后
线程2进行get操作到一半的时候,正常应该获取到2,但是执行到一半停止了
线程1继续进行map.put(1,3)成功
此时线程2继续执行就获取到了3,和预期的不一样
5.spring采用哪种注入方式,为什么 6.msyql中锁的分类 7.串行化是怎么解决幻读的 8.Entry和Node的区别 9.JDK7和8中concurrentHashmap区别


