上一篇                     
               
			  Java字符串赋值方法有哪些
- 后端开发
- 2025-07-01
- 2097
 在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+语法标准,确保实践可靠性。
 
  
			