1. 两种创建字符串的方式

在Java中创建String对象有两种方式:

使用字符串字面量

String s = "a string";

这种方式会优先复用字符串常量池中已存在的对象

使用构造函数

String s = new String("a string");

每次调用都会强制创建新对象,即使内容相同也不会复用常量池

2. 构造函数的核心特性

String构造函数接受多种参数类型,主要特点:

  • ⚠️ 始终创建新对象(与字面量不同)
  • 支持从字节数组、字符数组、其他字符串等转换
  • 可指定字符集处理二进制数据

3. 所有可用构造方法签名

public String()  // 空字符串
public String(byte[] bytes)  // 默认字符集解码字节数组
public String(byte[] bytes, Charset charset)  // 指定字符集解码
public String(byte[] bytes, int offset, int length)  // 截取字节数组片段
public String(byte[] bytes, int offset, int length, Charset charset)  // 截取+指定字符集
public String(byte[] bytes, int offset, int length, String charsetName)  // 同上(字符集用字符串)
public String(byte[] bytes, String charsetName)  // 同上(全数组+字符集字符串)
public String(char[] value)  // 字符数组转字符串
public String(char[] value, int offset, int count)  // 截取字符数组
public String(int[] codePoints, int offset, int count)  // Unicode码点数组
public String(String original)  // 复制字符串(实际很少用)
public String(StringBuffer buffer)  // 线程安全字符串转换
public String(StringBuilder builder)  // 非线程安全字符串转换

4. 典型使用场景示例

@Test
public void whenCreateStringUsingByteArray_thenCorrect() {
    byte[] array = new byte[] { 97, 98, 99, 100 };  // ASCII码对应a,b,c,d
    String s = new String(array);  // 默认使用平台字符集解码
    
    assertEquals("abcd", s);
}

踩坑提醒
处理二进制数据时,务必显式指定字符集(如StandardCharsets.UTF_8),否则可能因平台默认编码不同导致乱码。


原始标题:Java String.String() | Baeldung