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
),否则可能因平台默认编码不同导致乱码。