一、字符串本质:Unicode字符的不可变舞者💃
Java字符串(String)是不可变的Unicode字符序列。底层使用char[]存储,每个char占2字节,代表一个UTF-16代码单元:
String str = "Javα"; // 'α' 占用1个char (Unicode:03B1)
System.out.println(str.length()); // 输出:4
但UTF-16仅是存储编码!与外界的字节数据交互时,需进行显式编/解码:
byte[] utf8Bytes = str.getBytes(StandardCharsets.UTF_8); // 编码为UTF-8字节流
String decoded = new String(utf8Bytes, StandardCharsets.UTF_8); // 字节流解码回字符串
二、编码陷阱:默认编码的"刺客"行为⚔️
致命错误:依赖平台默认编码转换:
// 危险操作!依赖默认编码
byte[] data = "你好".getBytes();
String recovered = new String(data); // 若默认编码不一致,乱码!
示例证明:
String text = "你好";
// 模拟不同平台编码
byte[] gbkBytes = text.getBytes("GBK"); // [ -60, -29, -70, -61 ]
byte[] utf8Bytes = text.getBytes(StandardCharsets.UTF_8); // [ -28, -67, -96, -27, -91, -67 ]
// 用错误编码解码 -> 乱码
System.out.println(new String(gbkBytes, StandardCharsets.UTF_8)); // 输出:���
System.out.println(new String(utf8Bytes, "GBK")); // 输出:浣犲ソ
三、关键结论:驯服编码的利剑🗡️
- 永不信任默认编码:始终在getBytes()和String构造函数中显式指定字符集(如StandardCharsets.UTF_8)。
- 统一字符集:系统、数据库、网络传输强制使用UTF-8。
- 理解char局限:char无法完整表示所有Unicode字符(如😊需2个char即代理对),处理复杂文本用codePoint相关API。
- 性能优化:大量字符串操作考虑StringBuilder或StringBuffer(线程安全)。
警钟:忽视编码等于埋下"乱码刺客",轻则显示异常,重则数据永久损坏。显式指定字符集,是每位Java开发者的生存技能!

被折叠的 条评论
为什么被折叠?



