我们都知道,java中的原语有数学运算符和逻辑运算符,您可以在它们上使用。我的问题是,同样的操作逻辑是否适用于它们的表亲,即原始包装类。
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?所有运算符会对原语类型和原始包装类执行相同的操作吗?如果没有,那么哪些操作符可以同时处理原语和它们的对象包装器?
发布于 2015-08-26 21:35:50
等式操作符(==和!=)在使用包装类时不可靠。
首先,它们通常比较对象引用,而不是对象值。例如:
Integer a = new Integer(24);
Integer b = new Integer(24);
System.out.println(a == b); // Prints false
System.out.println(a != b); // Prints true其次,如何创建包装类很重要,例如:
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()方法。
其余的操作符应该工作,因为在应用运算符之前,对象中的值是自动装箱的。
发布于 2015-08-26 21:08:43
不,特别是==和!=比较参考文献。
这意味着new Integer(1) != new Integer(1)
所有其他操作基本上是一样的。
发布于 2019-08-09 06:44:47
除了上面给出的答案之外,我还想添加以下内容:在对包装类型执行数学操作时要小心。因为你可以得到NullPointerException。考虑一下这个例子:
Double a = 5.0;
Double b = null;
System.out.println(a + b);https://stackoverflow.com/questions/32236654
复制相似问题