上一篇
Java字符串赋值方法有哪些
- 后端开发
- 2025-07-01
- 3260
在Java中,可以通过以下方式为String赋值:,1. 直接赋值:String s = “Hello”;,2. 使用new关键字:String s = new String(“Hello”);,3. 通过字符数组:char[] arr = {‘a’,’b’}; String s = new String(arr);,4. 字符串拼接:String s = “Hel” + “lo”;,字符串不可变,每次赋值会创建新对象。
String赋值的3种核心方式
-
直接赋值(最常用)
用双引号创建字符串,JVM优先从字符串常量池复用对象,高效省内存:String s1 = "Hello"; // 常量池中创建"Hello" String s2 = "Hello"; // 复用常量池对象,s1 == s2 返回true
-
new关键字创建对象
强制在堆内存新建独立对象(即使内容相同):String s3 = new String("Hello"); // 新建堆内存对象 String s4 = new String("Hello"); // 再建一个独立对象 // s3 == s4 返回false(地址不同),s3.equals(s4) 返回true(内容相同)
-
通过字符数组/字节数组构造
适合动态生成字符串的场景:char[] chars = {'J','a','v','a'}; String s5 = new String(chars); // 输出"Java" byte[] bytes = {65, 66, 67}; String s6 = new String(bytes); // 输出"ABC"(ASCII解码)
字符串不可变性的关键影响
- 任何修改操作都生成新对象
String s = "Hi"; s += " Java"; // 实际新建"Hi Java"对象,原"Hi"保留在常量池
- 为何设计为不可变?
- 安全:防止反面改动(如数据库连接字符串)
- 线程安全:无需同步锁
- 缓存哈希值:提升
hashCode()
性能
进阶赋值与性能优化
-
字符串拼接的陷阱
避免循环内用拼接(产生大量中间对象):// 错误示例(低效) String result = ""; for (int i = 0; i < 1000; i++) { result += i; // 每次循环新建StringBuilder和String对象 } // 正确方案:用StringBuilder StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); } String result = sb.toString(); // 只生成最终对象
-
格式化字符串
使用String.format()
生成动态内容:String name = "Alice"; int age = 30; String s = String.format("Name: %s, Age: %d", name, age);
关键注意事项
-
比较字符串必须用
.equals()
比较对象地址,.equals()
String a = "text"; String b = new String("text"); System.out.println(a == b); // false(地址不同) System.out.println(a.equals(b)); // true(内容相同)
-
大文本处理用
StringBuilder
单线程场景用StringBuilder
(非线程安全但更快),多线程用StringBuffer
。 -
空字符串赋值方式
String empty1 = ""; // 推荐(常量池复用) String empty2 = new String(); // 创建新对象(通常没必要)
最佳实践
- 优先选直接赋值(
String s = "value"
),利用常量池节省内存。 - 避免循环内用拼接字符串,改用
StringBuilder
。 - 需要比较内容时必须用
.equals()
。 - 理解不可变性:修改操作返回新对象,原对象不变。
引用说明基于Oracle官方Java文档(String类规范)及《Java核心技术卷I》(第11版)中对字符串处理的权威解读,代码示例遵循Java SE 8+语法标准,确保实践可靠性。