目录
3. 包装类Integer使用比较运算符== 和 equals()方法时的注意事项
3.2 两个包装类Integer进行 equals() 运算
之前在做Java语法汇总时,提到过Java包装类。
这里单独起一篇文章,针对包装类,尤其是Integer类,做一些解释和说明。
1. Java的8种基本数据类型,以及对应包装类型
包装类的实质,就是将基本数据类型封装成引用数据类型。
以便使用引用数据类型的一些现成的方法。
2. 什么是装箱和拆箱
2.1 装箱和拆箱
发生在基本数据类型和包装类之间也称之为发生在引用类型和值类型之间。
(1)装箱:基本数据类型 -> 包装类,比如 int -> Integer
(2)拆箱:包装类 -> 基本数据类型, 比如Integer -> int
2.2 自动装箱和自动拆箱
JDK1.5后,出现了自动装箱和自动拆箱
(1)自动装箱的过程:内部自动构建成了一个Integer类型。
比如:Integer i1 = 6;
(2)自动装箱的过程:内部自动还原了一个int类型。
比如:int i2 = new Integer(8);
3. 包装类Integer使用比较运算符== 和 equals()方法时的注意事项
3.1 两个包装类Integer进行 == 运算
结论:如果其值在-128到127之间,那么如果值相等,则结果为true。否则返回false。
解析:
(1)== 比较基本类型时,比较的是值。比较引用类型时,比较的是变量值表示的内存地址。
(2)当变量值在-128到127之间时,其在内部指向的是:静态元素区中一个值为20的Integer包装类对象。当多个变量值在-128到127之间且相等时,它们指向的是静态元素区中的同一个Integer包装类对象。(代码示例中:i1 == i2 为true)
(3)Integer存在一个静态内部类(IntegerCache)作为缓存,里面有256个现有的静态对象存在一个数组(Integer[] cache)中,范围是-128 ~ 127。
当包装类的数值在这个范围内,则直接用静态缓存中的,引用直接指向它。
当不在这个范围内,则会在堆内存中创建一个新的对象。(代码示例中:i5 == i6 为false)
简单代码示例:
package com.my.test;
public class intAndIntegerDemo {
public static void main(String[] args) {
Integer i1 = 20;
Integer i2 = 20;
Integer i3 = new Integer(20);
Integer i4 = new Integer(20);
Integer i5 = 500;
Integer i6 = 500;
Integer i7 = new Integer(500);
Integer i8 = new Integer(500);
System.out.println( i1 == i2); //true
System.out.println( i1 == i3); //false
System.out.println( i3 == i4); //false
System.out.println( i1.equals(i2)); //true
System.out.println( i1.equals(i3)); //true
System.out.println( i3.equals(i4)); //true
System.out.println( i5 == i6); //false
System.out.println( i5 == i7); //false
System.out.println( i7 == i8); //false
System.out.println( i5.equals(i6)); //true
System.out.println( i5.equals(i7)); //true
System.out.println( i7.equals(i8)); //true
}
}
3.2 两个包装类Integer进行 equals() 运算
Integer重写了Object的equals()方法。用于比较变量(基本类型,包装类)内部的属性值。
上述代码示例中,所有变量的值都是20(或者都是500),因此返回的结果都是true。
3.2 基本类型和包装类进行 == 运算
包装类会自动拆箱变成基本类型,然后再比较。
4. 其他包装类使用equals()方法时的注意事项
(1)两个包装类进行equals比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true。如果类型不同,则直接返回false。
(2)包装类调用equals()方法,但是参数是基本类型,这时先进行自动装箱,基本类型转为包装类后,再按照(1)比较。