A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张淼 中级黑马   /  2012-9-20 19:44  /  2654 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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。
        }
}
刚才在网上搜索==的具体定义,看见了如上内容,自己也试了下,真的是这个结果,但是不明白为什么,有知道的么?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
看张老师的高新视频里有讲过,老毕也讲过。
将整数包装成一个对象,放在字节缓存内,用的时候找到
适用于一个字节的范围内 在-128~127可以,超过就会false,好像是享元模式

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
刚好做了这方面的笔记和总结,分享下~~~

享元模式(自动装箱拆箱)
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//对象比较小,为了共用一个对象,在一个字节内,不需要另外开辟空间

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个 我的理解是这样的

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

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

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

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

上面只是个人理解,可能并不一定正确。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
原因:

这是自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。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
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就都一个新的对象;

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
王雷 中级黑马 2012-9-20 22:31:30
7#
数据类型范围是   -128~127   128超出数据类型范围,所以会出现flase
回复 使用道具 举报
超范围了  详情请见8421码
回复 使用道具 举报
溢出了.报错.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马