Java Integer Cache

Java 代码

public class IntegerDemo {
public static void main(String[] args) {
Integer a = new Integer(1);
Integer b = 1;
int c = 1;
System.out.println(a == b);
System.out.println(a == c);
System.out.println(b == c); Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
}
}

运行结果

```
false
true
true
true
false
```

反编译代码

```java
public class IntegerDemo {
public static void main(String[] args) {
Integer a = new Integer(1);
Integer b = Integer.valueOf(1);
int c = 1;
System.out.println(a == b);
System.out.println(a.intValue() == c);
System.out.println(b.intValue() == c);

    Integer f1 = Integer.valueOf(100);
Integer f2 = Integer.valueOf(100);
Integer f3 = Integer.valueOf(150);
Integer f4 = Integer.valueOf(150);
System.out.println(f1 == f2);
System.out.println(f3 == f4);
}

}

</div>

```java
public class Test {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals(a + b));
System.out.println(g == (a + b));
System.out.println(g.equals(a + b));
}
}

运行结果

```
true
false
true
true
true
false
```

反编译代码

```java
public class Test {
public static void main(String[] args) {
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(2);
Integer c = Integer.valueOf(3);
Integer d = Integer.valueOf(3);
Integer e = Integer.valueOf(321);
Integer f = Integer.valueOf(321);
Long g = Long.valueOf(3L);
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c.intValue() == a.intValue() + b.intValue());
System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
System.out.println(g.longValue() == a.intValue() + b.intValue());
System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));
}
}
```

解析
1、Byte,Short,Integer,Long 的缓存范围为[-128,127],Character 的缓存范围为[0,127]。
2、int 和 int 之间用 == 比较,肯定为 true。另外基本数据类型没有 equals 方法。
3、int 和 Integer 之间比较,Integer 会自动拆箱,== 和 equals 肯定都为 true。
4、int 和 new Integer 之间比较,Integer 会自动拆箱,调用 intValue 方法,所以 == 和 equals 肯定都为 true。
5、Integer 和 Integer 之间比较的时候,由于直接赋值的话会进行自动装箱。所以当值在[-128,127] 中的时候,由于值缓存在 IntegerCache 中,那么当赋值在这个区间的时候,不会创建新的 Integer 对象,而是直接从缓存中获取已经创建好的 Integer 对象。而当大于这个区间的时候,会直接 new Integer。
6、当 Integer 和 Integer 之间进行 == 比较的时候,在[-128,127] 区间的时候,为 true。不在这个区间,则为 false。
7、当 Integer 和 Integer 之间进行 equals 比较的时候,由于 Integer 的 equals 方法进行了重写,比较的是内容,所以为 true。
8、Integer 和 new Integer 之间比较:new Integer 会创建对象,存储在堆中。而 Integer 在[-128,127] 中,从缓存中取,否则会 new Integer。所以 Integer 和 new Integer 进行 == 比较的话,肯定为 false ;Integer 和 new Integer 进行 equals 比较的话,肯定为 true。
9、new Integer 和 new Integer 进行 == 比较的时候,肯定为 false ;进行 equals 比较的时候,肯定为 true。原因是 new 的时候,会在堆中创建对象,分配的地址不同,== 比较的是内存地址,所以肯定不同。
10、装箱过程是通过调用包装类的 valueOf 方法实现的。
11、拆箱过程是通过调用包装类的 xxxValue 方法实现的(xxx 表示对应的基本数据类型)。

参考资料

Java Integer Cache的更多相关文章

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

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

  2. Java Integer(-128~127)值的==和equals比较产生的思考

    最近在项目中遇到一个问题,两个值相同的Integer型值进行==比较时,发现Integer其中的一些奥秘,顺便也复习一下==和equals的区别,先通过Damo代码解释如下: System.out.p ...

  3. 理解Java Integer的缓存策略

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

  4. java integer对象判断两个数字是否相等

    java integer对象判断两个数字是否相等,不一定对 问题发生的背景:javaweb的项目,起先,因为在java中实体类中的int类型在对象初始化之后会给int类型的数据默认赋值为0,这样在很多 ...

  5. Java Integer类分析

    public static final int   MIN_VALUE = 0x80000000;  -2^31 public static final int   MAX_VALUE = 0x7ff ...

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

    本文由 ImportNew - 挖坑的张师傅 翻译自 javapapers.欢迎加入翻译小组.转载请见文末要求. 本文将介绍 Java 中 Integer 缓存的相关知识.这是 Java 5 中引入的 ...

  7. Java Integer类型比较

    今天做了一道题目题目如下: Integer a=10; Integer b=10; System.out.print(a==b); Integer c=200; Integer d=200; Syst ...

  8. java --Integer 学习

    本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 在网上看到一个面试题,没有完全做, 本代码基于JDK8 //下面代码运行结果是 public class ...

  9. java Integer.valueOf 和 Integer.parseInt 和 new Integer区别及注意事项

    先看一下下面的结果 1.System.out.println(127==127); //true , int type compare 2.System.out.println(128==128); ...

随机推荐

  1. javascript和bigint

    http://note.youdao.com/noteshare?id=91e21eb1d8c20025d72d7ee6f401e34d

  2. scp 从本地往线上传文件

    scp /home/wwwroot/default/tf_ment.sql root@IP:/home/wwwroot/default/

  3. 题解 UVA1184 【Air Raid】

    有向无环图(DAG)的最小路径覆盖的模板题. 定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点. 由题意可得这是一个有向图,而路径不能相交,于是我们知道这是无向图的不相交最小路径覆盖问 ...

  4. 前端PHP入门-025-数组-重中之重

    数组是PHP中一个 很很很很很很很很很很重要 的一个 数据类型 . 学习数组,大家主要学习两部份的知识: 1.数组的定义,定义中的一些注意的坑 2.数组的函数使用 认识数组 数组定义 数组在之前我们让 ...

  5. 《深入Java虚拟机》笔记

    当运行一个Java程序的同时,也就在运行了一个Java虚拟机实例.Java虚拟机实例通过调用某个初始类的mian()方法来运行一个Java程序运行中Java程序的每一个线程都是一个独立的虚拟机执行引擎 ...

  6. 在web.xml中添加servlet报错问题

    出现这种问题的原因是因为servlet-name标签中没有名称,如果错误出现在servlet上,也是一样,补充servlet-name名称即可.如下图

  7. Zepto学习笔记

    Zepto和jQuery的很多API都很一致,思路也很相似,我不会全都整理出来,只是把一些平时用到了的或者不同的地方需要注意一下的地方总结出来.另外,Zepto现在还不是很成熟,无论是对大小写的敏感还 ...

  8. Disruptor的使用

    ..................2015年的第一天................... 本文代码托管在 https://github.com/hupengcool/disruptor-start ...

  9. LintCode 395: First Will Win 2

    LintCode 395: First Will Win 2 题目描述 有 n 个不同价值的硬币排成一条线.两个参赛者轮流从左边依次拿走 1 或 2 个硬币,直到没有硬币为止.计算两个人分别拿到的硬币 ...

  10. [BZOJ2809&1455&1367]解题报告|可并堆

    其实非常好理解..就是可以可以合并起来的两个堆嘛>< 2809: [Apio2012]dispatching Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依 ...