Java学习之旅---包装类型、自动装/拆箱问题

文 | caesar

永远不安分。


 Java基础篇

一.数据类型

1.1包装类型、自动装/拆箱问题


包装类:在java语言里,最重要的特性是面向对象,因此java实现了对八种基本数据类型的封装成类,使之可生成类实例。

装箱/拆箱(java1.5以前)

//装箱

Integer integer = new integer(10);

//拆箱

int i = integer.intValue();

自动装/拆箱(java1.5至今)

//自动装箱

Integer integer = 10;

.//自动拆箱

int i = integer;

源码分析:

//源码

public static Integer valueOf(int i)  {

    return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];

}


== 与 equals()区别:

    ==:

    1.当用于基本数据类型比较时,比较的是数值。

    2.当用于对象比较时 (此处自然应该包括包装类)

    equals():

public boolean equals(Object obj)  {

    return (this == obj);

 }

    因为equals( )是超类Object的方法,所有类一般都会重写这个方法,equals( )实现对象在逻辑上的相等,而“逻辑”由你决定。


由源码可以看出,当传入 i 数值满足 i >= 128 || i < 128时,会new操作创建一个对象,否则执行SMALL_VALUES[i + 128] ( 即不创建新对象,返回已经创建好的对象 ),为了方便理解,举出下列例子。


public class Auto {

    public static void main(String[] args) {

        Integer i1 = 1;

        Integer i2 = 2;

        Integer i3 = 3;

        Integer i4 = 3;

        Integer i5 = 200;

         Integer i6 = 200;

        System.out.println(i3 == i4);      //true

        System.out.println(i5 == i6);      //false

        System.out.println(i3.equals (i1 + i2));        //true

    }

}

    首先明确 i3 和 i4 都处于不创建新对象这类情况的区间,因此 i3 和 i4都引用向内存块里的同个对象,结果为true。i5 和 i6数值上超过128,因此这种情况是创建新对象,既然引用的新创建的不同的对象,自然结果为false。

    需要注意的是,当出现算术运算时,会进行自动拆箱,所以i1+i2进行自动拆箱,然后将两者相加的和进行自动装箱,Integer中的equals( )方法已经重写过,是判断数值是否相等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容