锁定老帖子 主题:java的Integer与int的区别
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间: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那么享元模式又怎么解释呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-01-23
最后修改:2013-01-23
Integer 是对象,定义的变量是对Integer对象地址的引用,==比较的是对象在内存中的物理地址。所以不等。
int定义的变量就是值的引用。(范围为正负2^31) |
|
返回顶楼 | |
发表时间: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的范围啊,这是怎么回事啊 |
|
返回顶楼 | |
发表时间: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上申请不同的对象空间的,所以不是相同的 |
|
返回顶楼 | |
发表时间: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上申请不同的对象空间的,所以不是相同的 嗯,我看了源码了,看明白是什么意思了,但是为什么要这么做呢,我就有点不懂了 |
|
返回顶楼 | |
发表时间: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,避免大量内存消耗~ |
|
返回顶楼 | |
发表时间:2013-01-23
最后修改:2013-01-28
这个缓存的值范围已经是可配置的了http://rednaxelafx.iteye.com/blog/680746
|
|
返回顶楼 | |
发表时间: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的话,那么对内存的节省来说不是更好么? |
|
返回顶楼 | |
发表时间: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一个对象产生的消耗。 |
|
返回顶楼 | |
发表时间: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一个对象产生的消耗。 那么你的意思就是说,如果超出了这个范围,性能就会越来越差,这是我的理解 |
|
返回顶楼 | |