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

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. java实现发送短信

    本程序是通过使用中国网建提供的SMS短信平台实现的(该平台目前为注册用户提供5条免费短信,3条免费彩信,这足够用于我们测试用了.在使用前需要注册,注册地址为http://sms.webchinese. ...

  2. row_number() over (partition by....order by...)用法 分组排序

    row_number() over (partition by....order by...)用法 分组排序 row_number() OVER (PARTITION BY COL1 ORDER BY ...

  3. git Bug分支

    Bug分支 软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接 ...

  4. poj2608---几个字母映射到同一个数字

    #include <stdio.h> #include <stdlib.h> #include<string.h> ]={,,,,,,,,,,,,,,,,,,,,, ...

  5. 米兰站热卖:奢侈品电商困局已破?-搜狐IT

    米兰站热卖:奢侈品电商困局已破?-搜狐IT 米兰站热卖:奢侈品电商困局已破?

  6. iOS 退出应用程序

    退出应用程序,方法很简单,只是动画效果没有那么好. - (void)exitApplication { AppDelegate *app = [UIApplication sharedApplicat ...

  7. uva10617 - Again Palindrome(dp)

    再次回文 输入:标准输入 输出:标准输出 时间限制: 2秒 是àpalindorme的读取相同的从左边,因为它从右侧的一个或多个字符的序列.例如,Ž,TOT和女士的 回文,但是,ADAM是不是. 给定 ...

  8. asp.net DropDownList实现ToolTip功能

    在绑定DropDownList控件时,可能出现绑定显示的文本过长以至于超过控件长度的内容看不到,这时候就需要使用ToolTip完成其功能,即鼠标放到相应选项后就可显示其完成内容. 首先,在页面引入jQ ...

  9. js 取消listbox选中的项

    <input type="button" id="cel" value="取消选择" onclick="clearListB ...

  10. 我的小前端 (2)—— JQ和zepto

    没有什么特别新技术,就是记录我做移动端遇到的问题 2016-02-16 关于JS库 JQ很简单,网上很多插件效果都依赖它,但JQ库很大 zepto.js用简单效果,很好用 <script src ...