自动装箱的陷阱

 1 class TestAuto{
 2     public static void main(String[] args){
 3         int i = 1;
 4         Integer a = 1;
 5         Integer b = 2;
 6         Integer c = 3;
 7         Integer d = 3;
 8         Integer e = 321;
 9         Integer f = 321;
10         Long g = 3L;
11         System.out.println(i == a);//true
12         System.out.println(c == d);//true
13         System.out.println(e == f);//false
14         System.out.println(c == (a + b));//true
15         System.out.println(c.equals(a + b));//true
16         System.out.println(g == (a + b));//true
17         System.out.println(g.equals(a + b));//false
18     }
19 }

鉴于包装类的“==”在不遇到算数运算的情况下不会自动拆箱(但是看上面的输出好像可以自动拆箱)

以及它们的equals()方法不处理数据转型的关系

时间: 2024-10-15 09:22:52

自动装箱的陷阱的相关文章

java自动装箱的陷阱

自动装箱和拆箱是java的一颗语法糖,在给我们带来使用便利的同时也带来一些疑惑,请看下面的代码: 1 public class TestClass { 2 public static void main(String args[]) { 3 Integer a = 1; 4 Integer b = 2; 5 Integer c = 3; 6 Integer d = 3; 7 Integer e = 321; 8 Integer f = 321; 9 Long g = 3L; 10 11 Syst

[读书笔记]自动装箱的陷阱以及==与equals

先看一段代码,来自周志明的<深入理解Java虚拟机>. Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 321; Integer f = 321; Long g = 3L; System.out.println(c == d); System.out.println(e == f);//这里有个IntegerCache -128~127的问题 System.out.println(c == (a +

自动装箱与拆箱及其陷阱

自动装箱(Autoboxing): 在jdk 1.5之前,如果你想要定义一个value为100的Integer对象,则需要这样做:Integer aa = new Integer (100);而在jdk 1.5中,自动装箱首次被引入.例如 Integer aa = 100; aa为一个Integer类型的引用,100为Java中的基础数据类型(int).而这种直接将一个基础数据类型传给其相应的封装类的做法,便是自动装箱. 再看下源码里Integer类的valueOf(int i)方法的具体实现,

自动装箱和自动拆箱

http://www.cnblogs.com/xrq730/p/4869065.html 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } } 这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱.再看另外一段代码: public class TestMain { public st

java自动装箱与拆箱

基本数据(Primitive)类型的自动装箱(autoboxing).拆箱(unboxing)是J2SE 5.0提供的新功能,跟泛型.变长参数等一样,这也是一颗"语法糖",之前介绍jvm早期优化的时候说过,语法糖对运行期的代码没有任何影响,其目的仅仅是方便程序员使用,所有语法糖编译后都将会还原成基础语法.这次介绍的自动装箱和拆箱也不例外.看下头的例子: public class Demo { public static void main(String[] args) { Intege

自动拆箱和自动装箱

一开始想学学自动拆箱和自动装箱是被这个名字吸引到,听上去好像很高端的样子,其实自动拆箱.自动装箱是很简单的内容. 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子: 1 public class TestMain 2 { 3 public static void main(String[] args) 4 { 5 Integer i = 10; 6 } 7 } 这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱.再看另外一段代码: 1 publi

java自动装箱拆箱总结

对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性.以下是结合测试代码进行的总结. 测试代码: int a = 1; Integer b = 1; Integer c = 1; Integer d = 2; Integer e = 3; Integer f = 128; Integer g = 128; Long h = 3L; Double m = 4.0; Double n = 4.0; Float

Java语法糖2:自动装箱和自动拆箱

一开始想学学自动拆箱和自动装箱是被这个名字吸引到,听上去好像很高端的样子,其实自动拆箱.自动装箱是很简单的内容. 自动拆箱和自动装箱 Java为每种基本数据类型都提供了对应的包装器类型.举个例子: public class TestMain { public static void main(String[] args) { Integer i = 10; } } 这个过程中会自动根据数值创建对应的Integer对象,这就是自动装箱.再看另外一段代码: public class TestMain

自动装箱/自动拆箱/注释之反编译示例

下面是源码: 1 package test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Test { 7 public static void main(String[] args) { 8 List<Integer> list = new ArrayList<>(); 9 //下面会触发编译器自动装箱 10 list.add(1); 11 //下面会触发编译器自动拆箱 12