最近我们通过sonar静态代码检测,同时配合人工代码review,发现了项目中很多代码问题。除了常规的bug和安全漏洞之外,还有几处方法用法错误,引起了我极大的兴趣。我为什么会对这几个方法这么感兴趣呢?因为它们极具迷惑性,可能会让我们傻傻分不清楚。
1. replace会替换所有字符?
很多时候我们在使用字符串时,想把字符串比如:ATYSDFA*Y中的字符A替换成字符B,第一个想到的可能是使用replace方法。
如果想把所有的A都替换成B,很显然可以用replaceAll方法,因为非常直观,光从方法名就能猜出它的用途。
那么问题来了:replace方法会替换所有匹配字符吗?
jdk的官方给出了答案。
该方法会替换每一个匹配的字符串。
既然replace和replaceAll都能替换所有匹配字符,那么他们有啥区别呢?
1.replace有两个重载的方法。
其中一个方法的参数:char oldChar 和 char newChar,支持字符的替换。
source.replace('A', 'B')
另一个方法的参数是:CharSequence target 和 CharSequence replacement,支持字符串的替换。
source.replace("A", "B")
2.replaceAll方法的参数是:String regex 和 String replacement,基于正则表达式的替换。普通字符串替换:
source.replaceAll("A", "B")
正则表达替换(将*替换成C):
source.replaceAll("\\*", "C")
顺便说一下,将*替换成C使用replace方法也可以实现:
source.replace("*", "C")
无需对特殊字符进行转义。
不过,千万注意,切勿使用如下写法:
source.replace("\\*", "C")
这种写法会导致字符串无法替换。
还有个小问题,如果我只想替换第一个匹配的字符串该怎么办?
这时可以使用replaceFirst方法:
source.replaceFirst("A", "B")
2. Integer不能用==判断相等?
不知道你在项目中有没有见过,有些同事对Integer类型的两个参数使用==比较是否相等?
反正我见过的,那么这种用法对吗?
我的回答是看具体场景,不能说一定对,或不对。
有些状态字段,比如:orderStatus有:-1(未下单),0(已下单),1(已支付),2(已完成),3(取消),5种状态。
这时如果用==判断是否相等:
Integer orderStatus1 = new Integer(1);
Integer orderStatus2 = new Integer(1);
System.out.println(orderStatus1 == orderStatus2);
返回结果会是true吗?
答案:是false。
有些同学可能会反驳,Integer中不是有范围是:-128-127的缓存吗?
为什么是false?