我的 Java 笔记:理解 String
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 检查会有轻微开销
- 对于可变操作,灵活性不如
StringBuilder或StringBuffer
常用的 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(" ");