hyx0411

导航

Java中的String

Java中的String


一、String 是什么?

在 Java 中,String 是一个不可变(immutable)类,定义在 java.lang 包中。

一旦创建,字符串的内容就不能被修改。任何看似“修改”的操作,实际上都会创建新的对象。


二、为什么 String 是不可变的?

String 被设计为不可变,主要有以下几个原因:

1. 安全性

字符串常用于类加载、网络连接、文件路径等关键场景。不可变可以防止被篡改。

2. 线程安全

由于不可变,多个线程可以共享同一个字符串对象,无需同步。

3. 字符串常量池(String Pool)

不可变使得字符串可以被缓存复用,从而节省内存。


三、字符串的创建方式

  1. 字面量方式(推荐)
tring s1 = "Java";
String s2 = "Java";

s1 和 s2 指向同一个对象(字符串常量池)

  1. 使用 new 关键字
String s1 = new String("Java");
String s2 = new String("Java");

每次都会创建新的对象(堆内存)

  1. 区别总结
创建方式 是否复用对象 内存位置
字面量 常量池
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

理解底层机制可以避免性能问题

posted on 2026-04-26 21:39  芸歆  阅读(22)  评论(1)    收藏  举报