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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何伟 中级黑马   /  2013-2-27 22:27  /  1374 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class IntegerDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Integer i1 = 100;
  6.                 Integer i2 = 100;
  7.                 Integer i3 = 200;
  8.                 Integer i4 = 200;
  9.                 System.out.println(i1==i2);//这里是true
  10.                 System.out.println(i3==i4);//而这里又是false
  11.         }
  12. }
复制代码
下面一个为什么是false呢?不懂?求解!

4 个回复

倒序浏览
根据  11_黑马程序员_张孝祥_Java基础加强_基本数据的自动拆装箱及享元设计模式

为节约内存,java 把一个字节内 也就是-128~127的整数,的对象都用同一个对象,不另外创建对象。 超过这个数的就另外创建对象

我们把这种模式称为享元设计模式

享元设计模式就是 如果有很多个小的对象,他们有很多属性相同,把他们变成一个对象。那些不同的属性把他变成方法的参数,称之为外部状态,那些相同的属性称之为这个对象的内部状态。

具体情况请看视频。
回复 使用道具 举报
李志卫 发表于 2013-2-27 22:33
根据  11_黑马程序员_张孝祥_Java基础加强_基本数据的自动拆装箱及享元设计模式

为节约内存,java 把一个 ...

了解了,谢谢
回复 使用道具 举报
这是因为JVM只会将大于等于-128,小于等于127的整数存放到常量池中。
源代码:
  1. public static Integer valueOf(int i) {  
  2.         if(i >= -128 && i <= IntegerCache.high)  
  3.             return IntegerCache.cache[i + 128];  
  4.         else  
  5.             return new Integer(i);  
  6. }
复制代码
如果大于127,则JAVA会自动将Integer i3 = 200;转换为Integer i = new Integer(200);
回复 使用道具 举报
这是因为JVM 可以选择要尝试这段代码的最佳优化,并对两个Integer 对象使用一个实例,
这样的话“= =”就会返回true 了。在自动装箱时对于值从–128 到127 之间的值,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马