Java中的String
Java中的String
目录
一、String 是什么?
在 Java 中,String 是一个不可变(immutable)类,定义在 java.lang 包中。
一旦创建,字符串的内容就不能被修改。任何看似“修改”的操作,实际上都会创建新的对象。
二、为什么 String 是不可变的?
String 被设计为不可变,主要有以下几个原因:
1. 安全性
字符串常用于类加载、网络连接、文件路径等关键场景。不可变可以防止被篡改。
2. 线程安全
由于不可变,多个线程可以共享同一个字符串对象,无需同步。
3. 字符串常量池(String Pool)
不可变使得字符串可以被缓存复用,从而节省内存。
三、字符串的创建方式
- 字面量方式(推荐)
tring s1 = "Java";
String s2 = "Java";
s1 和 s2 指向同一个对象(字符串常量池)
- 使用 new 关键字
String s1 = new String("Java");
String s2 = new String("Java");
每次都会创建新的对象(堆内存)
- 区别总结
| 创建方式 | 是否复用对象 | 内存位置 |
|---|---|---|
| 字面量 | 是 | 常量池 |
| new | 否 | 堆 |
四、String 常量池详解
字符串常量池是 JVM 中的一块特殊内存区域,用于存储字符串字面量。
String a = "hello";
String b = "hello";
System.out.println(a == b); // true
因为它们引用的是同一个常量池对象
intern() 方法
String s1 = new String("hello");
String s2 = s1.intern();
System.out.println(s1 == s2); // false(通常)
intern() 会返回常量池中的字符串引用。
五、字符串比较:== vs equals()
String a = "Java";
String b = new String("Java");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
区别:
| 方法 | 比较内容 |
|---|---|
| == | 地址(引用) |
| equals() | 内容 |
实际开发中,一定要用 equals() 比较字符串内容
六、字符串拼接的性能问题
1. 使用 + 拼接
String s = "a" + "b" + "c";
编译期会优化,没问题。
但在循环中:
String s = "";
for(int i = 0; i < 1000; i++){
s += i;
}
会创建大量临时对象,性能很差
2. 推荐使用 StringBuilder
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 1000; i++){
sb.append(i);
}
String result = sb.toString();
对比:
| 类 | 是否可变 | 线程安全 | 性能 |
|---|---|---|---|
| String | 否 | 是 | 低(频繁修改) |
| StringBuilder | 是 | 否 | 高 |
| StringBuffer | 是 | 是 | 较低 |
七、常用方法整理
1. 长度
str.length();
2. 截取
str.substring(0, 3);
3. 查找
str.indexOf("a");
4. 替换
str.replace("a", "b");
5. 转换大小写
str.toUpperCase();
str.toLowerCase();
八、总结
String 是不可变对象
字符串常量池可以提高性能
使用 equals() 比较内容
高频拼接使用 StringBuilder
理解底层机制可以避免性能问题
浙公网安备 33010602011771号