当前位置: 首页 > 面试题库 >

JAVA:当Integer大于128时比较不起作用

虞承泽
2023-03-14
问题内容

我已经摘录并简化了Java程序的这一部分来进行测试。任务是比较ArrayList中的两个整数并声明它们是否相等。

以下代码适用于数字<128,但任何大于128的数字,该代码将不起作用。

任何帮助都将非常棒,谢谢。

import java.util.*;

public class test
{
public static void main (String[] args)
{

Integer seat1Store = 128;
Integer seat2Store = 128;
Integer seat3Store = 0;
Integer seat4Store = 0;
Integer seat5Store = 0;


ArrayList<Integer> proceedArray = new ArrayList<Integer>();


if (seat1Store !=0)
{
    proceedArray.add(seat1Store);
}
if (seat2Store !=0)
{
    proceedArray.add(seat2Store);
}
if (seat3Store !=0)
{
    proceedArray.add(seat3Store);
}
if (seat4Store !=0)
{
    proceedArray.add(seat4Store);
}
if (seat5Store !=0)
{
    proceedArray.add(seat5Store);
}

System.out.println("ArrayList = " + proceedArray);


boolean proceed = false;


for(int i = 0; i<proceedArray.size();i++)
{
    for(int p=0; p<proceedArray.size(); p++)
    {
        if(i != p)
        {
            if(proceedArray.get(i) == proceedArray.get(p))
            {
                System.out.println("DUPLICATE");
                System.exit(0);
            }
        }
    }
    proceed = true;
}


if (proceed == true)
{
    System.out.println("PROCEEDED");
}




}
}

问题答案:

是的,这是预期的。您不应将对象引用与==或进行比较!=。您应该改用.equals(..)或更好地使用原语int而不是Integer

事实是,最多可缓存128个值,并且JVM为您提供相同的对象(因此引用比较起作用)。在128以上,它将创建一个新实例。查看的javadoc
Integer.valueOf(int)(这是在幕后发生的)

返回表示指定int值的Integer实例。如果不需要新的Integer实例,则通常应优先于构造方法Integer(int)使用此方法,因为此方法通过缓存经常请求的值可能会产生明显更好的空间和时间性能。



 类似资料:
  • 问题内容: 输出: 输出: 注意:-128至127之间的数字为真。 问题答案: 当你使用Java编译数字文字并将其分配给Integer(大写)时,编译器将发出: 当你使用自动装箱时,也会生成此行代码。 valueOf 实现了“合并”某些数字,对于小于128的值,它将返回相同的实例。 从Java 1.6源代码的第621行: high可以使用system属性将的值配置为另一个值。 如果使用该系统属性运

  • 我有一个客户对象类,它有一些变量,并且已经实现了一个关于其中一个变量的比较器。然而,我需要为不同的变量last_name实现另一个比较器。 因为我的Customer类中不能有2个compareTo()方法,所以我决定在这里专门创建一个Comparing类 但一旦触及Collections.sort(客户); 它不会激活下面的公共int比较(Customer Customer_1,Customerc

  • 问题内容: 我正在尝试摆脱Java的困扰。单元测试对我来说非常重要,因此最近我开始使用JUnit。一开始很难,但我已经掌握了。至此为止,我所有的测试都进行了工作,除了比较相同类的两个对象(我没有尝试测试创建不同类的对象的函数)。基本上,当我在类中有一个创建该类新实例的方法并尝试测试该方法时,会收到一个奇怪的错误。 “预期:runnersLog.MTLog@433c675d,但是是runnersLo

  • 问题内容: 这是我的代码段: 但是由于某种原因,正在返回,从而抛出。 问题答案: if (!”success”.equals(statusCheck))

  • 问题内容: 我很难尝试做一些简单的事情。这是代码: 我已经简化了,但这就是了解正在发生的一切的必要条件。变量“数据”是AJAX调用的结果(如果有区别的话)。问题在于它总是转到’else’语句,并警告’成功’,如果转到’else’则不应该。知道这里发生了什么吗? 编辑:这是jQuery中完整的AJAX代码: 然后在PHP响应中: 问题答案: 您可以使用以下方法在客户端修复它: 或者,一种更好的方法是