【问题标题】:Integer object caching整数对象缓存
【发布时间】:2023-04-03 05:15:02
【问题描述】:

我读到“因此,当使用 Integer.valueOf 创建对象或直接将值分配给 -128 到 127 范围内的 Integer 时,将返回相同的对象。”

这就是原因:-

Integer a=100;
Integer b=100;
if(a==b) // return true as both the objects are equal

但为什么不在下面这种情况下呢? 这两个值也在 127 和 -128 的范围内,因此根据上面的语句,这两个值也会返回相同的对象。

但我得到的输出是“不是”

public static void main(String[] args) {

    Integer a = 10;
    Integer b = 12;
    if(a == b)
        System.out.println("same");
    else
        System.out.println("Not");
}

谁能解释一下?

【问题讨论】:

  • 您误解了“同一个对象”。每个特定值都是同一个对象,而不是所有值的同一个对象。那是不可能的……你真的期望ab 会引用同一个对象,即使值不同?该对象如何知道 a 与值 10 相关联,b 与值 12 相关联?

标签: java caching wrapper


【解决方案1】:

只是它们不是同一个对象,它们是两个不同的 Integer 实例,用于保存给定的值,因此如果对象不同,它总是会打印 Not

【讨论】:

    【解决方案2】:

    如果您阅读实际的Java doc,您会更清楚地看到它实际在做什么

    返回一个表示指定 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用此方法而不是构造函数 Integer(int),因为此方法可能会通过缓存频繁请求的值来显着提高空间和时间性能。此方法将始终缓存 -128 到 127(含)范围内的值,并可能缓存此范围之外的其他值。

    由于返回的 Integer 必须代表指定的 int 值,所以不可能

    Integer a = 10;
    Integer b = 12;
    System.out.println((a==b));
    

    将打印“true”,因为显然同一个对象不能代表两个值。

    编辑:

    为了精确 - Java 标准不要求整数自动装箱(将原始 int 分配给 Integer 对象)使用 Integer.valueOf(),因此很有可能在符合标准的 Java 实现中

    Integer a = 10;
    Integer b = 10;
    System.out.println((a==b));
    

    将打印“假”;

    【讨论】:

    • 谢谢我只是困惑。 @dan.m
    【解决方案3】:

    您误解了“将返回相同的对象”的含义。

    因此,与== 的比较实际上是在比较内存位置,并且仅当两个变量持有相同的对象(即存储在相同的内存位置)时才返回true。

    -128 到 127 之间的值存储在整数常量池中,也就是说每 10 是相同的 10(即相同的内存位置),每 12 是相同的 12,等等。但它的不是 所有 10 也是 12 的情况,这是您的问题无意中假设的。

    无论如何,一旦超出该范围,每个原始 int 都是一个新对象,并被分配到常量池之外的新内存位置。

    您可以使用以下代码进行测试:

    public static void main(String[] args) {
    
        Integer a = 1000;
        Integer b = 1000;
        if(a == b)
            System.out.println("same");
        else
            System.out.println("Not");
    }
    

    这将打印“Not”,因为ab 是存储在不同内存位置的两个不同对象。

    这就是为什么你应该将事物与.equals()进行比较

    【讨论】:

      【解决方案4】:

      == 检查两个引用是否都指向相同的内存位置。
      在第一种情况下,两个值相同,因此它们指向同一个位置,只会创建一个对象

      Integer a=100;
      Integer b=100;
      if(a==b) // return true as both the objects are equal
      


      在第二种情况下,两个值是不同的,因此它们具有不同的内存位置,因此将创建 两个对象

      public static void main(String[] args) {
      
          Integer a = 10;
          Integer b = 12;
          if(a == b)
              System.out.println("same");
          else
              System.out.println("Not");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-30
        • 1970-01-01
        • 2012-06-06
        • 2012-10-14
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 2016-11-07
        相关资源
        最近更新 更多