`
yuxingfirst
  • 浏览: 50570 次
  • 性别: Icon_minigender_1
  • 来自: 湘潭
社区版块
存档分类
最新评论

关于IntegerCache的理解

    博客分类:
  • Java
 
阅读更多

今天在javaeye上看到一兄弟贴的代码,

                1:            int a = 1000, b = 1000; 
		2: 	    System.out.println(a == b); 

		3:	    Integer c = 1000, d = 1000; 
		4:	    System.out.println(c == d); 
		5:	    Integer e = 100,h = 100; 
		6:	    System.out.println(e == h);

 运行程序后,输出的结果是:true false true, 看到这个结果,我是百思不得其解,第三行跟第五行明明初始化的一样,为什么结果不一样呢,于是找答案

    原来根据java语言规范,符合规范的Java实现必须保证Integer的缓存至少要覆盖[-128, 127]的范围。

 使用Oracle/Sun JDK 6,在server模式下,使用-XX:AutoBoxCacheMax=NNN参数即可将Integer的自动缓存区间设置为[-128,NNN]。注意区间的下界固定在-128不可配置。 

在client模式下该参数无效。这个参数是server模式专有的,在c2_globals.hpp中声明,默认值是128;不过这个默认值在默认条件下不起作用,要手动设置它的值或者是开启-XX:+AggressiveOpts参数才起作用。 
在设置了-XX:+AggressiveOpts启动参数后,AutoBoxCacheMax的默认值会被修改为20000并且生效

 

从这里,也就是说在sun jdk的server模式中可以通过设置-XX:AutoBoxCacheMax这个参数来确定Integer自动缓存的大小,然后在client模式中这个参数是不支持的,但是可以通过启用-XX:+AggressiveOpts这个参数来调整Integer的自动缓存大小,可调整到20000,请看下面JVM实现代码:

// Aggressive optimization flags  -XX:+AggressiveOpts  
void Arguments::set_aggressive_opts_flags() {  
#ifdef COMPILER2  
  if (AggressiveOpts || !FLAG_IS_DEFAULT(AutoBoxCacheMax)) {  
    if (FLAG_IS_DEFAULT(EliminateAutoBox)) {  
      FLAG_SET_DEFAULT(EliminateAutoBox, true);  
    }  
    if (FLAG_IS_DEFAULT(AutoBoxCacheMax)) {  
      FLAG_SET_DEFAULT(AutoBoxCacheMax, 20000);  
    }  
  
    // Feed the cache size setting into the JDK  
    char buffer[1024];  
    sprintf(buffer, "java.lang.Integer.IntegerCache.high=" INTX_FORMAT, AutoBoxCacheMax);  
    add_property(buffer);  
  }  
  // ...  
#endif  
}  

 

然后再回到代码本身,Integer e = 100,h = 100; 这里编译器会自动帮我们进行box操作,所谓自动装箱即会调用Integer.valueOf(int)方法,

同时这个值100有事在缓存区域内,所以会直接读取缓存的内容;不过Integer c = 1000, d = 1000; 1000是大于Integer的默认缓存范围的,所以c d是不相等的。

 

同时也可以测试:Integer e = 100 ,f =  Integer.valueOf(100), 可以发现 e == f也会打印true,

但是 Integer h = 100, g = new Integer(100); g是新建了一个Integer对象, 所以h g是不相等的。

0
0
分享到:
评论

相关推荐

    Integer IntegerCache源码阅读

    1. **初始化**:`IntegerCache` 在类加载时初始化,通过一个静态代码块来设置 `high` 值,这个值可以通过系统属性 "java.lang.Integer.IntegerCache.high" 来配置,默认值是127。`low` 值始终为-128。 2. **缓存...

    Java 9中如何对IntegerCache进行修改详解

    在Java编程中,Integer类是int类型的一个包装类,提供了许多便利的方法。...在Java 9及更高版本中,虽然没有提供直接修改IntegerCache的官方途径,但可以通过理解和利用其机制来优化代码,特别是在处理大量整数对象时。

    28.java基本类型封装.docx

    if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } ``` ##### 其他包装类的常量池实现 其他包装类如`Short`、`Byte`、`...

    Integer创建对象

    对象池在`Integer`类中以内部类`IntegerCache`的形式存在,它是一个预先创建的`Integer`对象数组,数组长度为256,范围从-128到127。 这个对象池的存在是因为对于小整数(-128到127之间),`Integer`对象通常会被...

    面试中很多人走过的坑,看完让你知道Integer和Int

    在Java编程语言中,面试时常会遇到关于Integer与int之间区别的问题,这些问题是考察开发者对数据类型、内存管理和自动装箱拆箱的理解。本文将深入解析这些知识点,帮助你避免在面试中踩坑。 首先,Java有两类数据...

    Java 基础.pdf_电子版pdf版

    if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } ``` 总结来说,Java的基础知识涵盖了许多方面,从基本数据类型到封装类...

    15Java语法糖与Java编译器1

    如果想要改变这个范围,可以通过设置JVM参数`-XX:+AggressiveOpts`来提高IntegerCache.high的值,但IntegerCache.low不能被修改,这意味着小于-128的整数无法直接利用缓存的Integer对象。 Java编译器还负责其他优化...

    Integer类的缓存机制

    IntegerCache是一个数组,用于存储从-128到127(包括两端)的Integer对象。当调用`valueOf(int i)`时,会首先检查这个范围,如果在范围内,就直接从缓存中获取或插入对象;如果不在范围内,将通过`new Integer(i)`...

    CACHE的实现

    根据给定文件的信息,我们可以详细地探讨一下关于如何利用VHDL实现CACHE的基本功能及其相关技术要点。 ### CACHE的基本概念 CACHE是一种高速缓存存储器,位于CPU与主内存之间,用于提高系统的运行效率。其主要目的...

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

    IntegerCache是Integer类的一个私有静态内部类,它维护了一个-128到127的Integer对象数组。这个缓存大小可以通过JVM的启动参数`-Djava.lang.Integer.IntegerCache.high`来调整。默认值是127,但可以通过设置这个参数...

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

    这是因为Integer类内部有一个缓存池,即IntegerCache,它预先创建了-128到127之间的所有Integer对象。当我们调用valueOf()方法时,如果值在这个范围内,就会从缓存池中获取对象,而不是每次都new一个新的对象。例如...

    正则表达式、其他API

    ### 正则表达式 #### 正则表达式概述 正则表达式是一种强大的文本处理工具,能够帮助程序员实现对字符串的有效验证与处理。...通过对正则表达式和IntegerCache的理解与应用,可以提高程序的效率和可维护性。

    深入理解计算机系统(英文版)

    2.2 Integer Representations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.2.1 IntegralDataTypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...

    【Java学习】Integer.ValueOf()引发的血案

    `IntegerCache`类是`Integer`类的一个静态内部类,它的作用就是实现上述的缓存功能。这个类在类加载时初始化,创建-128到127之间的`Integer`对象,并将它们存储在一个数组`cache`中。当调用`valueOf(int i)`方法时,...

    《深入理解java虚拟机》自动装箱拆箱实例.doc

    当使用 `==` 操作符进行比较时,由于这两个对象的值都在-128到127之间,根据`Integer` 类中的缓存机制(`IntegerCache`),这些值会被缓存起来,从而使得 `c` 和 `d` 实际上指向了同一个对象,因此返回 `true`。...

    Java面试题全集.pdf

    - 缓存机制涉及到IntegerCache类,该类内部维护了一个缓存数组,用于存储-128到127(包含边界值)之间的整数值。 - 当自动装箱的值在这个范围之内时,将直接返回缓存中的Integer对象,而不是创建一个新的对象,...

    Java基础知识精选 你答对了几道?

    此外,初始化时,还可以通过设置系统属性`java.lang.Integer.IntegerCache.high`来改变这个值,但这通常需要对JVM有较深的理解。 了解这个知识点对于Java开发者来说至关重要,尤其是在面试或编写高性能代码时。虽然...

    Java拆装箱深度剖析

    如果需要调整这个范围,可以通过JVM启动参数`-Djava.lang.Integer.IntegerCache.high`设置,但必须保证不超过Integer的最大值(即`Integer.MAX_VALUE`)。 在实际开发中,理解拆装箱和Integer对象的缓存机制是非常...

    cyc学习笔记.pdf

    这是因为Integer类中有一个私有的静态内部类IntegerCache,它缓存了这些预定义的Integer对象。当创建一个新的Integer对象且其值在这个范围内时,JVM会直接从缓存池中获取,而不是在堆上新建。可以通过JVM启动参数来...

Global site tag (gtag.js) - Google Analytics