论坛首页 Java企业应用论坛

【JDK优化】 Integer 自动打包机制的优化

浏览 13829 次
该帖已经被评为良好帖
作者 正文
   发表时间:2010-03-15  
以前也碰到过类似的情况 确实要小心
0 请登录后投票
   发表时间:2010-03-15  
我觉得这个缓存值主要目的是给Byte对象做优化的

byte值范围大家都知道是-128~127
0 请登录后投票
   发表时间:2010-03-15  
thorlst 写道
我觉得这个缓存值主要目的是给Byte对象做优化的

byte值范围大家都知道是-128~127



Byte,Long,Short都有它自己的缓存!

不是为了Byte来的。
0 请登录后投票
   发表时间:2010-03-15  
楼主很善于研究
0 请登录后投票
   发表时间:2010-03-15  
mercyblitz 写道
这个东西为了性能考虑,但是这种性能提升也有问题~

个人觉得也有问题,那些数字虽然比一些大数字出现的概率大点,但也占用了那些空间,而且这个依据没有什么说服力!如果想真正提高性能最好还是用基本数据类型
0 请登录后投票
   发表时间: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的地址又不相等呢?
0 请登录后投票
   发表时间: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
所以相等
而第三个比较是比较的两个对象的地址,所以不相等
3 请登录后投票
   发表时间:2010-03-16  

  分析有二:

  一、避免用包装类将基本数据直接赋值。

  二、包装类也是对象,因此对象比较应该用equals方法。
0 请登录后投票
   发表时间: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对象自动拆包,然后比较两个整形变量。

注意编译器给我们做了很多工作,大家不要忘记了他的辛苦。要把它的汗水记得明明白白它的心!





1 请登录后投票
   发表时间: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文件么?一般的文本编辑器打开都是乱码。难道是看反编译的结果?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics