标签:ble let its form 比较 number 一个 包装 obj
记住:equals方法比较的是真正的值
两个包装类比较,比较的是包装的基本数据类型的值
基本数据类型和包装类型比较时,会先把基本数据类型包装后再比较 (但是因为equal比较的还是真正的值,因此最终结果没有影响)
double i0 = 0.1; Double i1 = new Double(0.1); Double i2 = new Double(0.1); System.out.println(i1.equals(i2)); //true 2个包装类比较,比较的是包装的基本数据类型的值 System.out.println(i1.equals(i0)); //true 基本数据类型和包装类型比较时,会先把基本数据类型包装后再比较
public boolean equals(Object obj) { return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value)); }
包装类new出来的都是新的对象, ==一定不相等
基本数据类型和包装类比较,会先把包装类拆箱(和equals是反的)
double i0 = 0.1; Double i1 = new Double(0.1); Double i2 = new Double(0.1); System.out.println(i1 == i2); //false new出来的都是新的对象 System.out.println(i1 == i0); //true 基本数据类型和包装类比较,会先把包装类拆箱
Double i1 = Double.valueOf(0.1); Double i2 = Double.valueOf(0.1); System.out.println(i1 == i2); //false valueOf方法内部实际上也是new
public static Double valueOf(String s) throws NumberFormatException { return new Double(parseDouble(s)); }
包装类型的缓存范围为:
System.out.println(Integer.valueOf(1) ==Integer.valueOf(1)); //true --> valueOf() 有缓存,相当于是一个对象 System.out.println(Integer.valueOf(999) ==Integer.valueOf(999)); //false
System.out.println(Integer.valueOf(1) == new Integer(1); //false --> new 没有缓存,相当于是两个不同的对象
Integer i4 = Integer.valueOf(1); Integer i5 =1; --> 自动装箱用valueOf()
System.out.println(i4 == i5); //true --> 因为自动装箱用valueOf(),并且 1 在 valueOf()有缓存范围,相当于是一个对象
//--------------------
Integer i7 = Integer.valueOf(999);
Integer i8 = 999; --> 自动装箱用valueOf()
System.out.println(i7 == i8); //false --> 因为自动装箱用valueOf(),但是 999 不在 valueOf()有缓存范围,相当于是两个对象
基本类型和对应的包装类可以相互装换:
Integer i = Integer.valueOf(1); //手动装箱
Integer j = 1; //自动装箱 -- 实际使用valueOf()方法,new一个新的对象
Integer i0 = new Integer(1);
int i1 = i0; //自动拆箱
int i2 = i0.intValue(); //手动拆箱
jdk5.0开始增加自动装箱/拆箱
Java 基础 - 自动装箱,valueOf装箱,new -->使用 == 和 equals比较
标签:ble let its form 比较 number 一个 包装 obj
原文地址:https://www.cnblogs.com/frankcui/p/12092716.html