Java中那些让你傻傻分不清楚的小技巧
最近我们通过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? (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |