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 }