JAVA常见问题汇总

  1. synchronized加在静态方法上和非静态方法上区别是什么?
    Synchronzied 修饰非静态方法 – > 对象锁
    Synchronzied 修饰静态方法 – > 类锁,因为是静态方法,它把整个类锁起来了

  2. 对final修饰符的认识。

 		final List<String> list =  Lists.newArrayList();
        List<String> l1 = Lists.newArrayList();
        List<String> l2= Lists.newArrayList();
        l1= l2;
        list = l1;//这行是不能通过编译的

list定义为final是指该引用是final啦,但是list里面的值不是final的,所以可以修改。
final 类型的map或list中put或add数据并不是修改原有变量的内存指向地址。只是给这个地址中加了更多的值而已。但是final String s =“123”,s = " 456"; 这等于指向了两个内存地址。 final的意思是不可变最终的 是指他内存中所指向的内存地址是不可变是最终的。
对List或map的add或put操作,没有修改引用。而对字符串的修改,是整个引用都要指向一个不同的字符串了。

  1. 快速算出移位运算符结果方法:
    在不大于自身数值类型最大位数的移位时,一个数移位n,就是将这个数乘以(左移)2的n次幂,右移就是除,然后都取整就可以了
    比如int 32位的
    500>>3 这样算:500/8 取整 就是62
    356>>4 356/16 结果是 22
    8<<3 8*8 结果是 64

64位和上面方法一样。
如果移动过大超过了32位怎么办 移位数和32取余得到的数字在套用上面就可以了
比如 500>>67 怎么算?(就相当于500>>3)
1.先67对32取余 结果是3
2. 然后500/8 结果62

补充一点:计算机指令种的右移位运算符有2种,左移就是低位补0没花哨。但右移就有点事情了。
如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension ),在进行右移
1.算术右移 意思是你移动后补的是最高位的值。
举例:一个byte数字99 的二进制是 0110 0011
你右移4位后 补的是0 ------0000 0110
但是再看这一个:byte数字-107二进制是1001 0101 这是1开头的
你右移4位后补的确是最高位1 -------1111 1001
2.逻辑右移 补0就完事了

x>>>k是逻辑右移
无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位
无符号右移规则和右移运算是一样的,只是填充时不管左边的数字是正是负都用0来填充,无符号右移运算只针对负数计算,因为对于正数来说这种运算没有意义
无符号右移运算符>>> 只是对32位和64位的值有意义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值