该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-15
以前也碰到过类似的情况 确实要小心
|
|
返回顶楼 | |
发表时间:2010-03-15
我觉得这个缓存值主要目的是给Byte对象做优化的
byte值范围大家都知道是-128~127 |
|
返回顶楼 | |
发表时间:2010-03-15
thorlst 写道 我觉得这个缓存值主要目的是给Byte对象做优化的
byte值范围大家都知道是-128~127 Byte,Long,Short都有它自己的缓存! 不是为了Byte来的。 |
|
返回顶楼 | |
发表时间:2010-03-15
楼主很善于研究
|
|
返回顶楼 | |
发表时间:2010-03-15
mercyblitz 写道 这个东西为了性能考虑,但是这种性能提升也有问题~
个人觉得也有问题,那些数字虽然比一些大数字出现的概率大点,但也占用了那些空间,而且这个依据没有什么说服力!如果想真正提高性能最好还是用基本数据类型 |
|
返回顶楼 | |
发表时间:2010-03-16
public static void main(String[] args) { Integer a=200; Integer b=200; int c=200; System.out.println("a==c "+(a==c)); System.out.println("b==c "+(b==c)); System.out.println("a==b "+(a==b)); } 请问LZ,对于这段代码的运行结果是: a==c true b==c true a==b false 既然a和b都是通过Integer新建的对象,而c是在栈中的常量,为什么a、b会和c的地址相等,而a和b的地址又不相等呢? |
|
返回顶楼 | |
发表时间:2010-03-16
shensen_wu 写道 public static void main(String[] args) { Integer a=200; Integer b=200; int c=200; System.out.println("a==c "+(a==c)); System.out.println("b==c "+(b==c)); System.out.println("a==b "+(a==b)); } 请问LZ,对于这段代码的运行结果是: a==c true b==c true a==b false 既然a和b都是通过Integer新建的对象,而c是在栈中的常量,为什么a、b会和c的地址相等,而a和b的地址又不相等呢? 前两个比较应该是进行了自动的装箱与拆箱, 相当于比较的是a.intValue==200和b.intValue==200 所以相等 而第三个比较是比较的两个对象的地址,所以不相等 |
|
返回顶楼 | |
发表时间:2010-03-16
分析有二: 一、避免用包装类将基本数据直接赋值。 二、包装类也是对象,因此对象比较应该用equals方法。 |
|
返回顶楼 | |
发表时间:2010-03-16
最后修改:2010-03-16
shensen_wu 写道 public static void main(String[] args) { Integer a=200; Integer b=200; int c=200; System.out.println("a==c "+(a==c)); System.out.println("b==c "+(b==c)); System.out.println("a==b "+(a==b)); } 请问LZ,对于这段代码的运行结果是: a==c true b==c true a==b false 既然a和b都是通过Integer新建的对象,而c是在栈中的常量,为什么a、b会和c的地址相等,而a和b的地址又不相等呢? 我绝对大家要学会看.class文件 Integer a=200; int c=200; System.out.println("a==c"); 被编译器这样编译: Integer a=Integer.valueOf(200); 这个时候引用a存储的是堆栈中Integer对象的地址 (注意a是对象引用) int c=200; 编译器把常量200写进常量池,然后栈中的变量c里面存放的就是这个值200 (注意c是变量名) int temp=a.intValue(); 大家可以去看看intValue()的源代码,实际上编译器并没有temp这样的变量,而直接把intValue()的返回结构压入操作数栈。我这些写实为了大家明白过程(不存在temp的). System.out.println(temp==c); 大致的过程就是这样 总结一下: (1) 当把一个整形常量或变量直接赋值给Integer引用时,比如 Integer a=200, 或 int b=200; Integer a=b; 这是编译器会调用Integer.valueOf()方法来自动打包int基本类型。 (2) 当比较一个Integer对象和一个int基本类型变量的时候,编译器会调用Integer对象.intValue()将Integer对象自动拆包,然后比较两个整形变量。 注意编译器给我们做了很多工作,大家不要忘记了他的辛苦。要把它的汗水记得明明白白它的心! |
|
返回顶楼 | |
发表时间:2010-03-18
最后修改:2010-03-18
Heart.X.Raid 写道 shensen_wu 写道 public static void main(String[] args) { Integer a=200; Integer b=200; int c=200; System.out.println("a==c "+(a==c)); System.out.println("b==c "+(b==c)); System.out.println("a==b "+(a==b)); } 请问LZ,对于这段代码的运行结果是: a==c true b==c true a==b false 既然a和b都是通过Integer新建的对象,而c是在栈中的常量,为什么a、b会和c的地址相等,而a和b的地址又不相等呢? 我绝对大家要学会看.class文件 Integer a=200; int c=200; System.out.println("a==c"); 被编译器这样编译: Integer a=Integer.valueOf(200); 这个时候引用a存储的是堆栈中Integer对象的地址 (注意a是对象引用) int c=200; 编译器把常量200写进常量池,然后栈中的变量c里面存放的就是这个值200 (注意c是变量名) int temp=a.intValue(); 大家可以去看看intValue()的源代码,实际上编译器并没有temp这样的变量,而直接把intValue()的返回结构压入操作数栈。我这些写实为了大家明白过程(不存在temp的). System.out.println(temp==c); 大致的过程就是这样 总结一下: (1) 当把一个整形常量或变量直接赋值给Integer引用时,比如 Integer a=200, 或 int b=200; Integer a=b; 这是编译器会调用Integer.valueOf()方法来自动打包int基本类型。 (2) 当比较一个Integer对象和一个int基本类型变量的时候,编译器会调用Integer对象.intValue()将Integer对象自动拆包,然后比较两个整形变量。 注意编译器给我们做了很多工作,大家不要忘记了他的辛苦。要把它的汗水记得明明白白它的心! 楼主啊,我也想研究class,但是能说一下用什么编辑器打开class文件么?一般的文本编辑器打开都是乱码。难道是看反编译的结果? |
|
返回顶楼 | |