`

java Integer类的缓存

    博客分类:
  • Java
阅读更多

首先看一段代码(使用JDK 5),如下:

 

public class Hello   
{   
  public static void main(String[] args)   
  {   
    int a = 1000, b = 1000;   
    System.out.println(a == b);   
  
    Integer c = 1000, d = 1000;   
    System.out.println(c == d);   
  
    Integer e = 100, f = 100;   
    System.out.println(e == f);   
  }   
}   

 输出结果:

 

 

true  
false  
true 

 为了节省内存,对于下列包装对象的两个实例,当它们的基本值相同时,他们总是==:  

 

 Boolean  
 Byte  
 Character, \u0000 - \u007f(7f是十进制的127)  
 Integer, -128 — 127  

 查看jdk源码,如下:

/** 
     * Cache to support the object identity semantics of autoboxing for values between  
     * -128 and 127 (inclusive) as required by JLS. 
     * 
     * The cache is initialized on first usage. During VM initialization the 
     * getAndRemoveCacheProperties method may be used to get and remove any system 
     * properites that configure the cache size. At this time, the size of the 
     * cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>. 
     */  
  
    // value of java.lang.Integer.IntegerCache.high property (obtained during VM init)  
    private static String integerCacheHighPropValue;  
  
    static void getAndRemoveCacheProperties() {  
        if (!sun.misc.VM.isBooted()) {  
            Properties props = System.getProperties();  
            integerCacheHighPropValue =  
                (String)props.remove("java.lang.Integer.IntegerCache.high");  
            if (integerCacheHighPropValue != null)  
                System.setProperties(props);  // remove from system props  
        }  
    }  
  
    private static class IntegerCache {  
        static final int high;  
        static final Integer cache[];  
  
        static {  
            final int low = -128;  
  
            // high value may be configured by property  
            int h = 127;  
            if (integerCacheHighPropValue != null) {  
                // Use Long.decode here to avoid invoking methods that  
                // require Integer's autoboxing cache to be initialized  
                int i = Long.decode(integerCacheHighPropValue).intValue();  
                i = Math.max(i, 127);  
                // Maximum array size is Integer.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() {}  
    }  
  
    /** 
     * Returns a <tt>Integer</tt> instance representing the specified 
     * <tt>int</tt> value. 
     * If a new <tt>Integer</tt> instance is not required, this method 
     * should generally be used in preference to the constructor 
     * {@link #Integer(int)}, as this method is likely to yield 
     * significantly better space and time performance by caching 
     * frequently requested values. 
     * 
     * @param  i an <code>int</code> value. 
     * @return a <tt>Integer</tt> instance representing <tt>i</tt>. 
     * @since  1.5 
     */  
    public static Integer valueOf(int i) {  
        if(i >= -128 && i <= IntegerCache.high)  
            return IntegerCache.cache[i + 128];  
        else  
            return new Integer(i);  
    }  

 

IntegerCache有一个静态的Integer数组,在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中,一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。

 

再看其它的包装器:

  • Boolean:(全部缓存)
  • Byte:(全部缓存)
  • Character(<= 127缓存)
  • Short(-128 — 127缓存)
  • Long(-128 — 127缓存)
  • Float(没有缓存)
  • Doulbe(没有缓存)

 

分享到:
评论

相关推荐

    Java Integer的缓存特性

    项目里遇到的小问题的 整理

    Integer类的缓存机制

    `这行代码中,由于110在Integer缓存的范围内(-128到127),所以Integer#valueOf(int i)方法会从缓存中获取已经存在的110对应的Integer对象,因此a和b指向的是同一个对象,`a == b`的结果为`true`。 而在`Integer c...

    JAVA Integer == equal 比较 doc 比较大小 是否相等

    在 Java 中,Integer 对象在 -128 到 127 之间的值是缓存的,这意味着在这个范围内的所有 Integer 对象都是同一个对象引用。因此,当我们创建两个 Integer 对象,并将它们的值设置在这个范围内时,它们将引用的是同...

    Integer缓存池案例1

    【Integer缓存池案例1】 在Java编程中,Integer对象的使用涉及到缓存池的概念。Integer类在JDK中提供了缓存机制,用于优化Integer对象的创建和使用,特别是对于小数值。当我们在程序中创建Integer对象时,如果值在-...

    通过实例了解Java Integer类和int的区别

    Java Integer类和int的区别 Java Integer类和int是Java中两个相关却又不同的概念,很多开发者容易混淆它们之间的区别本文将通过实例来了解Java Integer类和int的区别。 知识点1:自动装箱和拆箱 在Java中,我们...

    java包装类练习.doc

    Java 包装类包括 Boolean、Byte、Character、Short、Integer、Long、Float 和 Double 八种。 1. Long 包装类型常量 cache 机制 在 Java 中,Long 包装类型的常量 cache 机制是指在 -128 到 127 之间的值会被缓存在...

    java 整型数与Integer的缓存深入理解

    Java中的整型数(int)...总之,Java中的Integer类通过缓存机制在一定范围内提高了性能,但这也需要开发者理解其工作原理,以便在编写代码时做出明智的选择。理解这些细节可以帮助我们编写出更高效、更健壮的Java程序。

    JAVA-int和Integer的区别

    需要注意的是,当进行`Integer`之间的比较时,如果值在-128到127之间,Java会使用缓存来提高性能,因此比较速度较快。但超出这个范围,每个`Integer`对象都是独一无二的,即使值相同,`==`比较也会返回`false`,此时...

    JAVA-int和Integer的区别1.zip

    在缓存和常量池方面,`Integer`类提供了一个缓存机制,用于存储-128到127之间的整数值。这意味着在这个范围内创建`Integer`对象时,如果已有相同的值存在,就会复用已存在的对象,避免了重复的内存分配。这个特性在...

    55丨享元模式(下):剖析享元模式在JavaInteger、String中的应用1

    在Java中,享元模式在Integer和String类中有显著的应用。 首先,我们来看Integer类。在Java中,基本数据类型int的封装类是Integer。在某些情况下,我们可能需要将int转换为Integer对象,这个过程称为自动装箱。反之...

    java中Integer包装类装箱的一个细节详解

    在Java编程语言中,Integer是int基本数据类型的封装类,提供了许多高级功能和与对象相关的操作。自从Java 5引入自动装箱和拆箱机制以来,我们可以在代码中方便地在int和Integer之间进行转换。然而,对于Integer的...

    Java中Integer两种转int方法比较

    这个方法通常在你需要使用`Integer`对象的特性(如缓存、比较操作或泛型方法参数)时使用。 在面试或笔试题中,如题目所示,`a = Integer.parseInt("123")`会将字符串"123"解析为`int`类型的值,并赋给变量a,所以a...

    Java包装类的缓存机制原理实例详解

    Java 包装类的缓存机制原理实例详解 Java 中的包装类缓存机制是指在 Java 5 中引入的一个功能,该功能可以帮助节省内存、提高性能。这个机制只在自动装箱时有效,即在基本类型转换为封装类对象时。 Java 中的包装...

    Java实现的树以及包含树的内存缓存框架

    随手写了一个TreeNode,顺道实现了个对应的内存缓存框架,适用于数据量不大,更新也少但是反复要读的数据,比如模块信息/组织结构/频道栏目/权限等。 PS:Java是可以直接操作内存的,只是现在的框架整合让人退化了。...

    Java 包装类

    Java包装类是Java编程语言中的一个关键特性,主要用于将基本数据类型(如int、char、boolean等)与对象之间进行转换。这是因为Java的API库中许多类和方法都设计为接收或返回对象,而基本类型不是对象。为了解决这个...

    Java 基础.pdf_电子版pdf版

    在Java 8中,Integer缓存池的大小默认为-128到127,这个范围可以通过系统属性"java.lang.Integer.IntegerCache.high"进行调整。 ```java public static Integer valueOf(int i) { if (i &gt;= IntegerCache.low && i ...

    Java Integer.ValueOf()的一些了解

    从源码中我们可以看到,IntegerCache是一个静态内部类,它在类加载的时候就会创建并保存从-128到127的整数值的缓存对象,并将他们的引用保存在cache数组中。 现在,让我们来分析一下Integer.ValueOf()方法的使用...

    java原始数据类型的包装类

    7. **Integer缓存**: - Integer类有一个特殊的优化,它会缓存-128到127之间的所有整数对象,这意味着对于这个范围内的值,多次创建Integer对象实际上是复用同一个对象。 8. **包装类与集合框架**: - 在使用集合...

    Java int与integer的对比区别

    7. **缓存**:`Integer` 类有一个内置的缓存,用于存储-128到127之间的值。这意味着对于这个范围内的 `Integer` 实例,多次创建相同的值会复用同一个对象,而不会创建新的对象。 8. **可为空**:`Integer` 可以为 `...

Global site tag (gtag.js) - Google Analytics