我的 Java 笔记:理解 String

发布: (2026年2月5日 GMT+8 13:19)
4 min read
原文: Dev.to

Source: Dev.to

抱歉,我没有看到需要翻译的正文内容。请提供您想要翻译的文本,我会按照要求将其译成简体中文并保留原有的格式。

Java 中的字符串是什么?

String 在 Java 中是字符序列,并且是 java.lang.String 类的对象。

示例

String name = "Java";

这里,"Java" 是一个字符串字面量。

创建字符串的方法

使用字符串字面量

String s1 = "Hello";
  • 存储在 String Constant Pool(SCP)中
  • 内存高效

使用 new 关键字

String s2 = new String("Hello");
  • 在堆上创建一个新对象,独立于 SCP

为什么字符串是不可变的?

在 Java 中,String 对象在创建后无法更改。任何看似修改字符串的操作实际上都会创建一个新的 String 对象。

示例

String s = "Java";
s = s.concat(" Programming"); // a new String is created

字符串常量池 (SCP)

SCP 是堆中的一个特殊区域,用于存放字符串字面量。当创建字面量时,JVM 会检查:

  • 如果 SCP 中已经存在相同的字符串 → 复用它
  • 否则 → 在 SCP 中创建一个新对象

示例

String s1 = "Java";
String s2 = "Java"; // s1 和 s2 引用同一个对象
String s3 = new String("Java"); // 堆上的一个不同对象

为什么 SCP 很重要?

  • 通过避免重复对象来节省内存
  • 通过重用现有字符串来提升性能

字符串常量池的优势

  • 只存储相同字面量的唯一副本
  • 减少内存消耗
  • 更快的字符串字面量比较(==
  • 由于不可变性提供更好的安全性
  • 由 JVM 自动管理

字符串常量池的缺点

  • 字符串是不可变的,因此频繁修改代价高
  • 过多的字面量会增加堆内存使用
  • 创建字符串时 JVM 检查会有轻微开销
  • 对于可变操作,灵活性不如 StringBuilderStringBuffer

常用的 Java 字符串方法

length()

返回字符串的长度。

String s = "Java";
System.out.println(s.length()); // 4

charAt(int index)

返回指定索引处的字符。

System.out.println(s.charAt(1)); // a

equals(String another)

比较两个字符串的内容是否相同。

String a = "Java";
String b = "Java";
System.out.println(a.equals(b)); // true

equalsIgnoreCase(String another)

比较字符串时忽略大小写。

System.out.println(a.equalsIgnoreCase("java")); // true

compareTo(String another)

按字典顺序比较字符串。

System.out.println("Java".compareTo("Java")); // 0

toUpperCase()

将字符串转换为大写。

System.out.println("java".toUpperCase()); // JAVA

toLowerCase()

将字符串转换为小写。

System.out.println("JAVA".toLowerCase()); // java

trim()

去除字符串两端的空白字符。

String s = "  Java  ";
System.out.println(s.trim()); // "Java"

contains(CharSequence s)

检查字符串是否包含给定的字符序列。

System.out.println("Java Programming".contains("Java")); // true

startsWith(String prefix)

检查字符串是否以指定前缀开头。

System.out.println("Java".startsWith("Ja")); // true

endsWith(String suffix)

检查字符串是否以指定后缀结尾。

System.out.println("Java".endsWith("va")); // true

substring(int beginIndex)

返回从 beginIndex 开始的子字符串。

System.out.println("Java".substring(1)); // "ava"

substring(int beginIndex, int endIndex)

返回介于指定索引之间的子字符串。

System.out.println("Java".substring(1, 3)); // "av"

replace(char oldChar, char newChar)

替换字符的出现位置。

System.out.println("Java".replace('a', 'o')); // "Jovo"

split(String regex)

根据给定的正则表达式将字符串拆分为数组。

String[] words = "Java is easy".split(" ");
Back to Blog

相关文章

阅读更多 »

Java 笔记

在终端(Terminal)中使用 bash 运行 Java,命令为 `javac App.java && java App`。`javac` 将 Java 源文件 App.java 编译成字节码 App.class。`&&` 运算符在前一个命令成功后执行第二个命令。

Spring Boot 异常处理

Java 与 Spring Boot 异常处理笔记 1. 什么是 Exception? Exception = 打破程序正常流程的不期望情况。 异常处理的目标……

第3天 类和对象的细节

Class - Class 是 Java 关键字 - Class 是模板 - Class 是逻辑实体 - 类名的首字母应使用大写驼峰式,例如 SalaryAcc...