-
synchronized加在静态方法上和非静态方法上区别是什么?
Synchronzied 修饰非静态方法 – > 对象锁
Synchronzied 修饰静态方法 – > 类锁,因为是静态方法,它把整个类锁起来了 -
对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操作,没有修改引用。而对字符串的修改,是整个引用都要指向一个不同的字符串了。
- 快速算出移位运算符结果方法:
在不大于自身数值类型最大位数的移位时,一个数移位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位的值有意义