字符串可以说是Java中最具代表性的一类,好像没有之一,这就像直播界的李佳琦,脱口秀里的李佳琦丹,一等阿哥身份。不得不承认,最近吐槽大会不少,满脑子都是那些段子,感觉写文章有点身不由己。真的,我情不自禁。既然字符串是最常用的,那就说明面试官喜欢问一些字符串编码的技巧,来测试应聘者是否熟练扎实,对吧?那么这次小编就来盘点12个精妙的Java字符串操作技巧,助你提升。在检查我给出的答案之前,最好自己尝试一下。不会写答案也没关系。先想一想,看看你的知识库里有没有解决办法。如果是,那只是复习,如果不是,别着急,学一次就可以了。01.如何获取一个字符串中不同的字符及其编号?这个问题可以分解成两个步骤。第一步是找出不同的字符,第二步是计算它们的数量。这似乎有点废话,不是吗?那我先给个答案吧。publicclassDistinctCharsCount{publicstaticvoidmain(String[]args){printDistinctCharsWithCount("itwanger");printDistinctCharsWithCount("chenmowanger");}privatestaticvoidprintDistinctCharsWithCount(Stringinput){MapcharsWithCountMap=newLinkedMap:HashfortoCharArray()){IntegeroldValue=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的key是不允许重复的,所以只能累加重复字符的个数。2)将字符串拆分成字符并遍历。3)如果key为null,则表示其编号必须为+1;否则,会在之前的值上+1,然后重新放入Map,从而覆盖之前的字符数。思路很清晰,不是吗?我不禁为自己鼓掌。嗯,在JDK8以后,Map增加了一个强大的方法merge(),可以一次性给多个key赋值:privatestaticvoidprintDistinctCharsWithCountMerge(Stringinput){MapcharsWithCountMap=newLinkedHashMap<>();for(charc:input.toCharArray()){charsWithCountMap.merge(c,1,Integer::sum);}System.out.println(charsWithCountMap);}是不是很强大?一行代码就够了。第一个参数是key,第二个参数是value,第三个参数是一个BiFunction,表示如果key已经存在,则根据BiFunction重新计算一个新的value。如果该角色是第一次出现,赋值1;否则,将前一个值和1相加。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。03.如何判断一根弦是否对称?这是什么意思?它就像一根弦,来回折叠,左右对称。就好比你站在镜子前,看自己在美丽的树上迎风闭月羞花。publicclassPalindromeString{publicstaticvoidmain(String[]args){checkPalindromeString("沉默王二");checkPalindromeString("沉默王二王默神");}privatestaticvoidcheckPalindromeString(Stringinput){booleanresult=true;intlength=input.length();for(inti=0;iset1=s1.chars().mapToObj(c->(char)c).collect(Collectors.toSet());System.out.println(set1);Setset2=s2.chars().mapToObj(c->(char)c).collect(Collectors.toSet());System.out.println(set2);System.out.println(set1.equals(set2));}}输出结果如下:[Silent,Shen,Wang,Two][Silent,Shen,Wang,2]true[Mo,Shen,Wang,2]][Mo,Shen,San,Wang]false上面的代码使用了Stream流,看起来很奇怪,但是很好理解。就是把字符串拆分成字符,然后收集起来。在Set中,Set是一个不允许有重复元素的集合,所以把字符串中的不同字符都收集起来。08.如何判断一个字符串中包含另一个字符串?这个问题有点简单吧?上一题也是用的Stream,所以这道题会直接送分?不要怀疑自己,用string类的contains()方法就行了。publicclassStringContainsSubstring{publicstaticvoidmain(String[]args){Strings1="静音王二";Strings2="静音";System.out.println(s1.contains(s2));}}输出结果如下:truecontains()method其实内部调用了indexOf()方法:publicbooleancontains(CharSequences){returnindexOf(s.toString())>=0;}09.不使用第三个变量如何交换两个字符串?这个问题有点意思吧?特别是不使用第三个变量的前提条件。publicclassSwapTwoStrings{publicstaticvoidmain(String[]args){Strings1="Silent";Strings2="KingTwo";s1=s1.concat(s2);s2=s1.substring(0,s1.length()-s2.length());s1=s1.substring(s2.length());System.out.println(s1);System.out.println(s2);}}输出结果如下::1)将两个字符串拼接在一起通过concat()方法。2)然后用substring()方法分别取出第二个字符串和第一个字符串。10.如何从字符串中找出第一个不重复的字符?让我们用最后一个例子来理解这道题。比如字符串“SilenceWangShenSilence2”中,第一个不重复的字符是“王”,对吧?因为“申”重复,“墨”重复。publicclassFindNonRepeatingChar{publicstaticvoidmain(String[]args){System.out.println(printFirstNonRepeatingChar("沉默王神沉默II"));System.out.println(printFirstNonRepeatingChar("沉默王神"));System.out.println(printFirstNonRepeatingChar("重重"));}privatestaticCharacterprintFirstNonRepeatingChar(Stringstring){char[]chars=string.toCharArray();ListdiscardedChars=newArrayList<>();for(inti=0;i