Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 指向同一整数对象的变量之间的比较_Java_Integer - Fatal编程技术网

Java 指向同一整数对象的变量之间的比较

Java 指向同一整数对象的变量之间的比较,java,integer,Java,Integer,当前程序的输出是“奇怪的”。但这两个变量共享相同的引用。为什么第二次和第三次比较不正确 Integer a; Integer b; a = new Integer(2); b = a; if(b == a) { System.out.println("Strange"); } a++; if(b == a) { System.out.println("Stranger"); } a--; if(b == a) { System.out.println("Strangest

当前程序的输出是“奇怪的”。但这两个变量共享相同的引用。为什么第二次和第三次比较不正确

Integer a;
Integer b;
a = new Integer(2);
b = a;
if(b == a) {
    System.out.println("Strange");
}
a++;
if(b == a) {
    System.out.println("Stranger");
}
a--;
if(b == a) {
    System.out.println("Strangest");
}

输出:
奇怪

这是自动装箱的产物,事实上整数在Java中是不可变的

a++
a--
大致翻译成这样

int intA = a.getInt( );
intA++;
a = Integer.valueOf( intA ); // this is a reference different from b
  • Strage
    -很明显,这两个变量指向同一个对象

  • 因为自动装箱,所以不是陌生人
    Integer
    是不可变的,因此对其执行的每个操作都会创建一个新实例

  • 不是
    最奇怪的
    ,因为上一点,并且因为您使用了
    新整数(..)
    ,它忽略了用于字节范围的缓存。如果最初使用
    Integer.valueOf(2)
    ,则将使用缓存的
    Integer
    s并打印
    最奇怪的


    • 整数对象是不可变的,现有对象中的任何更改都将创建一个新对象。因此,在
      a++
      之后,将创建一个新对象,
      a
      将开始指向该新对象,而
      b
      仍指向旧对象。因此,在
      a++
      之后,
      a
      b
      指向不同的对象,
      a==b
      将始终返回false

      关于上述示例:

      Integer a; //created Integer reference   
      Integer b;  //created Integer reference  
      a = new Integer(2);//created new Integer Object and a reference is assigned to that new object   
      b = a;//b also start pointing to same Integer object   
      if(b == a) { // b==a will be true as both are pointing to same object   
      System.out.println("Strange");   
      }
      a++; //after a++ , a new Integer object will be created (due to Integer immutablity and a will point to that new object while b is still pointing to old), so b==a will be false   
      if(b == a) { 
      System.out.println("Stranger"); 
      }   
      a--; //again a new Integer Object will be created and now a will start pointing to that new Object , so b==a will be false   
      if(b == a) { 
      System.out.println("Strangest");
      }
      

      拆箱可能就是答案。但是,我没有真正的想法。+1用于演示自动装箱的不可原谅的用法。请注意,如果您将
      a=new Integer(2)
      替换为
      a=Integer。valueOf(2)
      ,也将打印“奇怪的”,因为它将使用整数缓存获取实例。您的注释中的整数缓存是什么意思。你能详细解释一下吗?@restrictedfinity。至少在Sun的Java中,Byte、Short和Integer都有一个256个值的缓存,范围从-128到127,由
      Type.valueOf()方法提供。因此,在我们的例子中,在
      a--
      之后,int值是
      2
      ,这与我们开始时相同,因此
      Integer.valueOf(2)
      将返回相同的
      Integer
      对象。请注意,
      Long
      类型没有缓存,因此
      Long.valueOf
      始终返回一个新对象。@Alexander:可以安全地假设,此行为适用于所有JVM实现,因为它是规范的一部分。@glowcoder:我实际上正在更正该语句“至少在Sun的Java中,Byte、Short和Integer有一个256个值的缓存,范围从-128到127,由Type.valueOf()方法提供”,因为他实际上不需要提到“Sun”“爪哇;这种行为在所有实现中都是一致的,因为它是规范的一部分。当然,正如您正确地观察到的,对于不在规范确定范围内的值,没有任何确定的说法。