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. Xshell连接Linux服务器总掉线

    Xshell连接linux服务器总掉线,解决办法如下: 1.登录服务器后 [root@test134 ~]# cd /etc/ssh/ [root@test134 ssh]# vim sshd_con ...

  2. python基础--文件操作实现全文或单行替换

    python修改文件时,使用w模式会将原本的文件清空/覆盖.可以先用读(r)的方式打开,写到内存中,然后再用写(w)的方式打开. 替换文本中的taste 为 tasting Yesterday whe ...

  3. java project转变成java web project

    首先,你的eclipse必须得装有web插件 1.找到项目工作空间目录,打开.project文件,并修改文件, 修改如下:      找到:<natures> </natures&g ...

  4. Vue.js随笔三(npm init webpack my-project指令安装失败解决方案)

    如果没有安装淘宝给的镜像就先安装一下,指令如下,对!就是如此简单: npm install -g cnpm -registry=https://registry.npm.taobao.org 首先输入 ...

  5. 跟我一起写Makefile(二)

    Makefile 总述——————— 一.Makefile里有什么? Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 1.显式规则.显式规则说明了,如何生成一个或 ...

  6. JS函数表达的几种写法

    arguments数组形式的  用于函数  比如不知道参数有多少个或者不固定那么用到arguments function show(){ //alert(arguments.;length); ale ...

  7. html中<meta>标签

    这个是html文档一般都有的元素. 1. 介绍 元素基本所有浏览器都支持,它提供页面的元信息,比如描述.关键字.web服务等 位于文档头部的内部,将以名称/值对出现 2. 属性 注意:如果没有name ...

  8. C11线程管理:线程创建

    1.线程的创建 C11创建线程非常简单,只需要提供线程函数就行,标准库提供线程库,并可以指定线程函数的参数. #include <iostream> #include <thread ...

  9. CSS3实现鼠标hover的过渡效果

    我想让鼠标放在div上就让它旋转变大,离开div后它又恢复本来的样子. 于是我就想写一个JS,监听一个hover事件,当hover发生的时候,触发一个计时器,在计时器里写两个值,一个管角度,一个管宽度 ...

  10. iframe子夜页面调父页面的方法 取父页面的值

    1.调父页面的方法的写法 window.parent.yincang();//yincang()是父页面的一个方法 2.取父页面的值的写法 window.parent.document.gettEle ...