Java 中 String 的知识点
1. String 的创建与初始化
1.1 创建字符串对象
在Java中,可以通过字符串字面值或使用构造方法创建字符串对象。
// 使用字符串字面值创建字符串对象
String str1 = "Hello, World!";
// 使用构造方法创建字符串对象
String str2 = new String("Hello, World!");
1.2 字符串字面值和 new 关键字的区别
- 字符串字面值创建的字符串对象在字符串常量池中,而使用 new 关键字创建的对象在堆内存中。
- 字符串字面值具有自动优化的特性,相同字面值的字符串对象在常量池中是唯一的。
2. 字符串的不可变性
2.1 不可变性概念
String 类的对象一旦创建就是不可变的,即无法直接修改字符串的内容。
String original = "Hello";
String modified = original.concat(", World!"); // 创建新的字符串对象
// original 仍然是 "Hello"
// modified 是 "Hello, World!"
2.2 字符串操作不影响原始对象
所有字符串操作方法都返回新的字符串对象,而不修改原始对象。
String original = "Hello";
String concatResult = original.concat(", World!");
// original 仍然是 "Hello"
// concatResult 是 "Hello, World!"
3. 字符串常量池
3.1 常量池概念
字符串常量池是存储字符串字面值的特殊区域,可以通过 intern() 方法将字符串对象添加到常量池中。
String str1 = "Hello";
String str2 = new String("Hello").intern(); // 将字符串对象添加到常量池中
// str1 和 str2 指向字符串常量池中同一个对象
4. 字符串操作方法
4.1 常见操作方法
掌握常见的字符串操作方法,如拼接、截取、查找、替换等。
String concatResult = str1.concat(", World!"); // 拼接字符串
String substringResult = str1.substring(0, 3); // 截取子串
int index = str1.indexOf("lo"); // 查找子串的位置
String replaceResult = str1.replace('l', 'L'); // 替换字符
// 操作后原始字符串 str1 不变
5. 字符串比较
5.1 equals() 方法
学习如何使用 equals() 方法进行字符串内容比较。
String str1 = "apple";
String str2 = "banana";
boolean isEqual = str1.equals(str2); // 内容比较
5.2 compareTo() 方法
了解 compareTo() 方法的使用,以及如何进行字典顺序比较。
String str1 = "apple";
String str2 = "banana";
int compareToResult = str1.compareTo(str2); // 字典顺序比较
6. 字符串格式化
6.1 使用 String.format 方法
学会使用 String.format 方法进行字符串格式化。
String formattedString = String.format("Hello, %s! Today is %dth day.", "John", 20);
System.out.println(formattedString);
7. 正则表达式与字符串
7.1 使用正则表达式
熟悉如何使用正则表达式进行字符串匹配和替换。
String pattern = "Java";
String text = "Java is fun!";
Pattern compiledPattern = Pattern.compile(pattern);
Matcher matcher = compiledPattern.matcher(text);
boolean isFound = matcher.find(); // 判断是否匹配
7.2 字符串分割
了解 split() 方法的使用,将字符串分割为数组。
String sentence = "Java is a programming language";
String[] words = sentence.split(" ");
// words 数组为 ["Java", "is", "a", "programming", "language"]
8. StringBuilder 与 StringBuffer
8.1 StringBuilder 概述
StringBuilder
类是可变的字符序列,用于处理大量字符串操作时提供了更好的性能,因为它允许修改其内容。
8.2 特性
- 可变性:
StringBuilder
对象的内容可以被修改。 - 非线程安全:
StringBuilder
不是线程安全的,不适用于多线程环境。 - 性能: 适用于大量字符串操作,因为它避免了不必要的对象创建。
8.3 示例
StringBuilder stringBuilder = new StringBuilder("Hello");
stringBuilder.append(" World");
8.4 StringBuffer 概述
StringBuffer
类与 StringBuilder
类类似,也是可变的字符序列,但是它是线程安全的,适用于多线程环境。
8.5 特性
- 可变性:
StringBuffer
对象的内容可以被修改。 - 线程安全:
StringBuffer
是线程安全的,适用于多线程环境。 - 性能: 比
StringBuilder
稍慢,因为它包含同步机制以确保线程安全。
8.6 示例
StringBuffer stringBuffer = new StringBuffer("Hello");
stringBuffer.append(" World");
总结
- 使用
String
当需要不可变性,适用于少量字符串操作或字符串常量的情况。 - 使用
StringBuilder
当需要可变性,适用于单线程环境,且对性能要求较高。 - 使用
StringBuffer
当需要可变性且线程安全,适用于多线程环境。
选择合适的字符串处理类取决于具体的需求和性能要求。
9. 编码与字符集
9.1 字符编码和字符集
了解字符串的编码和字符集概念,学习如何在不同的字符集之间转换字符串。
String utf8String = "你好";
byte[] utf8Bytes = utf8String.getBytes(StandardCharsets.UTF_8); // 转换为UTF-8编码的字节数组
String newString = new String(utf8Bytes, StandardCharsets.UTF_8); // 从字节数组解码为字符串
10. Java 11+ 中的新特性
10.1 isBlank()
Java 11 引入了 isBlank()
方法,用于检查字符串是否为空白(只包含空格、制表符、换行符等),替代了传统的 trim().isEmpty()
操作。
String str = " ";
boolean isBlank = str.isBlank(); // 返回 true
10.2 lines()
lines()
方法将字符串拆分为行,返回一个由行组成的流(Stream)。
String multilineString = "Line 1\nLine 2\nLine 3";
List<String> lines = multilineString.lines().collect(Collectors.toList());
// lines 包含 ["Line 1", "Line 2", "Line 3"]
10.3 repeat(int count)
repeat(int count)
方法用于复制字符串指定次数,简化字符串重复操作。
String repeatedString = "abc".repeat(3); // 返回 "abcabcabc"
10.4 strip(), stripLeading(), stripTrailing()
strip()
方法去除字符串首尾空白,stripLeading()
和 stripTrailing()
分别去除开头和结尾的空白。
String str = " Java 11 ";
String stripped = str.strip(); // 返回 "Java 11"
10.5 lines().forEach()
结合 lines()
和 forEach()
,可以更便捷地遍历字符串的行。
String multilineString = "Line 1\nLine 2\nLine 3";
multilineString.lines().forEach(System.out::println);
// 输出:
// Line 1
// Line 2
// Line 3
这些新特性使得在 Java 11 及更高版本中使用 String 类更加灵活和简便。