正如其他人所说,==而.equals比较值进行比较引用。 ==比.equals更快,但是如果一个对象的多个实例可以具有相同的值并且您正在比较这些值,则不能使用==并且期望它是正确的。如果两个对象是不同的实例,但具有相同的值,则==将返回false。
这就是说,有一些不可变对象实现“实例控制”。
他们使用静态工厂方法执行此操作。该类将定义已创建的所有对象的实例的静态地图。静态工厂方法将使用传递给它的参数实例化一个对象。但是,在返回对象之前,它会检查Map以查看它是否具有相同值的对象。
如果找到一个相等,则返回具有相同价值的新创建的对象,而不是地图的对象。
如果它没有找到一个对象,它是平等的,它增加了新创建的对象的地图和返回新对象。
这样做的好处是,对于实现例如控制对象,它是安全的使用==检查值相等,因为没有办法具有相同值的两个物体将永远存在。
Effective Java讨论第二章实例控制2
Guava有类调用Interners使得它琐碎对于希望实现例如控制通过存储在Interner本身构造的对象这样做的一类。
像这样实现实例控制的不可变对象应该表明它们在文档中执行。如果他们这样做,你知道使用==来检查值是否平等是安全的。但是,对于不实现实例控制的任何不可变对象,应始终使用.equals来检查值是否相等。 '.equals`存在于哪种语言中?
?请相应地标记您的问题。 – Floris
有一些罕见的情况(不能想象一个快速的例子,但是)你想确保有*完全相同的*对象与看起来相同的对象。字符串不太可能,对于其他类更可能。 –
我的想法不正确。等于以多种语言存在? – Kulahan