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就是这种情况.
只是为了添加所有其他正确的答案,看一下源代码,以便完全理解@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)
整数是一个类.如果键入new Integer(),则创建一个新对象.所以i,j,i1和j1都是不同的对象.如果你使用==它只对同一个对象是真的.对于小于128的整数,JVM始终使用相同的对象,因此输出为true.