又一次败北,java复习日常

2022-06-10  本文已影响0人  我叫何家明

又又又挂了,再次复习

字节码解析

其中有个init,看起来很像是方法,其实是父类的init,用于数据初始化加载。

线程安全的集合

什么对象不适合作为锁

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类型均为不可变类型

上一篇 下一篇

猜你喜欢

热点阅读