首页 > 基础资料 博客日记
Java string的源码感悟
2026-04-26 23:00:03基础资料围观1次
极客资料网推荐Java string的源码感悟这篇文章给大家,欢迎收藏极客资料网享受知识的乐趣
package java.lang;
public final class String
implements java.io.Serializable, Comparable
// 核心:字符数组,存储字符串内容
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 的根本原因。
文章来源:https://www.cnblogs.com/517continue/p/19933937
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- 失效分析经验总结
- 和风天气 .NET SDK ( Sparrow.Qweather)使用说明
- DeepSeek V4 + GPT-5.5 一手实战,结果很意外!附 Codex 保姆级项目教程
- 从零学习Kafka:生产者分区机制
- 嵌入式 - 在VMware中安装Ubuntu虚拟机
- 代码之外周刊(第174期):游戏为什么比作业更懂孩子?
- 2026最新ios企业开发账号和企业证书申请最详教程
- C# 实现 Excel 页面自定义设置 (页面布局、打印优化)
- FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚
- 深入 Open Agent SDK(四):多 Agent 协作——子代理、团队与任务编排

