0%

java后端面经

每天一点面试经验

皮卡丘

JavaSE

java基础

Java基础部分

1.为什么重写equals还要重写hashcode?

hashmap中,如果要比较key是否相等,

2.十进制转二进制

我们可以直接利用移位操作对一个十进制数进行移位操作,即:将最高位的数移至最低位(移31位),除了最低位其余位置清零,使用& 操作,可以使用和1相与(&)(由于1在内存中除了最低位是1,其余31位都是零),然后把这个数按十进制输出;再移次高位,做相同的操作,直到最后一位 ,代码如下

1
2
3
4
5
public void binaryToDecimal(int n){
for (int i = 31; i > 0; i--){
System.out.print(n >>> i & 1);
}
}

3.乐观锁与悲观锁

乐观锁

乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。

Java中的乐观锁基本都是通过CAS操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。

悲观锁

悲观锁是就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据的时候都认为别人会修改,所以每次在读写数据的时候都会上锁,这样别人想读写这个数据就会block直到拿到锁。

Java中的悲观锁就是Synchronized,AQS框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如 RetreenLock。

-------------本文结束感谢您的阅读-------------