黑马程序员技术交流社区

标题: 127相等,128为什么就不相等了呢? [打印本页]

作者: 张淼    时间: 2012-9-20 19:44
标题: 127相等,128为什么就不相等了呢?
class Test1
{
        public static void main(String[] args)
         {
         Integer i=127;
         Integer j=127;
         System.out.println(i==j);  //打印结果为ture。
         }
}
class Test1
{
        public static void main(String[] args)
        {
        Integer i=128;
        Integer j=128;
        System.out.println(i==j); //打印结果为false。
        }
}
刚才在网上搜索==的具体定义,看见了如上内容,自己也试了下,真的是这个结果,但是不明白为什么,有知道的么?
作者: 严海荣    时间: 2012-9-20 19:50
看张老师的高新视频里有讲过,老毕也讲过。
将整数包装成一个对象,放在字节缓存内,用的时候找到
适用于一个字节的范围内 在-128~127可以,超过就会false,好像是享元模式
作者: 夏天    时间: 2012-9-20 19:53
刚好做了这方面的笔记和总结,分享下~~~

享元模式(自动装箱拆箱)
Integer a = 137;
Integer b = 137;
Integer i = 95;
Integer j = 95;
// 这是一种设计模式:享元模式 flyweight.
// 如果很多很小的对象,如果他们有相同的东西,那就把他变成一个对象。
// 把不同的东西,变成外部的属性,作为方法的参数传入。
// 比如文件夹图标。
System.out.println(a == b);// false
System.out.println(i == j); // true//对象比较小,为了共用一个对象,在一个字节内,不需要另外开辟空间

作者: 张小龙    时间: 2012-9-20 19:57
这个 我的理解是这样的

首先,如果数字是小于等于127的,那么内存中可能会存在段内存,专门用于存储这些数字,我的理解是因为ASCII表的原因

所以,当用Integer i=xx之类的赋值语句时,就会直接指向那段内存。两个对象都是指向同一地址,所以比较引用也会为真。

但是,当数字超过127之后,比如128,就会在内存中新开辟一段内存来存储这些数据,所以对象的引用也就不一样了,自然而然,比较也不可能相同了

但是楼主需要注意,只要你是用的这种形式:比如,Integer i=new Integer(127),那么两个相比较,也会错误,因为是新new了一个对象

上面只是个人理解,可能并不一定正确。
作者: 杨卫腾    时间: 2012-9-20 20:09
原因:

这是自jdk1.5以后,自动装箱的数据是一个字节,那么该数据会被共享不会重新开辟空间。也称为是 享元模式

byte 的范围是 -128~127  所以这个128超过了一个字节,就会新创建一个对象,不会使用常量池的共享数据了。

举例如下:可以验证。
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1==i2); //输出 true;

Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3==i4);//输出:false。


作者: 程金    时间: 2012-9-20 20:25
java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式 flyweight
一般来说,一些小点的数字常量经常用到,为了加大对简单数字的重利用,节约空间,提高效率.java定义:在自动装箱时对于值从–128到127之间的值,
它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象,每次用这些数值给初始化Integer对象变量的时候,都先在常量池中查找是否已经创建过了这个数值相关联的Integer对象,没有就创建,有就将此数值相关的integer对象引用返回.
Integer num1 = 6;
Integer num2 = 6;
num1创建了一个对象,
num2并没有创建对象,而是将num1的引用直接复制给num2,所以他们指向同一个对象.

而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象,用==比较的时候,是比较他们的引用值,由于他们指向的对象不用,所以引用值不同,结果为false
明白了吧
如果你跟一般类一样,用new来进行实例化,就会每次new就都一个新的对象;
作者: 王雷    时间: 2012-9-20 22:31
数据类型范围是   -128~127   128超出数据类型范围,所以会出现flase
作者: 李健_8    时间: 2012-9-20 22:46
超范围了  详情请见8421码

作者: 刘进朝    时间: 2012-9-21 10:03
溢出了.报错.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2