要比较UUID,我可以使用==或必须使用UUID.equals(UUID)吗?

时间:2014-05-11 04:56:40

标签: java

开始使用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
   }
}

3 个答案:

答案 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 == ba是同一个对象时,

b才有效。如果它们是两个相同的对象,它仍然是错误的。

如果a.equals(b)a具有相同的UUID值,则

b为真 - 如果它们的两个部分相同。

答案 1 :(得分:3)

嗯......没有。

==针对对象检查引用相等性。也就是说,它检查这两个对象是否在内存中确实是相同的位置。

.equals()将检查实际对象的等效性。并且,Javadoc for UUID详细说明了两个UUID实例的等效时间。

答案 2 :(得分:0)

由于糟糕的ood(而且出于兼容性原因),它们通常不是重量级对象!因此,这是一个陷阱。

只有在提供了静态工厂方法来创建实例的flyweight对象中,您才能确定使用==而不是.equals(。不幸的是,因为您有一个公共构造函数,所以没有flyweight模式。

这意味着您确实必须使用.equals(