开始使用java.util.UUID
。我的问题是,如果我有两个UUID变量,比如u1和u2,我想检查它们是否相等,我可以安全地使用表达式u1 == u2
还是必须写u1.equals(u2)
?假设两者都不为空。
BTW,我正在使用其randomUUID
方法创建新的UUID值,但我认为这不应该是问题。
我想知道UUID是唯一的,每个值都可以是单例,然后使用u1 == u2
是安全的。
void method1(UUID u1, UUID u2) {
// I know it is always safe to use equal method
if (u1.equals(u2)){
// do something
}
// is it safe to use ==
if (u1 == u2) {
// do something
}
}
答案 0 :(得分:54)
这取决于:你想要哪种类型的平等?
UUID a = new UUID(12345678, 87654321);
UUID b = new UUID(12345678, 87654321);
UUID c = new UUID(11111111, 22222222);
System.out.println(a == a); // returns true
System.out.println(a.equals(a)); // returns true
System.out.println(a == b); // returns false
System.out.println(a.equals(b)); // returns true
System.out.println(a == c); // returns false
System.out.println(a.equals(c)); // returns false
仅当a == b
和a
是同一个对象时, b
才有效。如果它们是两个相同的对象,它仍然是错误的。
a.equals(b)
和a
具有相同的UUID值,则 b
为真 - 如果它们的两个部分相同。
答案 1 :(得分:3)
嗯......没有。
==
针对对象检查引用相等性。也就是说,它检查这两个对象是否在内存中确实是相同的位置。
.equals()
将检查实际对象的等效性。并且,Javadoc for UUID
详细说明了两个UUID
实例的等效时间。
答案 2 :(得分:0)
由于糟糕的ood(而且出于兼容性原因),它们通常不是重量级对象!因此,这是一个陷阱。
只有在提供了静态工厂方法来创建实例的flyweight对象中,您才能确定使用==
而不是.equals(
。不幸的是,因为您有一个公共构造函数,所以没有flyweight模式。
这意味着您确实必须使用.equals(
。