黑马程序员技术交流社区
标题:
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