UUID
的全称是 universally unique identifier
,表示通用唯一标识符, UUID
类位于 java.util
包下,自 JDK 1.5
版本新增的,它是一个 final
类,不能被继承,在平常的开发中,通常会使用 UUID
类来生成唯一的标识符,比如下面的代码:
public static void main(String[] args) {
System.out.println(UUID.randomUUID());
}
运行后,输出的结果如下:
981cd0fb-91cf-4d55-ba60-377806e6051a
上面的结果中显示的就是默认的 UUID
字符串,它是由数字、字母和 - 组成,其中数字和字母共占32个字符,- 占4个字符,总共36个字符,当我们运行上面的程序时,实际上会调用 UUID
哪些方法呢?具体如下:
UUID.randomUUID() > new UUID() > toString()
那么 UUID
是如何生成的呢?32个字符又分别代表什么含义呢?下面通过具体的源码来了解一下。
1、UUID 类定义
UUID
类实现了 Serializable
和 Comparable
接口,其定义如下:
public final class UUID implements java.io.Serializable, Comparable<UUID> {
...
}
Serializable
:它是一个标记接口,没有任何方法定义,用于对象的序列化;Comparable
:该接口只有一个compareTo
方法,通常用于对实现它的类的对象进行比较大小;
2、成员变量
UUID
类中定义了2个成员变量,分别代表最高有效64位和最低有效64位,如下:
/** 最高有效64位 */
private final long mostSigBits;
/** 最低有效64位 */
private final long leastSigBits;
mostSigBits
和 leastSigBits
它们是构成 UUID
标识符的重要组成部分。
3、构造函数
UUID
类提供了 2 个构造函数,其定义如下:
/** 私有的构造方法 */
private UUID(byte[] data) {
long msb = 0;
long lsb = 0;
// 通过 assert 断言来判定参数 data 长度是否为 16
assert data.length == 16 : "data must be 16 bytes in length";
for (int i=0; i<8; i++)
msb = (msb << 8) | (data[i] & 0xff);
for (int i=8; i<16; i++)
lsb = (lsb << 8) | (data[i] & 0xff);
this.mostSigBits = msb;
this.leastSigBits = lsb;
}
public UUID(long mostSigBits, long leastSigBits) {
this.mostSigBits = mostSigBits;
this.leastSigBits = leastSigBits;
}
在构造函数中,主要是给成员变量 mostSigBits
和 leastSigBits
赋值,虽然 UUID
提供了 public
构造函数,但是在平时开发中,可能很少直接通过构造函数来创建 UUID
对象,更多的是使用 randomUUID()
方法,下面通过断点方式来看一下这个私有构造函数计算出的 mostSigBits
和 leastSigBits
具体值是多少,如下:
::: hljs-center
:::