JAVA 位运算符原理:
35 >> 2 = 8 : 将值每右移一次,就相当于该值除以2并且舍弃余数。(35 除以2的2次方)HashMap 实现原理:
*无符号右移>>>与带符号右移>>的区别就是 无符号始终补0
2 << 2 = 8 : 将值每左移一次,就相当于该值乘以2。(2乘以2的2次方)
JDK7:底层是数组,通过传入的KEY的特定哈希算法定位数组索引。乐观锁和悲观锁的区别
当哈希值相同时判断equals方法如果相同就用新值替换为旧值。
如果不相同将以单项链表形式存入(一般为了性能会重写hashcode和equals方法,从而减少哈希值冲突来提高性能,因为哈希值相同的数据多时hashmap将退化为单项链表)
JDK8(相对于JDK7性能显著提高 get方法提高了20%左右):底层依然是数组,实现原理基本和JDK7一样。
不同的是单向链表长度超过指定个数时候会将链表升级为二叉树的结构来存储,使用哈希值作为树的分支变量,如果两个哈希值不等,但指向同一个位置的话,较大的那个会插入到右子树里。如果哈希值相等,HashMap希望key值最好是实现了Comparable接口的,这样它可以按照顺序来进行插入。如果没有实现这个接口,在出现严重的哈希碰撞的时候,你就别指望能获得性能提升了。
赋:Set 底层其实就是HashMap的key部分。只是将没有用到的值部分统一插入了Object而已。
悲观锁:在整个数据处理过程中,将数据处于锁定状态(依靠数据库提供的锁机制实现),因此会大大消耗数据库开销。(传统的关系型数据库运用比较常见,比如行锁,表锁,读锁,写锁等)
乐观锁:大多是基于数据版本记录机制实现。就是为数据增加一个版本标识(version字段),在对数据更改时比对版本号如果一致,则批准更改并将版本号+1,否则更新失败。
String类为什么定义为final
Java中String、Long、Double、Integer等,这些数据类型的类,都是final,因为这些类是基本数据类型的延伸。设计成一个不变类,这样有助于共享,提高性能。可以将字符串对象保存在字符串常量池中以供与字面值相同字符串对象共享。如果String对象是可变的,那就不能这样共享,因为一旦对某一个String类型变量引用的对象值改变,将同时改变一起共享字符串对象的其他String类型变量所引用的对象的值。