文档章节

Java Integer中的IntegerCache小记

m
 modprobe
发布于 2016/11/08 09:57
字数 250
阅读 20
收藏 0
 
同事今天给我发了一个关于Java拆装箱的ppt,里面有这么一段代码
Integer c = Integer.valueOf(3);
Integer d = Integer.valueOf(3);
Integer e = Integer.valueOf(321);
Integer f = Integer.valueOf(321);
System.out.println(c == d);
System.out.println(e == f);

输出是 ,可是为什么呢

true
false

我们看一看Integer的源码

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
内部类IntegerCache的代码
private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

 可以看出来,[-128, 127]之间的数都缓存了,是同一个对象。这个范围之外的就不是同一个对象了,所以e==f是false

本文转载自:http://www.cnblogs.com/modprobe/p/5391886.html

共有 人打赏支持
m
粉丝 1
博文 35
码字总数 0
作品 0
谈谈Integer中的静态类IntegerCache

学习的本质就是一个赋值的过程,用新知识来覆盖你的旧知识或者无知(null)。掌握知识是自己的, 分享知识,才能帮助更多的人,创造更大的价值。学贵以恒,以此自勉,与君共享。----曦阳X 上...

曦阳x
07/04
0
0
Integer--类中的对象池

publicfinal classInteger extends Number implements Comparable<Integer> { public static IntegervalueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <=......

只想一个人静一静
2014/03/09
0
0
Java自动装箱与拆箱及其陷阱

在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时这种特性也留有一个陷阱。开发者如果不注意,就会很容易跌入...

LCZ777
2014/07/26
0
0
理解Java Integer的缓存策略

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

analogous_love
04/26
0
0
聊聊JavaScript和Scala的表达式 Expression

先看下这段神奇的Java代码: 执行结果:2 + 2 = 5 那么doSomethingMagic到底做了什么神奇的事情呢?先看代码: 所以这个例子其实包含了Java中整型类型Integer的一个知识点。 可能有的朋友对于...

jerrywangsap
09/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java动态代理之InvocationHandler最简单的入门教程

网上关于Java的动态代理,Proxy和InvocationHandler这些概念有讲解得非常高深的文章。其实这些概念没有那么复杂。现在咱们通过一个最简单的例子认识什么是InvocationHandler。值得一提的是,...

JerryWang_SAP
11分钟前
0
0
oracle 在 MyBatis 中使用 like

两种使用方法 使用oracle自带 || 拼凑的方式 <if test="userName!=null and userName!=''"> AND u.USER_NAME like '%' || #{userName} || '%' </if> 使用MyBatis的$符号的方式 <if test="us......

karma123
16分钟前
0
0
带接口的webservice方式发布

package cn.it.ws.e;import javax.jws.WebService;/** * 面向接口的webservice发布方式 * @author Administrator * */@WebServicepublic interface JobService {publi...

江戸川
32分钟前
0
0
day122-20181020-英语流利阅读-待学习

蜘蛛侠新片《毒液》来袭!导演灵感来自哪? Roxy 2018-10-20 1.今日导读 你还记得漫威宇宙中飞檐走壁的蜘蛛侠小可爱吗?在刚过去的国庆黄金周里,索尼影业发行的漫威超级英雄蜘蛛侠系列大片《...

飞鱼说编程
42分钟前
3
0
美团点评Docker容器管理平台

美团点评容器平台简介 本文介绍美团点评的Docker容器集群管理平台(以下简称“容器平台”)。该平台始于2015年,是基于美团云的基础架构和组件而开发的Docker容器集群管理平台。目前该平台为...

Skqing
48分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部