java之UUID.randomUUID().toString()详细解析(全)

本文介绍了UUID(通用唯一识别码)的原理,包括其构成、生成过程,重点讲解了`UUID.randomUUID().toString()`的用法,并通过实战案例演示如何在多线程环境中生成并操作UUID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,主要是让让分布式系统中的所有元素,都能有唯一的辨识信息。

  • 为了提高效率,常用的UUID可缩短至16位比特数值
  • 使用UUID的一个好处是可以为新的服务创建新的标识符

1. 源码

生成的UUID标识符16位具体信息如下:

  • (1)当前日期和时间,值第一部分与时间有关(如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同)
  • (2)时钟序列
  • (3)全局唯一的IEEE机器识别号(如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得)
 public static UUID randomUUID() {
       
        SecureRandom ng = Holder.numberGenerator;
        byte[] randomBytes = new byte[16];
        ng.nextBytes(randomBytes);
        randomBytes[6]  &= 0x0f;  /* clear version        */
        randomBytes[6]  |= 0x40;  /* set to version 4     */
        randomBytes[8]  &= 0x3f;  /* clear variant        */
        randomBytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(randomBytes);
}

2. randomUUID().toString()

随机生成UUID的标识符是UUID类中的方法
而UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法

3. 实战案例

public class ThreadDemo4 {
    public static void main(String[] args) {
        //创建ArrayList集合
      List<String> list = new ArrayList<>();

        for (int i = 0; i <30; i++) {

            new Thread(()->{
                //向集合添加内容
                list.add(UUID.randomUUID().toString());
                //从集合获取内容
                System.out.println(list);
            },String.valueOf(i)).start();
        }
    }
}

代码截图
在这里插入图片描述

