像梦一样奔驰|个精致的 Java 字符串操作小技巧,学它,OMG,12


字符串既然最常用 , 那就意味着面试官好这一口 , 就喜欢问一些字符串方面的编码技巧 , 来测试应聘者是否技术过硬 , 底子扎实 , 对吧?
那这次 , 我就来盘点12个精致的Java字符串操作小技巧 , 来帮助大家提高一下下 。 在查看我给出的答案之前 , 最好自己先动手尝试一遍 , 写不出来答案没关系 , 先思考一遍 , 看看自己的知识库里是不是已经有解决方案 , 有的话 , 就当是温故复习了 , 没有的话 , 也不要担心 , 刚好学一遍 。
01、如何在字符串中获取不同的字符及其数量?这道题可以拆解为两个步骤 , 第一步 , 找出不同的字符 , 第二步 , 统计出它们的数量 。 好像有点废话 , 是不是?那我先来一个答案吧 。
publicclassDistinctCharsCount{publicstaticvoidmain(String[]args){printDistinctCharsWithCount("itwanger");printDistinctCharsWithCount("chenmowanger");}privatestaticvoidprintDistinctCharsWithCount(Stringinput){MapcharsWithCountMap=newLinkedHashMap<>();for(charc:input.toCharArray()){IntegeroldValue=https://pcff.toutiao.jxnews.com.cn/p/20200831/charsWithCountMap.get(c);intnewValue=(oldValue==null)?1:Integer.sum(oldValue,1);charsWithCountMap.put(c,newValue);}System.out.println(charsWithCountMap);}}程序输出的结果是:
{i=1,t=1,w=1,a=1,n=1,g=1,e=1,r=1}{c=1,h=1,e=2,n=2,m=1,o=1,w=1,a=1,g=1,r=1}说一下我的思路:
1)声明一个LinkedHashMap , 也可以用HashMap , 不过前者可以保持字符串拆分后的顺序 , 结果看起来更一目了然 。
为什么要用Map呢?因为Map的key是不允许重复的 , 刚好可以对重复的字符进行数量的累加 。
2)把字符串拆分成字符 , 进行遍历 。
3)如果key为null的话 , 就表明它的数量要+1;否则的话 , 就在之前的值上+1 , 然后重新put到Map中 , 这样就覆盖了之前的字符数量 。
思路很清晰 , 对不对?忍不住给自己鼓个掌 。
那 , JDK8之后 , Map新增了一个很厉害的方法merge() , 一次性为多个键赋值:
privatestaticvoidprintDistinctCharsWithCountMerge(Stringinput){MapcharsWithCountMap=newLinkedHashMap<>();for(charc:input.toCharArray()){charsWithCountMap.merge(c,1,Integer::sum);}System.out.println(charsWithCountMap);}有没有很厉害?一行代码就搞定 。 第一个参数为键 , 第二个参数为值 , 第三个参数是一个BiFunction , 意思是 , 如果键已经存在了 , 就重新根据BiFunction计算新的值 。
如果字符是第一次出现 , 就赋值为1;否则 , 就把之前的值sum1 。
02、如何反转字符串?如果同学们对StringBuilder和StringBuffer很熟悉的话 , 这道题就很简单 , 直接reverse()就完事 , 对不对?
publicclassReverseAString{publicstaticvoidmain(String[]args){reverseInputString("沉默王二");}privatestaticvoidreverseInputString(Stringinput){StringBuildersb=newStringBuilder(input);Stringresult=sb.reverse().toString();System.out.println(result);}}输出结果如下所示:
二王默沉多说一句 , StringBuffer和StringBuilder很相似 , 前者是同步的 , 所有public方法都加了synchronized关键字 , 可以在多线程中使用;后者是不同步的 , 没有synchronized关键字 , 所以性能更佳 , 没有并发要求的话 , 就用StringBuilder 。


推荐阅读