首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中,运算符对原语类型和原始包装类是否执行相同的操作?

在Java中,运算符对原语类型和原始包装类是否执行相同的操作?
EN

Stack Overflow用户
提问于 2015-08-26 21:03:37
回答 3查看 976关注 0票数 1

我们都知道,java中的原语有数学运算符和逻辑运算符,您可以在它们上使用。我的问题是,同样的操作逻辑是否适用于它们的表亲,即原始包装类。

代码语言:javascript
复制
Integer a = new Integer(2);
Integer b = new Integer(2);

Integer c = a * b;  //Does c.integerValue() returns 4?
boolean d = a == b; //Is d true? 
Integer e = a | c;  //Does e.integerValue() return 6?
Integer f = c % a;  //Does f.integerValue() return 0?
a++;                //Does a.integerValue() return 3?

所有运算符会对原语类型和原始包装类执行相同的操作吗?如果没有,那么哪些操作符可以同时处理原语和它们的对象包装器?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-26 21:35:50

等式操作符(==!=)在使用包装类时不可靠。

首先,它们通常比较对象引用,而不是对象值。例如:

代码语言:javascript
复制
Integer a = new Integer(24);
Integer b = new Integer(24);
System.out.println(a == b); // Prints false
System.out.println(a != b); // Prints true

其次,如何创建包装类很重要,例如:

代码语言:javascript
复制
Integer a = 24;
Integer b = 24;
System.out.println(a == b); // Prints true
System.out.println(a != b); // Prints false

在本例中,当取消装箱时,Integer使用Integer.valueOf,而后者则对-128至127之间的数字使用缓存(IntegerCache)。这个实现应该对这种奇怪的行为负责。

实际上,IntegerCache类的实现允许在运行程序时通过属性java.lang.Integer.IntegerCache.high配置上限。

这也适用于Long

经验教训是,您最好在包装器中使用equals()方法。

其余的操作符应该工作,因为在应用运算符之前,对象中的值是自动装箱的。

票数 5
EN

Stack Overflow用户

发布于 2015-08-26 21:08:43

不,特别是==!=比较参考文献。

这意味着new Integer(1) != new Integer(1)

所有其他操作基本上是一样的。

票数 2
EN

Stack Overflow用户

发布于 2019-08-09 06:44:47

除了上面给出的答案之外,我还想添加以下内容:在对包装类型执行数学操作时要小心。因为你可以得到NullPointerException。考虑一下这个例子:

代码语言:javascript
复制
    Double a = 5.0;
    Double b = null;

    System.out.println(a + b);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32236654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档