Unsafe:
改类被标识为final,是并发包中的底层,可直接绕过jvm实现对内存的操作,提高程序运行效率。
而改类只能通过反射进行获取,对外使用的getUnsafe()方法只能通过Boot classLoad加载,通过Application classLoad加载则直接报错。
Field field=Unsafe.class.getDeclaredField(“theUnsafe”);
field.setAccessible(true);
Unsafe unsafe=(Unsafe)field.get(null);//强转成Unsafe
//源码
Unsafe:
private static final Unsafe theUnsafe;
@CallerSensitive
public static Unsafe getUnsafe() {
Class arg = Reflection.getCallerClass();
if (!VM.isSystemDomainLoader(arg.getClassLoader())) {
throw new SecurityException("Unsafe");
} else {
return theUnsafe;
}
}
VM:
public static boolean isSystemDomainLoader(ClassLoader arg) {
return arg == null;
}
Field:
用于反射获取类的属性值。
get(Object obj) :返回此Field,对指定的对象所表示的字段的值。
反射获取指定属性的值:
TestVo testVo = new TestVo();
testVo.setName("大明");
//需要反射的类
Field field = TestVo.class.getDeclaredField("name");
field.setAccessible(true);
System.out.println(field.get(testVo));
//获取所有字段的值,并且赋予修改数据
Field[] declaredFields = TestVo.class.getDeclaredFields();
for (Field field2 :declaredFields) {
field2.setAccessible(true);
String type = field2.getType().getName();
//取值
System.out.println(">>>>"+type+":"+field2.get(testVo));
//修改值
field2.set(testVo, "小明");
System.out.println(field2.get(testVo));
}
transient:
表示不分配内存,不进行序列化,也不进行保存,只能修饰变量
static:
可以修饰变量、方法、代码块、类。只初始化一次 。不被序列化
final:
final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)参与序列化,不影响transient修饰
KMP算法:
场景:1、两个值是否在对方存在,存在返回当前值得位置下标
最好:O(m+n) o:需要查找的内容 m:是被查找对象长度,n:需要查找的对象长度 |省略f:被查找对象
最坏:O(m*n)
>> | << | >>> | & | | |&&| ||
表示右移,如果该数为正,则高位补0,若为负数,则高位补1; >>
表示左移移,不分正负数,低位补0; <<
表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0;可以和右移运算符一起理解 >>>
演示步奏:1、以上需要先十进制转换成二进制:2、根据位移量进行补0或1的具体操作,3、位移过后在二进制转换成十进制得到结果
&:位运算并且
|:位运算或者
&&:逻辑运算并且
||:逻辑运算或者