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

有关java中string源码和它的一些方法

String

java

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

  • final :不能被继承
  • Serializable :可序列化(传输、存文件)
  • Comparable :可以比较大小
  • CharSequence :字符序列接口

二、String 核心成员变量(最关键)

java

// 真正存储字符串内容的字符数组
private final char value[];

// 缓存 hashCode,只算一次,提高效率
private int hash;

这两个就是 String 的灵魂:

  • value[]  存文字
  • hash  缓存哈希值
  • 都是 private + final → 不可变

三、构造方法

  1. 空构造

java

public String() {
this.value = "".value;
}

创建空字符串  ""

  1. 传入字符串

java

public String(String original) {
this.value = original.value;
this.hash = original.hash;
}

直接复用原字符串的数组

  1. 传入字符数组

java

public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}

复制新数组,防止外部修改影响字符串

  1. 截取字符数组一部分

java

public String(char value[], int offset, int count)

从  offset  开始取  count  个字符

  1. 字节数组构造

java

public String(byte bytes[])
public String(byte bytes[], String charsetName)

把字节按编码转成字符串(文件、网络常用)

四、最常用方法源码逻辑(必考必懂)

  1. equals() 比较内容(源码)

java

public boolean equals(Object anObject) {
// 1. 先比地址,相同直接true
if (this == anObject) {
return true;
}
// 2. 判断是不是String
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
// 3. 比长度
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
// 4. 逐个比字符
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

  1. hashCode() 哈希值

java

public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
// 经典公式:31 * h + 当前字符
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}

  1. charAt() 获取某个字符

java

public char charAt(int index) {
// 检查下标越界
if (index < 0 || index >= value.length) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}

  1. length() 长度

java

public int length() {
return value.length;
}

  1. substring() 截取字符串

java

public String substring(int beginIndex, int endIndex) {
// 边界检查...
// 直接新建一个字符串,复制一部分
return new String(value, beginIndex, endIndex - beginIndex);
}

特点:返回新串,不改原串

  1. contains() 是否包含

java

public boolean contains(CharSequence s) {
return indexOf(s.toString()) > -1;
}

  1. indexOf() 查找位置

java

public int indexOf(String str) {
// 遍历查找,返回第一次出现的下标,找不到返回-1
}

  1. replace() 替换

java

public String replace(char oldChar, char newChar) {
// 新建数组 → 替换 → 返回新字符串
}

不改原串

  1. trim() 去前后空格

java

public String trim() {
// 去掉首尾空格 → 返回新串
}

  1. split() 分割字符串

java

public String[] split(String regex) {
// 按规则切割成字符串数组
}

  1. toUpperCase() / toLowerCase() 大小写转换

返回新字符串,原串不变。

五、String 不可变的真正原因

1. 类是  final  → 不能继承
2.  value[]  是  private final  → 地址不能改、外部不能改
3. 所有方法都不修改原数组,只返回新字符串
4. 所以 String 一旦创建就永远不能改内容

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

相关文章:

  • WarcraftHelper魔兽争霸3优化插件:现代系统完美兼容终极方案
  • Docker AI Toolkit 2026安全配置黄金清单(2026年CIS Benchmark官方对标版)
  • 去重 DISTINCT、别名 AS
  • 异步编程CompletableFuture的那些方法allOf,anyOf
  • 2026最权威的六大降重复率工具横评
  • RabbitMQ学习2 RabbitMQ-Java客户端
  • 西恩士高端显微检测 液冷冷板清洁度显微镜分析 - 工业干货社
  • return 结果1, 结果2 在python中和在javascript中的区别
  • 【微服务与云原生架构】DevOps、CI/CD流水线、GitOps 系统性知识体系
  • YetAnotherKeyDisplayer完整指南:3大场景实战与5个深度定制技巧
  • 华硕笔记本终极优化指南:用G-Helper一键解决性能与色彩问题![特殊字符]
  • 开源金融研究智能体Dexter:基于AI的自动化投资分析实践
  • 制作加笔记
  • 量子Kerr非线性谐振器在机器学习核方法中的应用
  • WaveTools:为《鸣潮》玩家打造的全能游戏优化伴侣
  • Python零基础入门学习之输入与输出
  • 矩阵分解在推荐系统中的应用与实践
  • python click
  • 碳交易与需求响应双轮驱动的综合能源系统优化运行软件
  • 2026年3月可靠的上海钢结构厂家推荐,钢结构板房/设备钢平台/工业钢平台/仓库钢平台,上海钢结构生产厂家有哪些 - 品牌推荐师
  • python常见运算符及用法小结
  • 别留小尾巴/尽快剪掉小尾巴:从一次“ABA”字段重命名,谈谈“解决问题要彻底”
  • LocalGPT:本地化AI助手与3D生成器的架构解析与实践指南
  • MS2130芯片HDMI采集棒性能解析与应用指南
  • Hermes Agent 为什么最近总被反复提起?
  • IPXWrapper终极指南:让Windows 11完美运行90年代经典游戏联机
  • 液冷冷板清洁度颗粒测试设备 西恩士液冷设备优选厂商 - 工业干货社
  • VS Code MCP插件开发实战:手把手完成服务注册、工具发现、会话路由全流程(附GitHub可运行模板)
  • 服创大赛演示视频
  • 3大核心技术模块:WaveTools如何重塑《鸣潮》玩家的游戏体验