以下代码打印"true,true,false,true".它不应该是"真实,真实,真实,真实"吗?

San*_*eev 10 java

Integer i = 127;
Integer j = 127;
System.out.println(i == j);
System.out.println(i.equals(j));

Integer i1 = 128;
Integer j1 = 128;
System.out.println(i1 == j1);
System.out.println(i1.equals(j1));
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它不打印"真实,真实,真实,真实".请给出答案?

Mic*_*ers 29

使用时==,您要比较对象实例是否相等.

前两个实例相同的原因是您Integers使用自动装箱(而不是调用new Integer(127))创建了,而Java语言规范§5.1.7要求Integers缓存介于-128和127之间.

实现可以缓存更多的值,但不是必需的; 显然,您使用的JVM不会缓存128. Sun Java 6就是这种情况.


Tom*_*Tom 9

只是为了添加所有其他正确的答案,看一下源代码,以便完全理解@mmyers所说的内容:

  584       /**
  585        * Returns an {@code Integer} instance representing the specified
  586        * {@code int} value.  If a new {@code Integer} instance is not
  587        * required, this method should generally be used in preference to
  588        * the constructor {@link #Integer(int)}, as this method is likely
  589        * to yield significantly better space and time performance by
  590        * caching frequently requested values.
  591        *
  592        * @param  i an {@code int} value.
  593        * @return an {@code Integer} instance representing {@code i}.
  594        * @since  1.5
  595        */
  596       public static Integer valueOf(int i) {
  597           final int offset = 128;
  598           if (i >= -128 && i <= 127) { // must cache
  599               return IntegerCache.cache[i + offset];
  600           }
  601           return new Integer(i);
  602       }
Run Code Online (Sandbox Code Playgroud)

  • 您还必须知道`Integer i = x`在内部被编译为`Integer.valueOf(x)`. (2认同)

Mne*_*nth 5

整数是一个类.如果键入new Integer(),则创建一个新对象.所以i,j,i1和j1都是不同的对象.如果你使用==它只对同一个对象是真的.对于小于128的整数,JVM始终使用相同的对象,因此输出为true.