Java String不可变,所有修改操作均返回新对象;replace()等方法不改变原字符串,需重新赋值;substring取左闭右开区间;运行时拼接用StringBuilder更高效;比较字符串内容须用equals()而非==。

Java 的 String 类不可变,所有“修改”操作实际都返回新对象——这是绝大多数字符串误用问题的根源。
为什么 replace() 没生效?
因为 String 是不可变的,replace()、toUpperCase()、trim() 等方法从不修改原字符串,而是返回新实例。
- 常见错误:
String s = " hello "; s.replace(" ", ""); s.trim(); System.out.println(s); // 输出仍是 " hello " - 正确写法:必须重新赋值
String s = " hello "; s = s.replace(" ", ""); // 注意这里赋值了 s = s.trim(); // 也必须赋值 System.out.println(s); // 输出 "hello" - 链式调用更安全:
String result = s.trim().replace(" ", "").toLowerCase();
substring() 的边界到底怎么算?
substring(int beginIndex, int endIndex) 取的是 左闭右开区间,即包含 beginIndex,但不包含 endIndex。越界会抛 StringIndexOutOfBoundsException。
-
"abc".substring(1, 2)→"b"(索引 1 是b,索引 2 是c,但不包含) -
"abc".substring(1)→"bc"(单参数版本从指定位置到末尾) - 容易踩坑:用
length()当endIndex时别加 1,s.substring(0, s.length())才是完整字符串 - 空字符串或 null 判断必须前置,否则直接调用会 NPE
拼接字符串该用 + 还是 StringBuilder?
编译期确定的字面量拼接(如 "a" + "b" + "c")会被 JVM 优化为单个常量;但运行时变量拼接(尤其循环中)用 + 会产生大量中间 String 对象,性能差。
本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
立即学习“Java免费学习笔记(深入)”;
- 少量、非循环拼接:
str1 + str2 + "static"可读性好,没问题 - 循环内拼接(如构建日志、SQL):
StringBuilder sb = new StringBuilder(); for (String item : list) { sb.append(item).append(","); } String result = sb.toString(); // 最后才转 String - 注意:不要在循环里反复调用
sb.toString(),它每次都会新建对象 - JDK 9+ 对
+做了部分优化,但逻辑复杂时仍推荐显式用StringBuilder
equals() 和 == 到底该用哪个?
== 比较的是引用地址,equals() 比较的是字符内容。除非明确要判断是否为同一对象(极少见),否则一律用 equals()。
- 常见错误:
if (s == "hello") { ... } // 错!可能因字符串池机制偶然成功,但不可靠 - 正确写法:
if ("hello".equals(s)) { ... } // 推荐把字面量放前面,避免 s 为 null 时 NPE - 忽略大小写用
equalsIgnoreCase(),别用toLowerCase().equals()(创建多余对象) - 空安全判断可结合
Objects.equals(a, b)(JDK 7+),自动处理 null
字符串处理最易被忽略的其实是编码和 null 安全——new String(bytes, charset) 不指定编码名会依赖平台默认,split() 遇到 null 输入直接炸,这些地方没日志很难定位。









