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

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. c 函数传入数组。

    php 里面 直接 count($arr); 一个函数搞定, c里面想判断下数组的个数却非常困难. 想到php是C写的,那看看他的函数怎么写的不就行了... 哦,天啊,,事实比我想的要复杂的多... ...

  2. MVC 4 结合jquery.uploadify 上传实例

    前言:由于今天公司源代码服务瘫痪,没法编写代码,利用这个有限的时间,做了一个小小的 基于MVC的图片上传demo,貌似近些年来MVC十分火爆,相关的demo也数不胜数,小弟就在这里打着MVC的旗子,狐 ...

  3. OSG坐标系统

    1.世界坐标         世界坐标系描述的是整个场景中所有的对象,可以理解为绝对坐标系,所有对象的位置都是绝对坐标.从整体上考虑,它为所有对象的位置提供一个绝对的参考标准,从而避免了物体之间由于独 ...

  4. 转:Http头介绍:Expires,Cache-Control,Last-Modified,ETag

    Http头介绍:Expires,Cache-Control,Last-Modified,ETag 缓存分很多种:服务器缓存,第三方缓存,浏览器缓存等.其中浏览器缓存是代价最小的,因为浏览器缓存依赖的是 ...

  5. Delphi 编码转换 Unicode gbk big5(使用LCMapString设置区域后,再用API转换)

    原文:http://blog.dream4dev.com/article.asp?id=17 function UnicodeEncode(Str: string; CodePage: integer ...

  6. GDKOI2015 Day1

    P1 题目描述: 判断一个环形字符串(或者减去一个字符之后)是否是回文串 solution: 1.hash 将字符串的前缀进行hash,然后将字符串翻转,再做一次hash,然后枚举对称轴,判断两边的h ...

  7. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(九)

    目的 1. 使用verilog/vhdl设计一个PCI的watchdog设备. 2. 通过systemverilog 写testbench. 很久之前研究过AC97的verilog代码.但是很久没用v ...

  8. JavaScript引用类型之Array数组的排序方法

    数组中已经存在两个JavaScript给我们定义好的重排序的方法:reverse()和sort()方法,下面来简单分析下: 1.reverse()    用于反转数组项的顺序,代码如下: <sc ...

  9. JavaScript之面向对象学习五(JS原生引用类型Array、Object、String等等)的原型对象介绍

    1.原型模式的重要性不仅仅体现在创建自定义类型方面,就连所有的原生的引用类型(Obejct.Array.String等等)都在构造函数的原型上定义方法和属性.如下代码可以证明: alert(typeo ...

  10. 2014.9.25DOM元素操作

    2.操作样式class a.className=”block” class样式,代码赋值的方式 (五)找相关元素 a.nextSibling 下一层,下一个同辈元素 a.previousSibling ...