
String.charAt() 和 String.indexOf() 别混用场景
查单个字符位置用 indexOf(),取指定下标字符用 charAt()。前者返回 -1 表示没找到,后者越界直接抛 StringIndexOutOfBoundsException。
- 用
charAt(0)取首字符前,先确认str.length() > 0,空字符串会崩 -
indexOf("a")找不到返回-1,别拿来当布尔判断(比如if (str.indexOf("x"))),要写成!= -1 - 区分
indexOf(char)和indexOf(String):后者支持子串,但注意它只返回第一次出现的位置
String.split() 的坑比想象中多
看似简单,实际常因正则、空字符串、边界情况翻车。默认按空白拆分不等于按空格拆分,且结果数组可能含空串。
-
"a,,b".split(",")得到长度为 3 的数组:["a", "", "b"];而"a,,b".split(",", -1)才保留末尾空串 -
".".split(".")返回空数组——因为.是正则元字符,得写成"\."或用Pattern.quote(".') - 性能敏感场景慎用
split()处理超长字符串,它底层编译正则,可考虑String.indexOf()+substring()手动切
String.equals() 和 == 判等逻辑完全不同
== 比的是引用地址,equals() 比的是内容。几乎所有字符串判等都该用 equals(),除非你真在检查是否是同一个对象。
-
"abc" == "abc"可能为true(字符串常量池优化),但new String("abc") == "abc"一定是false - 调用
equals()前最好判空:str != null && str.equals("target"),或更安全地用"target".equals(str) -
equalsIgnoreCase()区分大小写,但注意它对非 ASCII 字符(如带重音符号的字母)行为依赖 locale,国际化场景需谨慎
String.substring() 的索引是半开区间,且不校验负数
substring(begin, end) 取的是 [begin, end),不是 [begin, end]。而且 begin 小于 0 或 end 超过长度时,运行时报错,编译期不提醒。
立即学习“Java免费学习笔记(深入)”;
-
"hello".substring(1, 3)结果是"el",不是"ell" - 想截取后三位?别硬算
str.substring(str.length() - 3),先判断长度够不够,否则StringIndexOutOfBoundsException -
substring(0)等价于原字符串,但它是新对象(JDK 7u6 之后不再共享底层 char[],内存友好些)
字符串不可变是根本约束,所有“修改”方法(replace、toUpperCase、trim)都返回新实例。频繁拼接别用 + 在循环里,改用 StringBuilder。还有,"" 和 null 的处理永远得分开想。










