又又又挂了,再次复习
字节码解析
其中有个init,看起来很像是方法,其实是父类的init,用于数据初始化加载。
线程安全的集合
- HashTable
- Vector
- ConcurrentHashMap
什么对象不适合作为锁
Boolean
Boolean.False,Boolean.True 是两个对象,当boolean变化时,锁的对象不同,锁失效。
Integer
Integer是可变的,在数字变化时,尤其是超出边界时,对象可能不是同一个。那么锁不同的对象相当于没锁。
Integer
Integer i1=1;
Integer i2=1;
System.out.println(i1==i2);//true
System.out.println("------------------------------------------");
Integer i3=129;
Integer i4=129;
System.out.println(i3==i4);//false
/*知识点分析:自动装箱,Integer i=1; 相当于 Integer i=Integer.valueOf(1);点开valueOf的源码
public static Integer valueOf(int i) {
if (i >= -128 && i <= 127)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
可以发现,当i >= -128 && i <= 127时,会返回一个缓存中已有的Integer对象,
所以i=1时使用==比较对象时,为true,而i=129时,是false
*/
System.out.println("------------------------------------------");
int i5=129;
System.out.println(i4==i5);
/*true,知识点分析:自动拆箱,Integer类型与int类型用==比较时会自动拆箱成int类型与之比较,隐式执行 int i=Integer.intValue();,两个int类型用==比较,自然为true
*/
字节码中的init
当java类中定义了构造方法,或其他非static类成员变量被赋了初始值,编译器便会生成<init>。所以几乎每个类生成字节码时都有init方法。
不可变数据类型
java中基本数据类型(包括int,char,long等等)以及String类型均为不可变类型
网友评论