Java 杂谈

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

2019-03-26  本文已影响1人  Caesar_6953

文 | 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( )方法已经重写过,是判断数值是否相等。

上一篇 下一篇

猜你喜欢

热点阅读