CKi*_*ing 6 java equals immutability
考虑两个类型为Integer的引用,它们调用静态工厂方法valueOf,如下所示: -
Integer a = Integer.valueOf("10");
Integer b = Integer.valueOf("10");
Run Code Online (Sandbox Code Playgroud)
考虑到Integer是不可变的,可以使用==而不是使用equals方法来比较a和b.我猜测valueOf方法确保只创建一个值为10的Integer实例,并为每个使用值10创建的Integer返回对此实例的引用.
一般来说,通过使用==而不是equals来比较使用对同一静态工厂方法的调用创建的不可变类的两个引用是否可以?
编辑:Integer类仅用作示例.我知道如果使用==进行比较,那么Intgers高达127将返回true.我需要知道的是,当升创建自己的不可变类,说MyImmutable用的方法创建(),这将确保不会创建重复MyImmutable对象,会是确定的,如果我比较使用由create方法创建2个MyImmutable引用使用==而不是等于.
不,这一般不安全.该==运营商比较参考,并不值.
使用==恰好适用于-128和127之间的整数,但不适用于其他整数.以下代码演示了==并不总是有效:
Integer a = Integer.valueOf(10);
Integer b = Integer.valueOf(10);
System.out.println(a == b);
true
Integer c = Integer.valueOf(1000);
Integer d = Integer.valueOf(1000);
System.out.println(c == d);
false
Run Code Online (Sandbox Code Playgroud)
看到它在线工作:ideone
这种行为的解释在于Integer.valueOf:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
Run Code Online (Sandbox Code Playgroud)
还不是标准要求小输入(-128到127)的装箱整数给对象提供相同的参考.
5.1.7拳击转换
如果被装箱值p是真,假字节,在范围\ u0000的一个char到\ u007f,或-128和127之间int或短号码,然后让r1和r2是任何两个装箱转换的结果p.始终是r1 == r2的情况.
但是,该标准对此范围之外的整数没有这样的保证.
一般来说,通过使用==而不是equals来比较使用对同一静态工厂方法的调用创建的不可变类的两个引用是否可以?
如上所示,它一般不起作用.但是如果你确保具有相同值的两个不可变对象总是具有相同的引用,那么是的,它可以工作.但是,您必须仔细遵循一些规则:
如果您的工厂方法为相同的输入返回相同的对象,则可以安全地将它们与==进行比较.例如,String.intern以这种方式工作.枚举也可以与==进行比较.但是Integer.valueOf仅为-128 ... 127范围返回相同的对象(在默认配置中).
Integer.valueOf(127) == Integer.valueOf(127)
Run Code Online (Sandbox Code Playgroud)
但
Integer.valueOf(128) != Integer.valueOf(128)
Run Code Online (Sandbox Code Playgroud)
一般来说,您应该使用equals方法来比较任何对象.当对象具有少量不同值时,可以使用运算符==来提高性能.除非你100%确定自己在做什么,否则我不建议使用这种方法.
| 归档时间: |
|
| 查看次数: |
2299 次 |
| 最近记录: |