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