神奇的 Integer

JAVA herman 361浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

当你认为你已经无比强大的时候,往往细节会打败你!最近我的身边就发生了一个细节决定成败的例子!

先看下面的一段代码:

public class Xttblog {
    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));
        System.out.println(g.equals(a + h));
    }
}

你们可以先思考一下试着写出答案,看看能不能做对。

下面我公布正确答案:

true
false
true
true
true
false
true

What ?为什么结果是这样,和我想的完全不一样啊!这就是我今天要讲的主题:神奇的 Integer!

其实一点也不奇怪,因为在 Java 中会有一个 Integer 缓存池,缓存的大小是:-128~127。

神奇的 Integer

  • 使用==的情况:

    • 如果比较Integer变量,默认比较的是地址值
    • Java的Integer维护了从-128~127的缓存池
    • 如果比较的某一边有操作表达式(例如a+b),那么比较的是具体数值
  • 使用equals()的情况:

    • 无论是Integer还是Long中的equals()默认比较的是数值
    • Long的equals()方法,JDK的默认实现:会判断是否是Long类型
  • 注意自动拆箱,自动装箱问题。

在 JDK5.0 以后,JVM 在启动的时候会实例化9个对象池,这9个对象池分别用来存储八种基本数据类型的包装类(比如int对应的Integer)和String对象(当我们在程序中直接用双引号括起来一个字符串时,JVM就到String的对象池里面去找是否有一个相同值的对象,如果有就拿现成的对象,如果没有就在对象池里面创建一个对象,并返回)。

再看一下 valueOf 方法的源码:

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

很明显存在一个叫做IntegerCache的缓存了相对应的Integer的实例,当调用 valueof 的时候会优先判断对应是否存在指定区间内 如果确实在对应区间则直接返回对应缓存对象。

这样自然可以使用==来做判断!

那么我现在问你,为什么是-128~127呢?能不能改成其他的范围?

答案当然是可以,JVM 给我们提供了一个修改它的参数。可以设置 -ea -Djava.lang.Integer.IntegerCache.high=1000 参数。

-ea -Djava.lang.Integer.IntegerCache.high=1000

-ea -Djava.lang.Integer.IntegerCache.high=1000

好了,以上这些书本上可能都没有。那我是从哪里学来的呢?

答案是 java 的官网。这些东西老师不会教你,老师只会教你学习的方法,只有你自己钻研才能学会更多的本领!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 神奇的 Integer