关于包装类及==equals的一些误区

        Integer i1=10;
        Integer i2=10;
        
        Integer i3=new Integer(10);
        Integer i4=new Integer(10);
        System.out.println(i1==i2);
        System.out.println(i1==i3);
        System.out.println(i3==i4);
        System.out.println(i1.equals(i2));
        System.out.println(i1.equals(i3));
        System.out.println(i3.equals(i4));
    /**
     * 输出结果:
            true
            false
            false
            true
            true
            true
    分析:首先区别==跟equals,==如果是比较的基本数据类型,则比较的是值,如果比较的引用类型则比较的是内存地址
    equals所有类默认继承自object,object中的equals跟==是一样的,这里的equals是Integer中被重写后的,比较的是值
    第一个i1==i2为ture:这里jvm自动将10装箱转换为Integer类型,并且这个10是一个Integer对象而不是数值,i1跟i2的10并非来自常量区,而是Integer自己的静态区中
    Integer类加载的时候自己有一个静态空间,空间里的静态块立即加载了一个Integer类型的数组,里面存储的256个Integer对象,取值范围是byte的取值范围即-128->127
    第二个为false:因为i1指向的是自己的静态空间的对象10的地址,i3则是通过new关键字在堆内存中开辟的内存空间指向的地址。
    第三个为false:同上,i3,i4都是通过new在堆中开辟的两个不同的空间,地址当然也不同
    四五六都为true:这里的equals比较的是值,i1,i2,i3,i4存储的都是对象10
    误区:如果i1=128,i2=128那么,第一个为false,原因是如果我们的取值在-128->127这个范围,则使用的是Integer自带的数组中Integer对象
    如果超过这个范围则会自动帮我们new一个,即i1=128等价i1=new Integer(128);
     */
    

猜你喜欢

转载自www.cnblogs.com/hebiao/p/12696096.html