在 Java 中,运算符在基本类型和基本包装类上执行相同的操作吗?

Ste*_*rna 1 java primitive object operators

众所周知,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?
Run Code Online (Sandbox Code Playgroud)

所有运算符对原始类型和原始包装类的执行是否相同?如果不是,那么哪些运算符子集适用于原语及其对象包装器?

Est*_*era 5

使用包装类时,相等运算符 (==和) 并不可靠。!=

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

Integer a = new Integer(24);
Integer b = new Integer(24);
System.out.println(a == b); // Prints false
System.out.println(a != b); // Prints true
Run Code Online (Sandbox Code Playgroud)

其次,包装类的创建方式很重要,例如:

Integer a = 24;
Integer b = 24;
System.out.println(a == b); // Prints true
System.out.println(a != b); // Prints false
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当拆箱时,Integer 会Integer.valueOf依次使用缓存 ( IntegerCache) 来存储 -128 到 127 之间的数字。该实现导致了这种奇怪的行为。

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

此也适用Long

吸取教训,您最好将该equals()方法与包装器一起使用。

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