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

比较Integers与==到底有什么作用?

闾丘冠玉
2023-03-14
问题内容

编辑:好的,好的,我读错了。我没有将int与Integer进行比较。适当注意。

我的SCJP书说:

当==用于将原语与包装器进行比较时,包装器将被展开,并且比较将是原语与原始的比较。

因此,您会认为此代码将打印true

    Integer i1 = 1; //if this were int it'd be correct and behave as the book says.
    Integer i2 = new Integer(1);
    System.out.println(i1 == i2);

但它打印false

另外,根据我的书,这应该打印true

Integer i1 = 1000; //it does print `true` with i1 = 1000, but not i1 = 1, and one of the answers explained why.
Integer i2 = 1000;
System.out.println(i1 != i2);

不。是false

是什么赋予了?


问题答案:
Integer i1 = 1;
Integer i2 = new Integer(1);
System.out.println(i1 == i2);

当您为该i1值分配1时,将装箱,创建一个Integer对象。然后比较比较两个对象引用。引用不相等,因此比较失败。

Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1 != i2);

因为这些都是用编译时常量初始化的,所以编译器可以并且确实将它们进行内插,并使两者都指向同一Integer对象

(请注意,我将值从1000更改为100。正如@NullUserException指出的那样,仅会插入小整数。)

这是一个非常有趣的测试。看看是否可以解决这个问题。为什么第一个程序打印true,而第二个程序打印false?使用装箱和编译器时间分析的知识,您应该能够弄清楚这一点:

// Prints "true".
int i1 = 1;
Integer i2 = new Integer(i1);
System.out.println(i1 == i2);

// Prints "false".
int i1 = 0;
Integer i2 = new Integer(i1);
i1 += 1;
System.out.println(i1 == i2);

如果您了解上述内容,请尝试预测该程序的输出:

int i1 = 0;
i1 += 1;
Integer i2 = new Integer(i1);
System.out.println(i1 == i2);

(猜测之后,运行它即可查看!)



 类似资料:
  • 问题内容: 明天我要进行考试,但我听不懂书中的解释,感谢您的帮助: 输出: 为什么这会打印两个大小相同的负数而不是正负数? 问题答案: 由于无声整数溢出:is 和is ,因此is ,即is ,根据定义,它对于整数而言太大。因此它溢出并变成… 您还可以检查: 打印相同的东西。 从技术上讲,结果由Java语言规范#15.18.2定义: 如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码

  • 比较三个整数变量是您可以轻松编写的最简单的程序之一。 在此程序中,您可以使用scanf()函数从用户获取输入,也可以在程序本身中静态定义。 我们希望它也是一个简单的程序。 我们将一个值与其余的两个值进行比较并检查结果,并对所有变量应用相同的过程。 对于此程序,所有值都应该是不同的(唯一的)。 算法 (Algorithm) 让我们首先看看比较三个整数的分步过程应该是什么 - START Ste

  • 比较两个整数变量是您可以轻松编写的最简单的程序之一。 在此程序中,您可以使用scanf()函数从用户获取输入,也可以在程序本身中静态定义。 我们希望它也是一个简单的程序。 我们只是比较两个整数变量。 我们首先看一下算法,然后是流程图,然后是伪代码和实现。 算法 (Algorithm) 让我们首先看看比较两个整数的分步过程应该是什么 - START Step 1 → Take two inte

  • 问题内容: 我有一个应该相等的整数(我通过输出验证了它)。但是在我的情况下,Java看不到这些变量具有相同的值。 我有以下代码: 并产生以下输出: 可能我必须添加定义如下的内容: 并且我们从环路构造采取: 因此,这两个变量都具有整数类型。 问题答案: 查看本文:装箱的值和相等性 使用或比较包装器类型(例如s,s或s)时,您 会将它们作为引用* 而不是值 进行比较 。 * 如果两个变量指向不同的对象

  • 问题内容: 我网站上的链接不起作用,我得到了在锚点上使用的解决方案,而没有得到真正的解释。有人能帮我吗? 问题答案: 是jQuery Mobile的功能。默认情况下,JQM将尝试通过ajax加载页面,以改善用户体验和转换。如果设置,则JQM将执行普通的页面请求,而不使用ajax。这可以用于表单以及链接。 从文档: 这告诉框架重新加载整个页面以清除URL中的Ajax哈希 如果要禁用所有链接上的aja

  • 首先,我想我可能把这个问题命名得不好,但是我想不出合适的词,所以请随意建议编辑,我会做出来,这样这个问题就更有教育意义,也更与他人相关。 我知道javax。Swing不能用于Android项目,我接受了这一点,并学习了基于Android XML的UI设计,但出于好奇,我想知道确切的原因。 我意识到,手机的屏幕尺寸可能是Swing无法很好地处理的,但要阻止开发人员简单地导入javax。Swing软件