当前位置: 首页 > news >正文

Java string的源码感悟

package java.lang;

public final class String
implements java.io.Serializable, Comparable, CharSequence {

// 核心:字符数组,存储字符串内容
private final char value[];// 缓存哈希值,默认 0
private int hash;// 序列化版本号
private static final long serialVersionUID = -6849794470754667710L;// 空字符串构造
public String() {this.value = "".value;
}
public String(String original) {this.value = original.value;this.hash = original.hash;
}
public String(char value[]) {this.value = java.util.Arrays.copyOf(value, value.length);
}
public int length() {return value.length;
}
public char charAt(int index) {if ((index < 0) || (index >= value.length)) {throw new StringIndexOutOfBoundsException(index);}return value[index];
}
public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;
}
public  substring(int beginIndex) {int subLen = value.length - beginIndex;if (beginIndex < 0) {throw new StringIndexOutOfBoundsException(beginIndex);}if (subLen < 0) {throw new StringIndexOutOfBoundsException(subLen);}return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}
public String concat(String str) {int otherLen = str.length();if (otherLen == 0) {return this;}int len = value.length;char buf[] = new char[len + otherLen];System.arraycopy(value, 0, buf, 0, len);str.getChars(buf, len);return new String(buf, true);
}
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;
}

}
源码中 String 被 final 修饰、底层存储字符的 char[] value 也被 private final 修饰,双重限制让字符串一旦创建就无法修改。我们日常使用的 substring() 、 concat() 、 replace() 等看似修改字符串的方法,本质都不是修改原对象,而是新建一个字符串对象并返回。
这让我明白:Java中字符串“修改”只是表象,底层永远是新建对象,这也是频繁拼接字符串不建议直接用 + ,要使用 StringBuilder 的根本原因。

http://www.jsqmd.com/news/705513/

相关文章:

  • jQuery UI 定制指南
  • HTTPS-加密变迁-对称-非对称-中间人攻击-证书全流程
  • 基于LLM与金融数据API构建自主研究智能体Dexter的实践指南
  • 非线性光学与虚拟布拉格光栅技术解析
  • 全网盘点5款强力降ai工具,2026年4月实测AI率降到4%!
  • 猫抓扩展:5分钟掌握网页视频下载与媒体提取的终极方案
  • 26年春季学期学习记录第29天(服创大赛作品介绍视频)
  • 深度学习框架比较
  • MySQL 8.x Binlog 核心实操:查看、切换、清理
  • ZipAgent:基于大语言模型的智能压缩包分析工具设计与实现
  • 2025届最火的五大降AI率助手实际效果
  • Keras实现InfoGAN:可控特征生成与互信息最大化
  • Krita AI Diffusion 终极指南:如何快速上手AI绘画创作
  • 从零搭建百万行代码级C++项目Dev Container:LLVM工具链预编译、cquery缓存、符号服务器直连三重加速
  • PyTorch实现单层神经网络图像分类器教程
  • 碧蓝航线Alas自动化脚本:告别繁琐操作,实现游戏全托管终极指南
  • PyCaret集成学习实战:从原理到高效模型构建
  • FLUX.1-Krea-Extracted-LoRA生成艺术展:多风格LoRA效果对比鉴赏
  • 液冷冷板清洁度检测方案 西恩士数据中心液冷专属清洁度检测方案 - 工业干货社
  • *题解:P3521 [POI 2011] ROT-Tree Rotations
  • 红牌作战的实施方法:详解红牌作战的实施方法与整改流程
  • 有关java中string源码和它的一些方法
  • WarcraftHelper魔兽争霸3优化插件:现代系统完美兼容终极方案
  • Docker AI Toolkit 2026安全配置黄金清单(2026年CIS Benchmark官方对标版)
  • 去重 DISTINCT、别名 AS
  • 异步编程CompletableFuture的那些方法allOf,anyOf
  • 2026最权威的六大降重复率工具横评
  • RabbitMQ学习2 RabbitMQ-Java客户端
  • 西恩士高端显微检测 液冷冷板清洁度显微镜分析 - 工业干货社
  • return 结果1, 结果2 在python中和在javascript中的区别