加入收藏 | 设为首页 | 会员中心 | 我要投稿 财气旺网 - 财气网 (https://www.caiqiwang.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

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

发布时间:2022-12-05 12:36:00 所属栏目:语言 来源:
导读:  最近我们通过sonar静态代码检测,同时配合人工代码review,发现了项目中很多代码问题。除了常规的bug和安全漏洞之外,还有几处方法用法错误,引起了我极大的兴趣。我为什么会对这几个方法这么感兴趣呢?因为它们极
  最近我们通过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?
 

(编辑:财气旺网 - 财气网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!