`
xue_lang
  • 浏览: 904 次
社区版块
存档分类
最新评论

有关IntegerCache 和 == 的那点小事

    博客分类:
  • java
阅读更多

       如果你能很确定说出以下五个等式的结果,那么请绕行,稍有疑惑,那么这片博文将为你解开迷惑。

 (以下测试是在 JDK1.7下进行的)

public class IntegerCacheTest {

	public static void main(String[] args) { 
		
		int a = 1;
		Integer b1 = 1;
		Integer b2 = 1;
		Integer c1 = new Integer(1);
		Integer c2 = new Integer(1);
		Integer d1 = 128;
		Integer d2 = 128;
		
		System.out.println("a == b1 :" + (a == b1)); // true 
		System.out.println("b1 == b2: " + (b1 == b2));  // true
		System.out.println("b1 == c1: " + (b1 == c1)); // false 
		System.out.println("c1 == c2: " + (c1 == c2)); // false
		System.out.println("d1 == d2: " + (d1 == d2)); // false
	} 
}

 

 

 

1.  a == b1  (int == Integer ) 的问题:

       大家都知道java中 int  可以自动装箱为 Integer,而Integer 又可以自动拆箱为 int。  那么当 int  和 Integer 做== 时是怎样做的啦。 这时Integer 会自动拆箱为 int(调用 Integer.intValue() 方法), 然后两个 int 做 == 操作, 自然比较是值,so,结果是 true。 

 

2   Integer b1 = 1,Integer b2 = 1; 解析

     Integer 是一个类,Integer b1 = 1;时,会将等号右边的 1 自动装箱为 一个Integer对象(调用 Integer.valueOf(int)方法)。 当两个类的实例做 == 操作时,比较的是引用的地址。那结果为什么又是false?。就在valueOf() 时出了点猫腻。 IntegerCache(缓存),没错,Integer 类在加载时就new好了[-128,127] 的Integer对象,并存储到缓存中。当调用valueOf时先从缓存中找找, 如果没有就new Integer 返回,如果有就直接从缓存中返回。 两次都是从缓存中返回的 Integer(1)对象,两个引用的地址自然相同。这就是为什么 结果为true的根本所在。

 

3 Integer b1 = 1; Integer c1 = new Integer(1);
     b1 是缓存中的对象,是在Integer加载时初始化的, c1 是直接在堆中创建了。 == 自然就为false了。 

 

4 Integer c1 = new Integer(1);  Integer c2 = new Integer(1);
    这个就不解释了吧, 都直接使用 new 关键在堆中创建了对象, == 比较的是引用,自然结果就为 false了。

 

5   Integer d1 = 128; Integer d2 = 128;

    为什么在(2)中 的结果为 true, 这里为什么就为false了,原因就在于 这里是 128, IntegerCache 默认的范围为[-128,-127]。当值大于127或者小于-128在自动装箱时会 new Integer对象并返回 ,so ,两次赋值都new 了一个新的对象,因此 == 比较的是引用,结果自然为 false了。

 

有关  IntegerCache

      IntegerCache 是 java.lang.Integer 的内部类。在 Integer加载时 会从 系统参数用 读取 java.lang.Integer.IntegerCache,high 参数, 也就是IntegerCache缓存的上线, 但是只有当大于127时有效, 下线时 -128,是直接指定的,不能通过修改系统参数来改变。 同样 Long 也存在着缓存。但是其大小不能改变。

 

 

 

ps:

       刚毕业就想写写博文,但不知道以怎样的话题开始写自己的第一篇博文。偶尔看到这个问题,感觉蛮有趣,因此写篇博文记录下,做一个简单的开始。

分享到:
评论

相关推荐

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

    JAVA 中的 Integer 比较 在 Java 中,我们经常需要比较两个 Integer 对象是否相等,但是在使用 "==" 运算符时,可能会出现一些意外的结果。本文将深入探讨 Java 中的 Integer 比较,了解为什么使用 "==" 运算符可能...

    Integer IntegerCache源码阅读

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

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

    在Java 8及更早版本中,如Lukas Eder的文章中所示,可以使用反射来访问和修改IntegerCache,但这种方法并不推荐,因为它破坏了Java的封装性和安全性。在Java 9之后的版本,尽管没有明确提到对IntegerCache修改的支持...

    Integer创建对象

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

    动态创建菜单、树

    pb动态创建树和菜单 forward global type w_tv from window end type type cb_2 from commandbutton within w_tv end type type cb_1 from commandbutton within w_tv end type type sle_1 from singlelineedit ...

    Java Integer.ValueOf()的一些了解

    这是因为在Integer.ValueOf()方法中,会首先判断传入的整数值是否在-128到127之间,如果在这个范围内,就从IntegerCache中取出对应的缓存对象返回,因为i01和i02都是59,所以他们实际上是同一个对象的引用。...

    25个经典Spark算子的JAVA实现

    JavaRDD<Integer> flatNumbersRDD = nestedNumbersRDD.flatMap(new FlatMapFunction<List<Integer>, Integer>() { private static final long serialVersionUID = 1L; @Override public Iterator<Integer> call...

    用st控件来做spliter分割条

    Integer ii_barwidth = -1 // Default to negative value. long il_barcolor=78682240 long il_barmovecolor=8421504 integer ii_minobjectsize = 20 boolean ib_performredraw=True //-- Internal ...

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

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

    用VHDL语言编写的VGA显示彩条

    constant h_data: integer:=640; constant h_front: integer:=16; constant h_back: integer:=48; constant h_sync: integer:=96; constant h_period: integer:= h_sync + h_data + h_front + h_back; -- ...

    Add Digits

    一个给定的正整数,循环的将每一位相加,只要得到的结果是大于10的数,就继续循环相加

    JAVA中Integer值的范围实例代码

    return IntegerCache.cache[i + offset]; } return new Integer(i); } ``` 这个方法用于将整数值转换为 `Integer` 对象。如果整数值在-128 到 127 之间,就会从缓存中取出对应的对象;否则,就创建一个新的 `...

    JAVA-int和Integer的区别

    在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型(Primitive Type),它...

    java常见算法

    List<Integer> tmp = new ArrayList<Integer>(); Iterator<Integer> it = arrs.iterator(); while (it.hasNext()) { int a = it.next(); if (tmp.contains(a)) it.remove(); else tmp.add(a); } } 去不重 ...

    28.java基本类型封装.docx

    上述代码中的`a1`和`a2`指向同一个对象,这是因为它们的值在-128到127的范围内,因此会从`IntegerCache`中获取已存在的实例。然而,`a3`和`a4`指向不同的对象,因为它们的值超出了默认缓存的范围,导致创建了两个...

    JAVA-int和Integer的区别1.zip

    在Java编程语言中,`int`和`Integer`都是用于表示整数值的数据类型,但它们之间存在着显著的差异。理解这些区别对于编写高效且优化的Java代码至关重要。 首先,`int`是Java中的原始数据类型之一,它直接存储在栈...

    约瑟夫出圈代码,轻松解决 使用LinkedList<Integer>

    LinkedList&lt;Integer&gt; ab=new LinkedList(); for(int i=0;i;i++) ab.add(i+1); for(;;){ if(ab.size()==0)break;//结束条件 int i=1; while(i!=M){ ab.add(ab.remove());//如果没有报到M这个数字的人将其从...

    SensorNetwork

    生成具有多层Kong洞和子区域的随机多边形 ##生成区域 运行命令: USAGE: java -jar RegionGenerator.jar parameters... parameters: width=&lt;Integer&gt; height=&lt;Integer&gt; nCases=&lt;Integer&gt; ...

    Java中int和Integer的区别.doc

    Java 中 int 和 Integer 的区别 Java 中的数据类型可以分为基本数据类型和复杂数据类型,int 是基本类型,而 Integer 是一个类。下面是它们之间的主要区别: 1. 数据类型 int 是基本数据类型,直接存储数值,而 ...

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

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

Global site tag (gtag.js) - Google Analytics