Java中那些让你傻傻分不清楚的小技巧

前言

最近我们通过sonar静态代码检测,同时配合人工代码review,发现了项目中很多代码问题。除了常规的bug和安全漏洞之外,还有几处方法用法错误,引起了我极大的兴趣。我为什么会对这几个方法这么感兴趣呢?因为它们极具迷惑性,可能会让我们傻傻分不清楚。

1. replace会替换所有字符?

很多时候我们在使用字符串时,想把字符串比如:ATYSDFA*Y中的字符A替换成字符B,第一个想到的可能是使用replace方法。

如果想把所有的A都替换成B,很显然可以用replaceAll方法,因为非常直观,光从方法名就能猜出它的用途。

那么问题来了:replace方法会替换所有匹配字符吗?

jdk的官方给出了答案。

该方法会替换每一个匹配的字符串。

既然replace和replaceAll都能替换所有匹配字符,那么他们有啥区别呢?

1.replace有两个重载的方法。

其中一个方法的参数:char oldChar 和 char newChar,支持字符的替换。


  1. source.replace('A''B'

另一个方法的参数是:CharSequence target 和 CharSequence replacement,支持字符串的替换。


  1. source.replace("A""B"

2.replaceAll方法的参数是:String regex 和 String replacement,基于正则表达式的替换。普通字符串替换:


  1. source.replaceAll("A""B"

正则表达替换(将*替换成C):


  1. source.replaceAll("\\*""C"

顺便说一下,将*替换成C使用replace方法也可以实现:


  1. source.replace("*""C"

无需对特殊字符进行转义。

不过,千万注意,切勿使用如下写法:


  1. source.replace("\\*""C"

这种写法会导致字符串无法替换。

还有个小问题,如果我只想替换第一个匹配的字符串该怎么办?

这时可以使用replaceFirst方法:


  1. source.replaceFirst("A""B"

2. Integer不能用==判断相等?

不知道你在项目中有没有见过,有些同事对Integer类型的两个参数使用==比较是否相等?

反正我见过的,那么这种用法对吗?

我的回答是看具体场景,不能说一定对,或不对。

有些状态字段,比如:orderStatus有:-1(未下单),0(已下单),1(已支付),2(已完成),3(取消),5种状态。

这时如果用==判断是否相等:


  1. Integer orderStatus1 = new Integer(1); 
  2.  Integer orderStatus2 = new Integer(1); 
  3.  System.out.println(orderStatus1 == orderStatus2); 

返回结果会是true吗?

答案:是false。

有些同学可能会反驳,Integer中不是有范围是:-128-127的缓存吗?

为什么是false?

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章