一聚教程网:一个值得你收藏的教程网站

热门教程

坚持看完这套JDK源码系列-彻底告别CRUD开发|深度解析:java.lang.String源码精讲

时间:2026-05-28 09:25:01 编辑:袖梨 来源:一聚教程网

String类是Java中最核心的不可变字符序列,其设计理念深刻影响着JVM性能优化与安全机制。本文将深入解析其源码实现与演进历程。 一、类概述 String作为Java最常用的类,其不可变特性为字符串常量池、哈希缓存等机制提供了基础保障。 继承体系:直接继承自Object基类 接口实现:支持Serializable、Comparable<String>和CharSequence 类声明:通过public final class String确保不可继承 核心功能:提供线程安全的不可变文本表示方案 二、关键字段与常量 JDK 9+ 的内存布局变化 // JDK 17 源码(java.lang.String)// 核心字段:存储字符的字节数组 private final byte[] value;// 编码标志:0 = LATIN1(每字符1字节),1 = UTF16(每字符2字节) private final byte coder;// 哈希值缓存,默认 0,延迟计算 private int hash;// 是否为哈希值 0(极少数真实哈希为 0 的情况下标记用) private boolean hashIsZero;// 编码常量 static final byte LATIN1 = 0; static final byte UTF16 = 1; 三、核心构造方法与静态工厂 // 1. 字面量(最常用,走常量池) String s1 = "hello";// 2. 从 char 数组构造(会复制数组,保证不可变性) char[] chars = {'h', 'e', 'l', 'l', 'o'}; String s2 = new String(chars);// 3. 从字节数组 + 指定字符集构造 byte[] bytes = "hello".getBytes(StandardCharsets.UTF_8); String s3 = new String(bytes, StandardCharsets.UTF_8);// 4. 从 StringBuilder / StringBuffer 构造 StringBuilder sb = new StringBuilder("hello"); String s4 = new String(sb);// 5. 静态工厂 valueOf(对 null 友好,返回 "null"") String s5 = String.valueOf(42); // "42" String s6 = String.valueOf((Object)null); // "null"(不抛 NPE) 四、核心方法源码级解析 4.1 equals(Object anObject) — 值相等的判断 public boolean equals(Object anObject) { // 优化1:引用相等直接返回 true(同一对象必然内容相同) if (this == anObject) { return true; } // 优化2:快速类型检查,非 String 直接返回 false return (anObject instanceof String aString) && (!COMPACT_STRINGS || this.coder == aString.coder) && StringLatin1.equals(value, aString.value); // 或 StringUTF16.equals } 实现原理: 优先进行引用地址比对,提升常量池对象判断效率 通过模式匹配同时完成类型检查和转换 编码格式不一致时直接判定不相等 最终委托给底层字节数组比较方法 4.2 hashCode() — 哈希值缓存机制 public int hashCode() { int h = hash; if (h == 0 && !hashIsZero) { // 延迟计算:第一次调用时才计算 h = isLatin1() ? StringLatin1.hashCode(value) : StringUTF16.hashCode(value); if (h ==

热门栏目