<think>好的,用户现在遇到了使用javac编译Java源文件时出现的编码问题,错误提示是“编码GBK的不可映射字符”。需要分析问题原因并提供解决方案。 首先,用户之前的提问是关于PATH环境变量配置的问题,现在的问题转向了编码错误,这可能意味着用户在解决了环境变量问题后,开始编译代码,但遇到了新的问题。用户提供的错误信息显示,在注释和字符串中出现了无法映射的GBK字符,这些字符显示为乱码,比如“鍚戠兢缁勪腑鍙戦?佹枃浠?”。这说明源文件保存的编码格式与javac默认使用的编码格式不一致。 接下来,我需要确定问题的根本原因。Java编译器默认使用平台默认的编码来读取源文件。在Windows系统中,默认编码通常是GBK,但如果源文件是用UTF-8保存的,尤其是包含非ASCII字符(如中文注释或字符串),就会导致编译器无法正确解析这些字符,从而抛出错误。 可能的解决方向有几个:一是指定编译器使用正确的编码参数,例如-encoding UTF-8;二是将源文件的编码改为GBK;三是统一项目中的编码设置,避免混用不同编码。 需要考虑用户的使用场景。用户可能在使用IDE(如IntelliJ IDEA或Eclipse)或者在命令行中编译。如果是命令行,直接添加编译参数即可;如果是IDE,则需要在项目设置中调整编码。用户提供的错误信息来自命令行,因此应侧重命令行解决方案。 另外,用户可能在代码中使用了非ASCII字符,比如中文注释或字符串,而文件保存时使用了UTF-8编码,导致与javac的默认GBK编码冲突。需要指导用户如何检查文件编码,并调整编译参数或文件编码。 还需要考虑用户对编码概念的理解程度。可能需要简要解释编码的作用,以及为什么会出现不匹配的问题,帮助用户理解解决方案的必要性。 可能的解决方案包括: 1. 在编译时指定编码参数:javac -encoding UTF-8 Main.java 2. 将源文件转换为GBK编码,使用记事本或高级编辑器另存为GBK格式。 3. 统一项目编码为UTF-8,并确保所有工具链(如IDE、构建工具)使用相同编码。 4. 对于长期项目,建议使用UTF-8编码,并在编译脚本或构建配置中统一设置编码参数,避免未来出现类似问题。 此外,需要提醒用户检查所有源文件的编码是否一致,避免部分文件使用UTF-8,部分使用GBK的情况。如果用户使用构建工具如Maven或Gradle,可以在配置文件中设置编码参数,确保编译时统一处理。 最后,需要验证解决方案的有效性。用户执行推荐的命令后,如果错误消失,说明问题解决。如果仍然存在错误,可能需要进一步检查是否有其他编码问题或特殊字符未被正确处理。 总结来说,用户的问题是由于源文件编码与编译器默认编码不匹配导致,解决方案是通过指定正确的编码参数或转换文件编码,并建议统一项目编码设置以避免未来问题。</think>### 🔍 问题定位 错误信息表明 **Java 编译器 `javac` 无法正确解析源代码中的非 ASCII 字符(如中文注释或字符串)**,根源是 **源代码文件的编码格式与编译器默认编码(GBK)不一致**。以下是详细分析和解决方案: --- ### ⚠️ 错误原因 1. **编码不匹配** - 你的 Java 文件(如 `Main.java`)保存时使用的编码是 **UTF-8**,而 `javac` 默认使用系统编码 **GBK** 解析文件。 - 当代码中包含中文等非 ASCII 字符时,GBK 无法正确解码 UTF-8 格式的字符 → 抛出 `不可映射字符` 错误。 2. **错误示例分析** ```java // 源代码中的实际内容(UTF-8 编码保存) //鍚戠兢缁勪腑鍙戦?佹枃浠? → 被 GBK 解码后显示为乱码 ``` - 这些乱码本质上是 **UTF-8 字节序列被错误解释为 GBK 字符** 的结果。 --- ### 🔧 解决方案 #### 方法 1:编译时指定编码参数(推荐) 通过 `-encoding` 参数明确告诉编译器使用 UTF-8 编码: ```bash javac -encoding UTF-8 Main.java ``` - **效果**:编译器会按 UTF-8 编码读取源代码,避免乱码错误。 - **验证**:重新编译后,中文注释和字符串应正常解析。 --- #### 方法 2:修改源代码文件的编码为 GBK 如果需保持 `javac` 默认行为,可将文件编码改为 GBK: 1. **使用文本编辑器(如 VS Code)**: - 打开 `Main.java` → 右下角点击当前编码(如 UTF-8) → 选择 **“通过编码保存”** → 输入 `GBK`。 2. **使用记事本**: - 打开文件 → 另存为 → 在保存对话框中选择编码为 **ANSI**(Windows 下 ANSI = GBK)。 **注意**:此方法可能导致其他工具(如 Git)因编码不一致产生问题,建议优先使用方法 1。 --- #### 方法 3:统一项目编码为 UTF-8(长期建议) 1. **所有 Java 文件保存为 UTF-8**: - 确保 IDE(如 IntelliJ IDEA、Eclipse)的项目编码设置为 UTF-8。 2. **编译脚本或构建工具中固定编码**: - **Maven**:在 `pom.xml` 中添加: ```xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ``` - **Gradle**:在 `build.gradle` 中设置: ```groovy tasks.withType(JavaCompile) { options.encoding = "UTF-8" } ``` --- ### 📌 附加验证 1. **检查文件实际编码**: - 用十六进制编辑器(如 [HxD](https://mh-nexus.de/en/hxd/))打开文件 → 查看开头字节: - **UTF-8**:可能有 BOM 头 `EF BB BF`(非必须)。 - **GBK**:无固定标识,需根据内容判断。 2. **验证编译器行为**: ```bash javac -J-Dfile.encoding=UTF-8 -encoding UTF-8 Main.java ``` --- ### ⚠️ 常见问题排查 | 问题场景 | 解决方案 | |----------|----------| | 编译通过但运行时乱码 | 添加 JVM 参数 `-Dfile.encoding=UTF-8` | | IDE 中编译仍报错 | 检查 IDE 的局编码设置(File → Settings → Editor → File Encodings) | | 部分字符仍无法识别 | 确保文件无混合编码(如复制粘贴内容时混用不同编码) | --- ### 🌰 操作示例(方法1) ```bash # 编译时指定 UTF-8 编码 javac -encoding UTF-8 Main.java # 运行程序时指定 UTF-8 编码(避免运行时乱码) java -Dfile.encoding=UTF-8 Main ``` 通过上述任一方法,编码问题应被解决。如果仍有错误,请检查文件是否完使用 UTF-8 编码保存(尤其注意从其他来源复制的代码片段)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值