String字符串
String 字符串
String 是不可变、可安全共享的字符序列。拼接、替换和大小写转换会返回新字符串,或在无需变化时返回原对象。
创建与常量池
代码块收起展开
String a = "Java";
String b = "Java";
String c = new String("Java");
System.out.println(a == b); // true
System.out.println(a == c); // false
System.out.println(a.equals(c)); // true比较内容使用 equals();== 只比较引用身份。
不可变性的意义
- 可安全作为 HashMap 的键。
- 字符串常量可以共享。
- 更容易实现线程安全和安全边界。
- 修改会产生新值,大量拼接可能创建临时对象。
代码块收起展开
String text = "a";
text.concat("b");
System.out.println(text); // a拼接
少量拼接使用 +。循环中优先 StringBuilder:
代码块收起展开
StringBuilder builder = new StringBuilder();
for (String item : items) {
builder.append(item).append('','');
}
String result = builder.toString();StringBuilder 非线程安全,单线程首选;StringBuffer 方法带同步。集合连接可用 String.join() 或 Collectors.joining()。
valueOf、toString 与 null
代码块收起展开
String.valueOf(obj); // null 得到 "null"
Objects.toString(obj, ""); // 自定义默认值
obj.toString(); // obj 为 null 时抛异常直接把裸 null 传给 String.valueOf 可能出现重载歧义,明确类型或使用 Objects.toString 更清楚。
intern()
intern() 返回常量池中与当前内容相等的规范化引用;不存在时将该内容的规范表示加入池。
代码块收起展开
String heap = new String("Java");
String pooled = heap.intern();
System.out.println(pooled == "Java"); // true不要默认对所有字符串 intern。它只适合大量重复、生命周期长且经过内存分析确认的内容。
常用 API
- isEmpty():长度是否为 0。
- isBlank():是否为空或仅含空白。
- substring(begin, end):左闭右开。
- strip():Unicode 感知的首尾空白处理。
- split(regex, -1):保留末尾空字符串。
split 参数是正则,例如按点号拆分写 split(”\.”)。
Unicode
String 的索引和 length() 基于 UTF-16 代码单元,不一定等于用户看到的字符数。emoji 或罕见汉字可能由两个 char 组成:
代码块收起展开
int count = text.codePointCount(0, text.length());
text.codePoints().forEach(System.out::println);涉及编码时显式使用 StandardCharsets.UTF_8,不依赖平台默认编码。