Java 下面的代码打印;真的,真的,假的,真的;。不应该';不是吗;真的,真的,真的,真的;?

Java 下面的代码打印;真的,真的,假的,真的;。不应该';不是吗;真的,真的,真的,真的;?,java,Java,我不明白为什么它没有打印“真的,真的,真的,真的”。请给出答案?当您使用==时,您正在比较对象实例是否相等 前两个实例相等的原因是您使用自动装箱(而不是调用新整数(127))创建了整数,并且需要缓存-128和127之间的整数 实现可以缓存更多的值,但不需要;显然,您正在使用的JVM不会缓存128。Sun Java 6就是这样。Integer是一个类。如果键入new Integer(),则创建一个新对象。所以i,j,i1和j1都是不同的对象。如果使用==则仅在同一对象上为真。对于小于128的整数,

我不明白为什么它没有打印“真的,真的,真的,真的”。请给出答案?

当您使用
==
时,您正在比较对象实例是否相等

前两个实例相等的原因是您使用自动装箱(而不是调用
新整数(127)
)创建了
整数,并且需要缓存-128和127之间的
整数


实现可以缓存更多的值,但不需要;显然,您正在使用的JVM不会缓存128。Sun Java 6就是这样。

Integer是一个类。如果键入new Integer(),则创建一个新对象。所以i,j,i1和j1都是不同的对象。如果使用==则仅在同一对象上为真。对于小于128的整数,JVM总是使用同一个对象,因此输出为true。

否不应该:

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));
自动装箱导致在您使用的Java实现中创建两个不同的整数对象

如果整数值在-128到127之间,那么JLS声明将使用相同的整数对象;看见但是,JLS不要求
i1
i2
必须具有超出该范围的不同值。事实上,JLS中的以下讨论表明:

理想情况下,装箱一个给定的原语值p,总是会产生一个相同的引用。在实践中,使用现有的实现技术可能不可行。上述规则是一种务实的妥协。上面的最后一条要求将某些公共值始终装箱到不可区分的对象中。实现可以延迟或急切地缓存这些数据

对于其他值,此公式不允许程序员对装箱值的标识进行任何假设。这将允许(但不要求)共享部分或所有这些引用

这确保了在大多数常见情况下,行为将是所需的,而不会造成不适当的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存-32K-+32K范围内的所有字符和短字符以及整数和长字符


为了补充所有其他正确答案,请看一下,以便完全理解@mmyers所说的内容:

Integer i1 = 128;
Integer j1 = 128;
584/**
585*返回一个{@code Integer}实例,表示指定的
586*{@code int}值。如果未找到新的{@code Integer}实例
587*必需,通常应优先使用此方法
588*构造函数{@link#Integer(int)},因为这种方法很可能
589*通过
590*缓存频繁请求的值。
591        *
592*@param i是一个{@code int}值。
593*@返回表示{@code i}的{@code Integer}实例。
594*@自1.5
595        */
596公共静态整数值(int i){
597最终整数偏移=128;

598如果(i>=-128&&i)我提出了一个如此具体的问题,嗯,suspicious@Will我在SCJP的书中看到过同样的问题我打赌它会返回false,true,false,true,而不是true,true,false,true@Markus:那将是一个不兼容的JVM。+1@James,这是java2的一个棘手问题。你如何用英语拼写2?@PP-一定是在你睡觉之后:-)如果我没记错的话,Sun Java 7将有一个可配置的整数缓存。我认为它在一些基准测试中特别有用。您还必须知道,
Integer I=x
在内部编译为
Integer.valueOf(x)
,确实如此。谢谢,我觉得缺少了一些东西。
  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       }