Java String 类
最后修改时间:2025 年 4 月 13 日
java.lang.String 类表示 Java 中的字符串。 Java 程序中的所有字符串字面量都是作为此类的实例实现的。字符串是不可变的,这意味着它们的值在创建后无法更改。
String 类提供了用于检查单个字符、比较字符串、搜索字符串、提取子字符串以及创建具有大小写转换副本的方法。 字符串连接通过 StringBuilder 类实现,以获得更好的性能。
String 类方法
String 类提供了许多用于字符串操作和检查的方法。 关键方法包括 length、charAt、substring、equals、compareTo 和 indexOf。 这些方法能够实现全面的字符串处理。
public final class String implements Serializable, Comparable<String>, CharSequence {
public int length() {...}
public char charAt(int index) {...}
public String substring(int beginIndex) {...}
public boolean equals(Object anObject) {...}
public int compareTo(String anotherString) {...}
public int indexOf(int ch) {...}
public String toLowerCase() {...}
public String toUpperCase() {...}
public String trim() {...}
// Many more methods...
}
上面的代码显示了 String 类提供的一些基本方法。 这些方法构成了 Java 中字符串操作的核心功能。
字符串创建和基本方法
可以使用字面量或 new 关键字创建字符串。 String 类提供了像 length 和 charAt 这样的基本方法来检查字符串。 字符串字面量存储在字符串池中以提高效率。
package com.zetcode;
public class Main {
public static void main(String[] args) {
// String creation
String str1 = "Hello";
String str2 = new String("World");
String str3 = new String(new char[]{'J', 'a', 'v', 'a'});
// Basic methods
System.out.println("str1 length: " + str1.length());
System.out.println("str2 char at 2: " + str2.charAt(2));
System.out.println("str3: " + str3);
// String concatenation
String combined = str1 + " " + str2;
System.out.println("Combined: " + combined);
}
}
此示例演示了创建字符串和基本字符串操作的不同方法。 length 方法返回字符串长度,而 charAt 访问特定字符。 字符串连接会创建一个新的字符串,将现有字符串组合在一起。
字符串比较方法
可以使用 equals 进行内容比较,或使用 compareTo 进行字典顺序比较来完成字符串比较。 == 运算符比较引用,而不是内容。 可以通过 equalsIgnoreCase 进行不区分大小写的比较。
package com.zetcode;
public class Main {
public static void main(String[] args) {
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
String s4 = "JAVA";
// Reference comparison
System.out.println("s1 == s2: " + (s1 == s2)); // true (string pool)
System.out.println("s1 == s3: " + (s1 == s3)); // false
// Content comparison
System.out.println("s1.equals(s2): " + s1.equals(s2)); // true
System.out.println("s1.equals(s3): " + s1.equals(s3)); // true
System.out.println("s1.equalsIgnoreCase(s4): " +
s1.equalsIgnoreCase(s4)); // true
// Lexicographical comparison
System.out.println("\"apple\".compareTo(\"banana\"): " +
"apple".compareTo("banana")); // negative
}
}
此示例显示了不同的字符串比较技术。 == 运算符检查引用相等性,而 equals 检查内容。 compareTo 返回负数、零或正数以表示顺序。
字符串搜索方法
String 类提供了几种在字符串中搜索的方法,包括 indexOf、lastIndexOf、contains 和 startsWith/endsWith。 这些方法有助于在字符串中定位子字符串或字符。
package com.zetcode;
public class Main {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog";
// Searching methods
System.out.println("Index of 'fox': " + text.indexOf("fox"));
System.out.println("Last index of 'the': " +
text.lastIndexOf("the"));
System.out.println("Contains 'brown'? " +
text.contains("brown"));
System.out.println("Starts with 'The'? " +
text.startsWith("The"));
System.out.println("Ends with 'dog'? " +
text.endsWith("dog"));
// Finding all occurrences
int index = -1;
while ((index = text.indexOf("o", index + 1)) != -1) {
System.out.println("Found 'o' at position: " + index);
}
}
}
此示例演示了字符串搜索方法。 indexOf 查找第一次出现的位置,而 lastIndexOf 查找最后一次出现的位置。 contains 检查子字符串是否存在。 循环显示了如何查找字符的所有出现位置。
字符串操作方法
字符串操作方法包括 substring、replace、toUpperCase/toLowerCase 和 trim。 由于字符串是不可变的,因此这些方法会返回新的字符串。 原始字符串保持不变。
package com.zetcode;
public class Main {
public static void main(String[] args) {
String original = " Hello, World! ";
// Manipulation methods
String trimmed = original.trim();
String upper = original.toUpperCase();
String lower = original.toLowerCase();
String replaced = original.replace("World", "Java");
String substring = original.substring(3, 8);
System.out.println("Original: '" + original + "'");
System.out.println("Trimmed: '" + trimmed + "'");
System.out.println("Upper: '" + upper + "'");
System.out.println("Lower: '" + lower + "'");
System.out.println("Replaced: '" + replaced + "'");
System.out.println("Substring(3,8): '" + substring + "'");
// Chaining methods
String result = " Some Text "
.trim()
.toLowerCase()
.replace("some", "modified");
System.out.println("Chained result: '" + result + "'");
}
}
此示例显示了各种字符串操作方法。 每种方法都返回一个新的字符串,而不修改原始字符串。 方法链演示了如何在单个表达式中组合多个操作。
字符串拆分和连接
split 方法使用正则表达式分隔符将字符串拆分为数组。 Java 8 引入了 String.join,用于使用分隔符组合字符串。 这些方法对于处理 CSV 数据或构建路径非常有用。
package com.zetcode;
public class Main {
public static void main(String[] args) {
String csv = "apple,orange,banana,grape";
String path = "usr/local/bin/java";
// Splitting strings
String[] fruits = csv.split(",");
String[] dirs = path.split("/");
System.out.println("Fruits:");
for (String fruit : fruits) {
System.out.println(fruit);
}
// Joining strings
String joinedPath = String.join("/", "usr", "local", "bin", "java");
String joinedWithDelimiter = String.join(" - ", fruits);
System.out.println("Joined path: " + joinedPath);
System.out.println("Joined with delimiter: " + joinedWithDelimiter);
// Complex splitting
String text = "Hello;World.Another-Example";
String[] parts = text.split("[;.-]");
System.out.println("Complex split:");
for (String part : parts) {
System.out.println(part);
}
}
}
此示例演示了字符串拆分和连接。 split 可以使用简单的分隔符或正则表达式。 String.join 使用元素之间指定的字符串分隔符连接字符串。
字符串格式化
format 方法提供了类似于 printf 的 C 风格的字符串格式化。 格式说明符(如 %s、%d 和 %f)控制值如何插入到字符串中。 这对于创建格式化的输出非常有用。
package com.zetcode;
public class Main {
public static void main(String[] args) {
// Basic formatting
String formatted = String.format("Hello, %s! You have %d messages.",
"Alice", 5);
System.out.println(formatted);
// Number formatting
double price = 19.99;
String priceStr = String.format("Price: $%.2f", price);
System.out.println(priceStr);
// Date formatting
String date = String.format("Today is %tB %te, %tY",
new java.util.Date(),
new java.util.Date(),
new java.util.Date());
System.out.println(date);
// Padding and alignment
String table = String.format("%-15s %5d %10.2f%n" +
"%-15s %5d %10.2f%n",
"Apples", 10, 2.99,
"Oranges", 5, 1.49);
System.out.println(table);
}
}
此示例显示了各种字符串格式化技术。 format 方法支持不同的数据类型,并可以精确控制格式。 表格示例中演示了对齐、填充和数字格式。
字符串性能注意事项
对于密集的字符串操作,请考虑使用 StringBuilder 或 StringBuffer 代替字符串连接。 当频繁修改字符串时,这些类提供可变字符序列以获得更好的性能。
package com.zetcode;
public class Main {
public static void main(String[] args) {
// Inefficient concatenation in loop
String result = "";
for (int i = 0; i < 10; i++) {
result += i; // Creates new String each time
}
System.out.println("Inefficient: " + result);
// Efficient using StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {
sb.append(i);
}
System.out.println("Efficient: " + sb.toString());
// StringBuffer for thread safety
StringBuffer sbf = new StringBuffer();
sbf.append("Thread-safe");
sbf.append(" ");
sbf.append("version");
System.out.println(sbf.toString());
}
}
此示例比较了字符串连接方法。 效率低下的版本会创建许多临时的 String 对象。 StringBuilder 为可变字符串提供更好的性能,而 StringBuffer 提供线程安全。
来源
在本文中,我们通过实际示例介绍了 Java String 类的基本方法。 理解这些方法对于在 Java 应用程序中进行有效的字符串操作至关重要。
作者
列出所有Java教程。