当前位置: 首页 > 知识库问答 >
问题:

为什么两个不同的java.util.uuid对象比较为相等?

滑文昌
2023-03-14

我创建了java.util.uuid的两个实例,如下所示。一个是从uuid.randomuuid()创建的,另一个是相同的,但在开头加上了一些附加的数字。使用uuid.equals方法比较它们时,它返回true:

UUID uuid1 = UUID.randomUUID();
UUID uuid2 = UUID.fromString("12345"+uuid1.toString());
System.out.println(uuid1.equals(uuid2));  // this gives true.

我认为添加的数字被丢弃了,并且两者给出了相同的UUID字符串值。为什么会这样?

共有1个答案

叶英哲
2023-03-14

在UUID.FromString(...)中方法:

public static UUID fromString(String name) {
    String[] components = name.split("-");
    if (components.length != 5)
        throw new IllegalArgumentException("Invalid UUID string: "+name);
    for (int i=0; i<5; i++)
        components[i] = "0x"+components[i];

    long mostSigBits = Long.decode(components[0]).longValue();
    mostSigBits <<= 16;
    mostSigBits |= Long.decode(components[1]).longValue();
    mostSigBits <<= 16;
    mostSigBits |= Long.decode(components[2]).longValue();

    long leastSigBits = Long.decode(components[3]).longValue();
    leastSigBits <<= 48;
    leastSigBits |= Long.decode(components[4]).longValue();

    return new UUID(mostSigBits, leastSigBits);
}

它所做的第一件事是将UUID的各个部分分离成组件,然后它将创建两个long。在这里,您只通过添加前导字符更改了UUID的第一个组件,您的UUID字符串例如是“12345894FF97A-039B-47FE-8A72-950B7766D50C”。所以第一个组件是“12345894FF97A”,它什么时候会做

long mostSigBits = Long.decode(components[0]).longValue();

然后您将得到“320256540146042”,其实际十六进制表示为“12345894FF97A”,然后您将得到一个位操作,将长的16位向左移位:

mostSigBits <<= 16;

这将导致“2541588541301456896”,其实际十六进制表示为“2345894FF97A0000”(我们移动了16位,所以4个十六进制字符),您开始看到正在发生什么,看到长格式只有64位,所以当移位位时丢失了一些,这里第一个字符“1”丢失了。之后,在释放的空间中,它将添加第二个组件:

mostSigBits |= Long.decode(components[1]).longValue();

这将产生“2541588541301457819”,实际十六进制表示为“2345894FF97A039B”,然后它将再次向左移动长16位:

mostSigBits <<= 16;

这将导致“-8552342864911466496”,实际十六进制表示为“894FF97A039B0000”,在这里,由于长的64位大小,您的前导字符将全部丢失。

我不需要解释方法的其余部分(在结尾处,大多数SigBits是“894FF97A039B47FE”,最少的SigBits是“8A72950B7766D50C”),您已经可以理解,在调用UUID.fromString(..)时,添加到UUID中的任何前导字符都将丢失因为只有最后8个十六进制字符(32位)将被考虑,其余的将丢失。

 类似资料:
  • 问题内容: 似乎以下代码应返回true,但返回false。 这有什么意义? 问题答案: 常规()和严格()相等之间的唯一区别是,严格相等运算符禁用类型转换。由于已经在比较两个相同类型的变量,因此使用的相等运算符的类型无关紧要。 不管您使用常规相等还是严格相等,对象比较仅 在您比较相同的精确对象时得出 。 也就是说,给定,,,但。 两个不同的对象(即使它们都具有零或相同的精确属性)也永远不会相等地进

  • 我在android工作室工作,2.1.2。 我在两个活动之间有一个神秘角色转换异常。 在第一个活动中,我有这个ArrayList: 我将arraylist(parcellable)插入到bundle中,以便在另一个活动中发送: 在第二个活动中,我将此用于恢复ArrayList 现在按照 我什么都试过了,带和不带Bundle的发送,类输出结束输出都是一样的,为什么要这样铸造呢?那我该怎么解决?? 谢

  • 问题内容: SSCCE: 以上输出: 问题答案: 异常类继承自其方法,并且不会覆盖它。每次都创建新的Exception实例,它们是内存中的不同对象。即使它们的堆栈跟踪相同,但它们在内存中的对象分配仍然不同,并且使用默认的equals()方法,它们并不相同。 但是,您可以定义自定义异常类并重写。

  • 假设我有两个列表,现在listOld包含旧员工信息,listNew包含新员工信息 我如何比较这两个列表并返回新列表,其中包含,添加的新员工列表,包含,删除的员工列表,包含上次更新已更改的员工的新列表? 我只能想到迭代列表和比较,可能最终几乎是O(n2)时间,这可以由任何util类更有效地完成吗?

  • 在爪哇中。如果我们必须将一个对象与另一个对象进行比较。我们比较该对象中的每个字段。 学生 1 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。学生 2 对象具有标记 1、标记 2、标记 3、名称、年龄作为字段。因此,要检查2名学生是否相等...我们比较每个字段。 但是,如果 Student 对象有许多字段,该怎么办?学生1对象有标记1,标记2,标记3,名称,年龄,地址,颜色,类,国家,部

  • 我有两个对象类Person和Employee。两个类都有共同的属性年龄。我已经在Arraylist中添加了这两个类的几个对象,现在我需要两个,写一个比较器,并将其传递给集合类的sort方法。并希望列表按年龄排序。我尝试这样做只是为了更清楚地使用Java中的carparable和Comparator。 编辑:我问这个问题的原因是我不清楚比较者和可比性。我在某个地方读到,如果类实现了可比较的,那么它就