1. 主页 > 大智慧

Java字符串操作指南:8个常用方法及避坑技巧

(深呼吸)哎,兄弟们,今天咱们来聊点每个Java新手都会踩的坑——字符串操作。你被String的==比较坑过没?有没有试过用"+"疯狂拼接字符串结果程序卡成狗?别慌,今天这篇就是专门给小白定制的生存指南,咱们边唠边学!


一、字符串比较:你以为的"相同"可能是个坑

(拍大腿)我跟你说啊,Java里字符串比较用??==??还是??equals()??这个问题,每年坑死的新手能绕地球三圈!咱们先看这段代码:

java复制
String a = "hello";
String b = new String("hello");
System.out.println(a == b);  // 输出啥?false!
System.out.println(a.equals(b)); // 这才是true

(摊手)看见没???==??比的是内存地址,??equals()??才是比内容。特别是从数据库读数据或者用户输入拿到的字符串,十有八九得用equals。对了,??equalsIgnoreCase()??这货能忽略大小写,登录验证的时候贼好用。


二、拼接字符串:别再用"+"了行不行?

(扶额)知道你们刚学的时候都喜欢用"+"拼字符串,但咱们得讲讲道理啊。看这个:

java复制
String result = "";
for(int i=0; i<10000; i++){
    result += i;  // 每次循环都在造新对象!
}

(敲黑板)这种操作相当于在循环里疯狂创建StringBuilder对象,内存直接爆炸!这时候就该请出??StringBuilder??老哥:

java复制
StringBuilder sb = new StringBuilder();
for(int i=0; i<10000; i++){
    sb.append(i);
}

性能直接提升50倍不夸张。不过日常写个简单的拼接,比如"用户"+userId+"登录成功"这种,用"+"倒也无所谓。


三、判空操作:躲开NullPointerException的108种姿势

(叹气)空指针异常绝对是新手杀手排行榜第一名。记住这个万能公式:

java复制
if(str != null && !str.isEmpty()){...}

但注意!??isEmpty()??只能判断空字符串,遇到全是空格的" "就瞎了。这时候该??trim().isEmpty()??上场了:

java复制
if(str != null && !str.trim().isEmpty()){
    // 这才叫真·非空判断
}

(突然严肃)千万别写str.equals("")这种自杀式代码,分分钟NullPointer教你做人!


四、截取子串:substring的隐藏陷阱

(掏心窝子)substring看着简单吧?但有个大坑——??内存泄漏??!老版本的Java里,substring会持有原字符串的引用。比如:

java复制
String bigStr = "abcdefghijk..."; // 假设是个1MB的字符串
String sub = bigStr.substring(0,3); // 你以为只占3个字符?
// 实际在Java7之前,sub还拿着整个bigStr的内存!

不过Java7之后改进了这个机制,现在可以放心用。但要注意第二个参数是??结束索引不是长度??,比如substring(2,5)是取第2、3、4这三个字符。


五、分割字符串:split的魔鬼细节

(拍桌子)split用正则表达式这事,坑过多少人举个手我看看?比如说要按竖线分割:

java复制
String data = "苹果|香蕉|橘子";
String[] fruits = data.split("|");  // 结果全分割了!

(捂脸)因为竖线在正则里是特殊字符,得写成split("\\|")才对。再比如分割点号:

java复制
"192.168.1.1".split(".");  // 这绝对返回空数组!
// 正确姿势是split("\\.")

所以记住:凡是遇到特殊字符,统统给我加反斜杠!


六、格式转换:数字和字符串的相爱相杀

(摇头)见过有人这么转数字吗?

java复制
int num = Integer.parseInt("123a"); // 直接爆炸!

(比划)正确的姿势应该先判断:

java复制
if(str.matches("\\d+")){
    int num = Integer.parseInt(str);
}

还有更智能的??NumberUtils.isParsable()??(需要Apache Commons库)。反过来转字符串的话,推荐:

java复制
String s1 = "" + 123;  // 可行但不够专业
String s2 = String.valueOf(123); // 这才是正道

七、大小写转换:国际化的大坑

(压低声音)你以为toUpperCase()就是全部了?试试这个:

java复制
"?".toUpperCase();  // 土耳其语的i
// 在土耳其语言环境下会变成"I"(没有点)

(摊手)所以涉及国际化的项目,最好指定Locale:

java复制
str.toUpperCase(Locale.ENGLISH);

平时开发可能遇不到,但面试要是被问到就赚到了对不对?


八、不可变性:字符串为啥不能修改?

(敲黑板)最后说个底层原理——??字符串不可变??这事。比如:

java复制
String s = "hello";
s += " world";  // 其实创建了新对象!

这就是为啥要慎用字符串做频繁修改操作。但不可变也有好处啊,线程安全、缓存哈希值、安全性好...(突然停顿)等等,这些太底层了,新手记住"频繁修改用StringBuilder"就行。


个人观点时间

(伸懒腰)说真的,Java字符串操作就像炒菜——工具就摆在厨房,但火候把握不好照样糊锅。我见过太多人死记硬背方法,结果遇到实际问题还是抓瞎。关键得理解两个点:

  1. ??字符串池机制??(那个==比较的坑就是因为它)
  2. ??不可变性带来的性能影响??

最后送大家一句口诀:"比较用equals,拼接用Builder,转换先判空,分割要转义"。把这些玩明白了,至少能避开80%的字符串大坑。剩下的...(笑)等你们掉进去再爬出来,就算真正学会了不是?

本文由嘻道妙招独家原创,未经允许,严禁转载