论坛首页 入门技术论坛

java的Integer与int的区别

浏览 8194 次
该帖已经被评为新手帖
作者 正文
   发表时间:2013-01-23  
新人提一个问题
                  Integer i1=140;
		Integer i2=140;
		System.out.println(i1==i2);
		int i3=140;
		int i4=140;
		System.out.println(i3==i4);

为什么上面输出的是false而下面输出的就是true,Integer不是int的封装类么、他们在存储的过程中的区别是什么,既然第一个是false那么享元模式又怎么解释呢?
   发表时间:2013-01-23   最后修改:2013-01-23
Integer 是对象,定义的变量是对Integer对象地址的引用,==比较的是对象在内存中的物理地址。所以不等。
int定义的变量就是值的引用。(范围为正负2^31)
0 请登录后投票
   发表时间:2013-01-23  
yunshu321 写道
Integer 是对象,定义的变量是对Integer对象地址的引用,==比较的是对象在内存中的物理地址。所以不等。
int定义的变量就是值的引用。(范围为正负2^31)

但是
Integer a1=14;
		Integer a2=14;
		System.out.println(a1==a2);

这个就会输出true,意思就是说只要在-128到127范围之内就会输出true,但是Integer的范围是int的范围啊,这是怎么回事啊
0 请登录后投票
   发表时间:2013-01-23  
543917049 写道
yunshu321 写道
Integer 是对象,定义的变量是对Integer对象地址的引用,==比较的是对象在内存中的物理地址。所以不等。
int定义的变量就是值的引用。(范围为正负2^31)

但是
Integer a1=14;
		Integer a2=14;
		System.out.println(a1==a2);

这个就会输出true,意思就是说只要在-128到127范围之内就会输出true,但是Integer的范围是int的范围啊,这是怎么回事啊



因为Integer会cache [-128~127]的int数组,这相当于一个pool,所有是相同的,超过这个scope就是从heap上申请不同的对象空间的,所以不是相同的
0 请登录后投票
   发表时间:2013-01-23  
cectsky 写道
543917049 写道
yunshu321 写道
Integer 是对象,定义的变量是对Integer对象地址的引用,==比较的是对象在内存中的物理地址。所以不等。
int定义的变量就是值的引用。(范围为正负2^31)

但是
Integer a1=14;
		Integer a2=14;
		System.out.println(a1==a2);

这个就会输出true,意思就是说只要在-128到127范围之内就会输出true,但是Integer的范围是int的范围啊,这是怎么回事啊



因为Integer会cache [-128~127]的int数组,这相当于一个pool,所有是相同的,超过这个scope就是从heap上申请不同的对象空间的,所以不是相同的

嗯,我看了源码了,看明白是什么意思了,但是为什么要这么做呢,我就有点不懂了
0 请登录后投票
   发表时间:2013-01-23  
543917049 写道
cectsky 写道
543917049 写道
yunshu321 写道
Integer 是对象,定义的变量是对Integer对象地址的引用,==比较的是对象在内存中的物理地址。所以不等。
int定义的变量就是值的引用。(范围为正负2^31)

但是
Integer a1=14;
		Integer a2=14;
		System.out.println(a1==a2);

这个就会输出true,意思就是说只要在-128到127范围之内就会输出true,但是Integer的范围是int的范围啊,这是怎么回事啊



因为Integer会cache [-128~127]的int数组,这相当于一个pool,所有是相同的,超过这个scope就是从heap上申请不同的对象空间的,所以不是相同的

嗯,我看了源码了,看明白是什么意思了,但是为什么要这么做呢,我就有点不懂了


优化方案,对常用的int进行cache,避免大量内存消耗~
0 请登录后投票
   发表时间:2013-01-23   最后修改:2013-01-28
这个缓存的值范围已经是可配置的了http://rednaxelafx.iteye.com/blog/680746
0 请登录后投票
   发表时间:2013-01-23  
cectsky 写道
543917049 写道
cectsky 写道
543917049 写道
yunshu321 写道
Integer 是对象,定义的变量是对Integer对象地址的引用,==比较的是对象在内存中的物理地址。所以不等。
int定义的变量就是值的引用。(范围为正负2^31)

但是
Integer a1=14;
		Integer a2=14;
		System.out.println(a1==a2);

这个就会输出true,意思就是说只要在-128到127范围之内就会输出true,但是Integer的范围是int的范围啊,这是怎么回事啊



因为Integer会cache [-128~127]的int数组,这相当于一个pool,所有是相同的,超过这个scope就是从heap上申请不同的对象空间的,所以不是相同的

嗯,我看了源码了,看明白是什么意思了,但是为什么要这么做呢,我就有点不懂了


优化方案,对常用的int进行cache,避免大量内存消耗~

他这么做的目的是节省内存的空间,我的意思是说,如果,范围是int的范围,只要在这个范围就可以输出true的话,那么对内存的节省来说不是更好么?
0 请登录后投票
   发表时间:2013-01-23  
543917049 写道
cectsky 写道
543917049 写道
cectsky 写道
543917049 写道
yunshu321 写道
Integer 是对象,定义的变量是对Integer对象地址的引用,==比较的是对象在内存中的物理地址。所以不等。
int定义的变量就是值的引用。(范围为正负2^31)

但是
Integer a1=14;
		Integer a2=14;
		System.out.println(a1==a2);

这个就会输出true,意思就是说只要在-128到127范围之内就会输出true,但是Integer的范围是int的范围啊,这是怎么回事啊



因为Integer会cache [-128~127]的int数组,这相当于一个pool,所有是相同的,超过这个scope就是从heap上申请不同的对象空间的,所以不是相同的

嗯,我看了源码了,看明白是什么意思了,但是为什么要这么做呢,我就有点不懂了


优化方案,对常用的int进行cache,避免大量内存消耗~

他这么做的目的是节省内存的空间,我的意思是说,如果,范围是int的范围,只要在这个范围就可以输出true的话,那么对内存的节省来说不是更好么?

cache不要耗内存吗?。。128是一个平衡,cache的消耗,和new一个对象产生的消耗。
0 请登录后投票
   发表时间:2013-01-23  
yunshu321 写道
543917049 写道
cectsky 写道
543917049 写道
cectsky 写道
543917049 写道
yunshu321 写道
Integer 是对象,定义的变量是对Integer对象地址的引用,==比较的是对象在内存中的物理地址。所以不等。
int定义的变量就是值的引用。(范围为正负2^31)

但是
Integer a1=14;
		Integer a2=14;
		System.out.println(a1==a2);

这个就会输出true,意思就是说只要在-128到127范围之内就会输出true,但是Integer的范围是int的范围啊,这是怎么回事啊



因为Integer会cache [-128~127]的int数组,这相当于一个pool,所有是相同的,超过这个scope就是从heap上申请不同的对象空间的,所以不是相同的

嗯,我看了源码了,看明白是什么意思了,但是为什么要这么做呢,我就有点不懂了


优化方案,对常用的int进行cache,避免大量内存消耗~

他这么做的目的是节省内存的空间,我的意思是说,如果,范围是int的范围,只要在这个范围就可以输出true的话,那么对内存的节省来说不是更好么?

cache不要耗内存吗?。。128是一个平衡,cache的消耗,和new一个对象产生的消耗。

那么你的意思就是说,如果超出了这个范围,性能就会越来越差,这是我的理解
0 请登录后投票
论坛首页 入门技术版

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