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)
所有运算符对原始类型和原始包装类的执行是否相同?如果不是,那么哪些运算符子集适用于原语及其对象包装器?
使用包装类时,相等运算符 (==和) 并不可靠。!=
首先,通常它们比较对象引用,而不是对象值。例如:
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()方法与包装器一起使用。
其余的运算符应该可以工作,因为对象中的值在应用运算符之前会自动装箱。