`

Integer类中使用“==”的问题(内部缓存)

阅读更多

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

public class Test { 
  public static void main(String[] args) { 
    Integer i1 = 127; 
    Integer i2 = 127; 

    if (i1 == i2) 
      System.out.println("Equal!"); 
    else 
      System.out.println("Not equal!"); 
  } 
} 

 
    输出结果想必大家也知道,是“Equal!”。现在把i1和i2的值由127改为128看看会发生什么?结果输出“Not equal!”。
    这个问题的答案看了下面的就会清楚了。

   为了更容易理解问题,用Jad将上面代码反编译,如下:

import java.io.PrintStream; 

public class Test 
{ 

    public Test() 
    { 
    } 

    public static void main(String args[]) 
    { 
        Integer i1 = Integer.valueOf(128); 
        Integer i2 = Integer.valueOf(128); 
        Integer i3 = Integer.valueOf(128); 

        if(i1 == i2) 
            System.out.println("i1 == i2 is true!"); 
        else 
            System.out.println("i1 == i2 is false!"); 

        if(i1.intValue() >= i2.intValue()) 
            System.out.println("i1 >= i2 is true!"); 
        else 
            System.out.println("i1 >= i2 is false!"); 

        if(i1 == i3) 
            System.out.println("i1 == i3 is true!"); 
        else 
            System.out.println("i1 == i3 is false!"); 
    } 
} 

 

   从这可以看出,“Integer i1 = 127;”在JDK1.5下应该编译成了“Integer i1 = Integer.valueOf(127);”。 

 

    再看看java.lang.Integer中关于valueOf的源代码是怎样的: 

 

  public static Integer valueOf(int i) { 
    final int offset = 128; 
    if (i >= -128 && i <= 127) { // must cache 
      return IntegerCache.cache[i + offset]; //这个主意下,Cache 缓存了-128~127的值
    } 
    return new Integer(i); 
  } 

 

   可以看出,这个值在-128到127之间,会将其cached(缓存)起来,如果多次使用的话,会节省内存和改善性能;如果不在这个范围之内,则生成一个新的Integer Object instance,这样如果进行“==”时,由于是比较两个不同的Object references,故结果是false。事实上,这个特性从JDK 1.3就存在了(以前的我不清楚) 。

    确切的说,上面出现的问题实质并不是Autoboxing和Auto-Unboxing,应该是Integer类的valueOf(int i)方法,只是Autoboxing和Auto-Unboxing将这个问题掩盖了。 

    把Integer 换成 int 则不会出现上述情况,结果都是equal。

 

分享到:
评论

相关推荐

    Integer缓存池案例1

    Integer类在JDK中提供了缓存机制,用于优化Integer对象的创建和使用,特别是对于小数值。当我们在程序中创建Integer对象时,如果值在-128到127之间,Integer对象会直接从缓存池中获取或复用已存在的对象,避免了重复...

    Integer类的缓存机制

    Integer类的缓存机制在Java编程中是一个重要的概念,它涉及到对象实例化、内存管理和性能优化。Integer类作为int基本类型的包装类,它的缓存机制是通过Integer#valueOf(int i)方法来实现的,该方法在Java 1.5及更高...

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

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

    学习截图.docx

    从描述中我们可以看到,对于-128到127之间的整数,`Integer`类会使用一个内部的缓存来存储这些对象,以提高性能和减少内存开销。 这是因为Java的自动装箱和拆箱机制。当我们将一个`int`值赋给`Integer`对象时,装箱...

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

    这个方法内部有一个缓存机制,当传入的整数值在-128到127(包括两端)这个范围内时,它会从预先创建好的Integer对象缓存数组中返回一个对象,而不是每次都新建一个Integer实例。这样做是为了提高性能,因为频繁创建...

    细数java中Long与Integer比较容易犯的错误总结.docx

    `Long`类内部有一个静态内部类`LongCache`,用于缓存-128到127之间的所有`Long`对象实例。这意味着对于这个范围内的值,每次创建`Long`对象时都会从缓存中获取已有的实例,而不会创建新的对象。 ```java private ...

    第7讲 int和Integer有什么区别1

    在Java 5及更高版本中,`Integer`类引入了值缓存机制,主要是为了提高性能。在-128到127之间,当我们创建`Integer`对象时,会使用预先创建好的对象,而不是每次都通过`new Integer()`创建新的实例。这是通过`...

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

    Integer类中的`valueOf(int)`方法是关键,它会根据传入的整数值决定是否使用缓存。对于-128到127之间的值,`valueOf`会从预先创建的IntegerCache缓存中获取对象,否则会创建新的Integer对象。IntegerCache是Integer...

    正则表达式、其他API

    - **缓存原理**:在Integer类中定义了一个名为`IntegerCache`的内部类。在这个内部类中,通过一个静态代码块预先创建了一个包含256个Integer对象的数组,这些对象分别对应于-128到127之间的整数。 - **使用场景**:...

    src02 Integer

    9. **IntegerCache [Inner Class]**: `IntegerCache`是`Integer`类内部的一个缓存类,用于存储-128到127之间的`Integer`对象。这个缓存机制是为了提高性能,因为这些值经常被使用且重复创建是不必要的。 10. **...

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

    在Java 9中,Integer类内部包含了一个名为IntegerCache的静态内部类,它是一个私有的缓存,用于存储-128到127之间的Integer对象。这个缓存机制的存在是为了优化性能,因为在实际应用中,这个范围内的整数对象被频繁...

    Integer IntegerCache源码阅读

    `IntegerCache` 是一个内部私有静态类,它维护了一个缓存数组,用于存储-128到127之间的 `Integer` 对象。这个范围的选择是因为这些数值在Java虚拟机(JVM)中会被自动进行"装箱"(boxing)和"拆箱"(unboxing)操作...

    java设计模式【之】享元模式【源码】【场景:多缓存可选模式】

    * 内部状态:属性值由类生成时确定,不会改变 * 外部状态:属性值由参数决定,依赖传递值 * * 实现思路 * 多个位置的操作,需要相同的一些对象,此时将相同的一些对象封装进一个工厂内,创建后持久化到内存中 ...

    Java Integer.ValueOf()的一些了解

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

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

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

    实现 LRU 算法,和 Caffeine 和 Redis 中的缓存淘汰策略.docx

    LRU (Least Recently Used) 算法是一种常用的缓存淘汰策略,它的核心思想是优先淘汰...在 Java 中,`LinkedHashMap` 是实现 LRU 缓存的一种高效方式,但也需要理解其内部机制,以便在面试或特定场景下进行自定义实现。

    Java面试题1.docx

    - 当 Integer 值在-128到127之间时,使用自动装箱创建的Integer对象会被缓存,因此对于相同值的Integer对象,使用 `==` 比较可能会返回 `true`。否则,即使是相等的值,也可能创建了不同的对象,导致 `==` 返回 `...

    Java面试题全集.pdf

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

    28.java基本类型封装.docx

    `IntegerCache`是一个静态内部类,它默认创建了一个包含-128到127之间的所有整数对象的数组`cache`。当`valueOf`方法接收到的参数在这个范围内时,它会直接返回数组中的相应对象。 ```java public static Integer ...

Global site tag (gtag.js) - Google Analytics