java equals 自动装箱_Java 基础 - 自动装箱,valueOf装箱,new -->使用 == 和 equals比较...

总结

关于equals 比较

记住: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));

}

关于==(双等号)比较

记住:对于基本数据类型,==(双等号)比较的是值;而对于包装类型,==(双等号)比较的则是2个对象的内存地址。

包装类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 基本数据类型和包装类比较,会先把包装类拆箱

valueOf()内部也是用的new方法来构造对象的. 2个new出来的对象,内存地址肯定是不一样的。

Double i1 = Double.valueOf(0.1);

Double i2 = Double.valueOf(0.1);

System.out.println(i1 == i2); //false valueOf方法内部实际上也是new

valueOf() 源码

public static Double valueOf(String s) throws NumberFormatException {

return new Double(parseDouble(s));

}

valueOf() 有缓存,new 没有缓存

包装类型的缓存范围为:

Integer类型有缓存-128-127的对象。只有该缓存的上限可以通过配置jvm更改

Byte,Short,Long类型有缓存(-128-127)

Character缓存0-127

Boolean缓存TRUE、FALSE

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 没有缓存,相当于是两个不同的对象

自动装箱,使用的是valueOf()的方法

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()有缓存范围,相当于是两个对象

手动/自动拆箱 & 手动/自动装箱

基本类型和对应的包装类可以相互装换:

由基本类型向对应的包装类转换称为装箱,例如把 int 包装成 Integer 类的对象:

Integer i = Integer.valueOf(1); //手动装箱

Integer j = 1; //自动装箱 -- 实际使用valueOf()方法,new一个新的对象

包装类向对应的基本类型转换称为拆箱,例如把 Integer 类的对象重新简化为 int。

Integer i0 = new Integer(1);

int i1 = i0; //自动拆箱

int i2 = i0.intValue(); //手动拆箱

jdk5.0开始增加自动装箱/拆箱

原文:https://www.cnblogs.com/frankcui/p/12092716.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值