先让大家看一段简单的代码:

public static voidmain(String[] args) {
Integera = 1;
Integerb = 1; Integerc = 222;
Integerd = 222; System.out.println(a== b);
System.out.println(c== d);
}

大家猜一下。输出的结果会是什么?我想大多数刚開始学习的人都会觉得是:true  true。但是,实际呢?正确答案是:true

false。这时,是不是有人開始纳闷了。不禁问道:为什么呢?逻辑都一样。仅仅是数字不同,难道跟数字有关?恭喜你,答对了,确实跟数字有关。

以下我就带大家看看当中的缘由。

我们看一下integer源代码中的两个方法:

publicstatic Integer valueOf(int i) {
if(i >= -128 && i <=IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
} privatestatic class IntegerCache {
static final int high;
static final Integer cache[]; static {
final int low = -128; // high value may be configured byproperty
int h = 127;
if (integerCacheHighPropValue !=null) {
// Use Long.decode here toavoid invoking methods that
// require Integer's autoboxingcache to be initialized
int i =Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
// Maximum array size isInteger.MAX_VALUE
h = Math.min(i,Integer.MAX_VALUE - -low);
}
high = h; cache = new Integer[(high - low) +1];
int j = low;
for(int k = 0; k < cache.length;k++)
cache[k] = new Integer(j++);
} private IntegerCache() {}
}

当我们初始化一个integer类型的变量时,如:Integer a = 1,实际上它调用了integer中的valueOf方法,相当于Integera
= Integer.valueOf(1),而在这种方法内部有一个缓存的机制。

它会推断你给变量赋的值是否在-128——127之间。假设是,那么它直接从缓存里去取对象。反之才会新创建一个对象。

也就是说。当程序运行Integerb = 1时。缓存中已经存在这个integer对象,它直接将b指向缓存中的对象,结果就是a、b指向同一对象,而c、d就不同了,它们两个终于会指向两个新创建的不同的对象,运行c==d时,自然不会相等。如今大家该明确了吧。

明确了这个原理,最重要的还是要应用于实际。当我们在程序中操作小整型数字的时候,我们要充分利用integer中的缓存机制,节省程序创建对象的时间,以此来提高我们程序的效率。

最后。假设有人关心==与equal的差别,请看以下这篇文章:

具体解释java中equals和==
的差别

一个关于Integer的秘密的更多相关文章

  1. 因为一个小小的Integer问题导致阿里一面没过,遗憾!

    面试题:new Integer(112)和Integer.valueOf(112)的区别 面试官考察点猜想 这道题,考察的是对Integer这个对象原理的理解,关于这道题的变体有很多,我们会一一进行分 ...

  2. 又一个js乱码的秘密alert放在js文件里中文乱码,可是放在HTML里显示中文就很好

    用文本文档打开你的js文件,文件-另存为,编码更改为UTF-8保存. 回复 | PFly | 园豆:94 (初学一级) | 2017-07-17 21:32 显示结果中文乱码 支持(0)反对(0)回复 ...

  3. 一个关于integer表示范围的问题

    1:在做字符串parse为integer 类型市,一直出现问题就是当我parse “”2851663837”报错, 但是当我parse “1417585794”  可以.原来是超出integer 类型 ...

  4. [置顶] 请听一个故事------>你真的认为iPhone只是一部手机?苹果惊天秘密!!

    在网上看到的一篇小说,感觉有点意思,转载过来大家一起围观下,作者很幽默很风趣. 导读:iPhone的隐藏功能!Jobs的军方身份!图灵服毒自杀的传奇故事!中兴华为的神秘背景! 你真的认为iPhone只 ...

  5. 请听一个故事------>你真的认为iPhone只是一部手机?苹果惊天秘密!!

    在网上看到的一篇小说,感觉有点意思,转载过来大家一起围观下,作者很幽默很风趣. 导读:iPhone的隐藏功能!Jobs的军方身份!图灵服毒自杀的传奇故事!中兴华为的神秘背景! 你真的认为iPhone只 ...

  6. 【转载】C#之int与Java之Integer的区别

    本文涉及到一些JVM原理和Java的字节码指令,推荐感兴趣的读者阅读一本有关JVM的经典书籍<深入Java虚拟机(第2版)>,将它与我在<.NET 4.0面向对象编程漫谈>中介 ...

  7. 【转】理解Java Integer的缓存策略

    本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性.首先看一个使用 Integer 的示例代码,展示了 Integer 的缓存行为 ...

  8. 理解Java Integer的缓存策略

    转载自http://www.importnew.com/18884.html 本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的一个有助于节省内存.提高性能的特性. ...

  9. Integer.parseInt(String s) 和 Integer.valueOf(String s) 的区别

    通过查看java.lang.Integer的源码可以发现, 它们最终调用的都是 /** * Parses the string argument as a signed integer in the ...

随机推荐

  1. mongoose的populate的使用方法;

    LotteryReceiveRecord.find({"lottery":req.params.id}).populate("user lottery").ex ...

  2. saiku中多cube排序问题

    如题,一个schema中如果有多个cube(常有),那cube之间是如何排序显示的? 我们看一下OlapMetaExplorer.java文件的getConnection方法,其中有一行 Collec ...

  3. 比较两个data日期之间的天数相差

    先将字符串转化为Date类型 转化方式参看:http://blog.csdn.net/caoyinghui1986/archive/2008/04/18/2303570.aspx 然后在调用Date. ...

  4. ZooKeeper源码阅读(二):客户端

    源代码: http://svn.apache.org/repos/asf/zookeeper/trunk/ 导入eclipse: 在包含build.xml目录下执行ant eclipse将产生.cla ...

  5. 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)

    前言 本章将实现非常实用的功能——下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术 ...

  6. openstack之neutron linuxbridge + vlan组网

    linuxbridge是和linuxbridge plugin匹配的core agent,主要实现L2层的功能和security group的功能.security group的功能逐渐会被neutr ...

  7. JS学习笔记(二)运算符和流程控制语句

    js中的运算符和流程控制,循环,判断语句都和C#基本一致,但又有其独特的运算符. typeof运算符 获得数据的数据类型,如number,string等.语法: string typeof(变量); ...

  8. JavaScript引用类型之Array数组的拼接方法-concat()和截取方法-slice()

    1.concat()   基于当前数组中的所有项创建一个新数组(也就是副本),然后将接收到的参数添加到副本的末尾,最后返回新构建的数组.也就是说,concat()在向数组中追加元素时,不会改变原有数组 ...

  9. SQL中日期格式转换为年月日

    )

  10. Windows Server 中开启 SQL Server 2008 的1433端口

    在Windows Server2008 服务器上部署了Microsofit SQL Server2008 R2 ,想让远程机器能够访问,于是开放1433端口,进行了如下设置: 1.打开“本地安全策略” ...