Java 基础 - 自动装箱,valueOf装箱,new -->使用 == 和 equals比较
Autoboxing and Unboxing 总结
关于equals 比较
记住:equals方法比较的是真正的值
两个包装类比较,比较的是包装的基本数据类型的值
基本数据类型和包装类型比较时,会先把基本数据类型包装后再比较 (但是因为equal比较的还是真正的值,因此最终结果没有影响)
1 2 3 4 5 | 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 基本数据类型和包装类型比较时,会先把基本数据类型包装后再比较 |
- 源码
1 2 3 4 5 | public boolean equals(Object obj) { return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value)); } |
关于==(双等号)比较
记住:对于基本数据类型,==(双等号)比较的是值;而对于包装类型,==(双等号)比较的则是2个对象的内存地址。包装类new出来的都是新的对象, ==一定不相等
基本数据类型和包装类比较,会先把包装类拆箱(和equals是反的)
1 2 3 4 5 | 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出来的对象,内存地址肯定是不一样的。
1 2 3 | Double i1 = Double.valueOf( 0.1 ); Double i2 = Double.valueOf( 0.1 ); System.out.println(i1 == i2); //false valueOf方法内部实际上也是new |
- valueOf() 源码
1 2 3 | 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
1 2 | System.out.println(Integer.valueOf( 1 ) ==Integer.valueOf( 1 )); //true --> valueOf() 有缓存,相当于是一个对象 System.out.println(Integer.valueOf( 999 ) ==Integer.valueOf( 999 )); //false <br><br>System.out.println(Integer.valueOf(1) == new Integer(1); //false --> new 没有缓存,相当于是两个不同的对象 |
自动装箱,使用的是valueOf()的方法
1 2 | Integer i4 = Integer.valueOf( 1 ); Integer i5 = 1 ; --> 自动装箱用valueOf()System.out.println(i4 == i5); //true --> 因为自动装箱用valueOf(),并且 1 在 valueOf()有缓存范围,相当于是一个对象<br><br>//--------------------Integer i7 = Integer.valueOf(999); <br>Integer i8 = 999; --> 自动装箱用valueOf()<br><br>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开始增加自动装箱/拆箱
分类:
Java 基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2018-12-24 spring配置文件头部xmlns配置精髓