Java中String字符串
文章目录
- java中String字符串
- 1. 不可变性(Immutable)
- 示例
- 原理
- 2. 字符串常量池(String Pool)
- 示例
- intern () 方法
- 3. 字符串拼接
- 常用方式
- 4. 常用方法
- 5. 字符串格式化
- String.format()
- 文本块(Java 15+)
- 6. 编码与解码
- 字符串转字节数组
- 字节数组转字符串
- 7. 常见面试问题
- `String` vs `StringBuilder` vs `StringBuffer`
- `==` vs `equals()
- 字符串常量池的作用
- 总结
java中String字符串
在 Java 中,String
是一个非常重要且特殊的类,用于表示不可变的字符序列。以下是关于String
的核心特性和常见用法:
1. 不可变性(Immutable)
String
对象一旦创建,其值不能被修改。任何对String
的操作(如concat()
、substring()
)都会返回一个新的String
对象。
示例
String s1 = "Hello";
s1 = s1 + " World"; // 实际上创建了新的String对象 "Hello World"
原理
String
内部使用final char[]
存储字符,且类被声明为final
,禁止被继承和修改。
2. 字符串常量池(String Pool)
Java 为了节省内存,会将字面量字符串放入常量池。相同内容的字面量会复用同一个对象。
示例
String s1 = "Hello"; // 常量池创建 "Hello"
String s2 = "Hello"; // 复用常量池中的对象
System.out.println(s1 == s2); // true(引用相同)String s3 = new String("Hello"); // 堆中创建新对象
System.out.println(s1 == s3); // false(引用不同)
System.out.println(s1.equals(s3)); // true(值相同)
intern () 方法
手动将String
对象加入常量池:
String s4 = new String("Java").intern(); // 将堆中的"Java"加入常量池
System.out.println(s4 == "Java"); // true
3. 字符串拼接
常用方式
-
+
操作符:编译时优化为StringBuilder
String result = "Hello" + " " + "World"; // 编译后等价于: // String result = new StringBuilder("Hello").append(" ").append("World").toString();
-
StringBuilder
:非线程安全,性能高(推荐循环拼接)。StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) {sb.append(i); } String result = sb.toString(); // "0123456789"
-
StringBuffer
:线程安全(内部方法加synchronized
),性能较低。
4. 常用方法
String str = "Hello World";// 长度
int length = str.length(); // 11// 子串
String sub = str.substring(6); // "World"// 查找
int index = str.indexOf("World"); // 6// 替换
String replaced = str.replace("World", "Java"); // "Hello Java"// 分割
String[] parts = str.split(" "); // ["Hello", "World"]// 大小写转换
String upper = str.toUpperCase(); // "HELLO WORLD"// 去除首尾空格
String trimmed = " abc ".trim(); // "abc"// 判断开头/结尾
boolean startsWith = str.startsWith("Hello"); // true// 比较
boolean equals = str.equals("Hello World"); // true
boolean equalsIgnoreCase = str.equalsIgnoreCase("HELLO WORLD"); // true
5. 字符串格式化
String.format()
String name = "Alice";
int age = 25;
String formatted = String.format("Name: %s, Age: %d", name, age);
// "Name: Alice, Age: 25"
文本块(Java 15+)
String html = """<html><body><p>Hello, World!</p></body></html>
""";
6. 编码与解码
字符串转字节数组
String str = "你好";
byte[] utf8Bytes = str.getBytes("UTF-8"); // UTF-8编码
byte[] gbkBytes = str.getBytes("GBK"); // GBK编码
字节数组转字符串
String utf8Str = new String(utf8Bytes, "UTF-8");
String gbkStr = new String(gbkBytes, "GBK");
7. 常见面试问题
String
vs StringBuilder
vs StringBuffer
String
:不可变,适合少量拼接。StringBuilder
:可变,非线程安全,适合单线程大量拼接。StringBuffer
:可变,线程安全,适合多线程大量拼接。
==
vs `equals()
==
:比较引用地址。equals()
:比较字符串内容。
字符串常量池的作用
减少内存开销,避免重复创建相同内容的字符串。
总结
String
的不可变性保证了线程安全和字符串常量池的实现,但频繁拼接会产生大量临时对象,此时应使用StringBuilder
或StringBuffer
。理解字符串常量池和编码问题有助于写出高效且健壮的代码。