String字符串

String 字符串

String 是不可变、可安全共享的字符序列。拼接、替换和大小写转换会返回新字符串,或在无需变化时返回原对象。

创建与常量池

代码块JAVA · 7 行收起展开
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 的键。
  • 字符串常量可以共享。
  • 更容易实现线程安全和安全边界。
  • 修改会产生新值,大量拼接可能创建临时对象。
代码块JAVA · 3 行收起展开
String text = "a";
text.concat("b");
System.out.println(text); // a

拼接

少量拼接使用 +。循环中优先 StringBuilder:

代码块JAVA · 5 行收起展开
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

代码块JAVA · 3 行收起展开
String.valueOf(obj);          // null 得到 "null"
Objects.toString(obj, "");    // 自定义默认值
obj.toString();               // obj 为 null 时抛异常

直接把裸 null 传给 String.valueOf 可能出现重载歧义,明确类型或使用 Objects.toString 更清楚。

intern()

intern() 返回常量池中与当前内容相等的规范化引用;不存在时将该内容的规范表示加入池。

代码块JAVA · 3 行收起展开
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 组成:

代码块JAVA · 2 行收起展开
int count = text.codePointCount(0, text.length());
text.codePoints().forEach(System.out::println);

涉及编码时显式使用 StandardCharsets.UTF_8,不依赖平台默认编码。

延伸阅读