当前位置:首页 > 后端开发 > 正文

Java字符串赋值方法有哪些

在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种核心方式

  1. 直接赋值(最常用)
    用双引号创建字符串,JVM优先从字符串常量池复用对象,高效省内存:

    String s1 = "Hello";  // 常量池中创建"Hello"
    String s2 = "Hello";  // 复用常量池对象,s1 == s2 返回true
  2. new关键字创建对象
    强制在堆内存新建独立对象(即使内容相同):

    String s3 = new String("Hello");  // 新建堆内存对象
    String s4 = new String("Hello");  // 再建一个独立对象
    // s3 == s4 返回false(地址不同),s3.equals(s4) 返回true(内容相同)
  3. 通过字符数组/字节数组构造
    适合动态生成字符串的场景:

    Java字符串赋值方法有哪些  第1张

    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()性能

进阶赋值与性能优化

  1. 字符串拼接的陷阱
    避免循环内用拼接(产生大量中间对象):

    // 错误示例(低效)
    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();  // 只生成最终对象
  2. 格式化字符串
    使用String.format()生成动态内容:

    String name = "Alice";
    int age = 30;
    String s = String.format("Name: %s, Age: %d", name, age); 

关键注意事项

  1. 比较字符串必须用.equals()
    比较对象地址,.equals()

    String a = "text";
    String b = new String("text");
    System.out.println(a == b);          // false(地址不同)
    System.out.println(a.equals(b));     // true(内容相同)
  2. 大文本处理用StringBuilder
    单线程场景用StringBuilder(非线程安全但更快),多线程用StringBuffer

  3. 空字符串赋值方式

    String empty1 = "";         // 推荐(常量池复用)
    String empty2 = new String(); // 创建新对象(通常没必要)

最佳实践

  • 优先选直接赋值String s = "value"),利用常量池节省内存。
  • 避免循环内用拼接字符串,改用StringBuilder
  • 需要比较内容时必须用.equals()
  • 理解不可变性:修改操作返回新对象,原对象不变。

引用说明基于Oracle官方Java文档(String类规范)及《Java核心技术卷I》(第11版)中对字符串处理的权威解读,代码示例遵循Java SE 8+语法标准,确保实践可靠性。

0