中山网站建设文化效果,毕业设计可以做自己的网站吗,网站设计风格有哪些,国发网站建设字符串可以说是 Java 中最具有代表性的类了#xff0c;似乎没有之一哈#xff0c;这就好像直播界的李佳琪#xff0c;脱口秀中的李诞#xff0c;一等一的大哥地位。不得不承认#xff0c;最近吐槽大会刷多了#xff0c;脑子里全是那些段子#xff0c;写文章都有点不由自… 字符串可以说是 Java 中最具有代表性的类了似乎没有之一哈这就好像直播界的李佳琪脱口秀中的李诞一等一的大哥地位。不得不承认最近吐槽大会刷多了脑子里全是那些段子写文章都有点不由自主真的是手不由己啊。字符串既然最常用那就意味着面试官好这一口就喜欢问一些字符串方面的编码技巧来测试应聘者是否技术过硬底子扎实对吧那这次我就来盘点 12 个精致的 Java 字符串操作小技巧来帮助大家提高一下下。在查看我给出的答案之前最好自己先动手尝试一遍写不出来答案没关系先思考一遍看看自己的知识库里是不是已经有解决方案有的话就当是温故复习了没有的话也不要担心刚好学一遍。01、如何在字符串中获取不同的字符及其数量这道题可以拆解为两个步骤第一步找出不同的字符第二步统计出它们的数量。好像有点废话是不是那我先来一个答案吧。public class DistinctCharsCount {public static void main(String[] args) {printDistinctCharsWithCount(itwanger);printDistinctCharsWithCount(chenmowanger);}private static void printDistinctCharsWithCount(String input) {MapCharacter, Integer charsWithCountMap new LinkedHashMap();for (char c : input.toCharArray()) {Integer oldValue charsWithCountMap.get(c);int newValue (oldValue null) ? 1 :Integer.sum(oldValue, 1);charsWithCountMap.put(c, newValue);}System.out.println(charsWithCountMap);}
}
程序输出的结果是{i1, t1, w1, a1, n1, g1, e1, r1}
{c1, h1, e2, n2, m1, o1, w1, a1, g1, r1}
说一下我的思路1声明一个 LinkedHashMap也可以用 HashMap不过前者可以保持字符串拆分后的顺序结果看起来更一目了然。为什么要用 Map 呢因为 Map 的 key 是不允许重复的刚好可以对重复的字符进行数量的累加。2把字符串拆分成字符进行遍历。3如果 key 为 null 的话就表明它的数量要 1否则的话就在之前的值上 1然后重新 put 到 Map 中这样就覆盖了之前的字符数量。思路很清晰对不对忍不住给自己鼓个掌。那JDK 8 之后Map 新增了一个很厉害的方法 merge()一次性为多个键赋值private static void printDistinctCharsWithCountMerge(String input) {MapCharacter, Integer charsWithCountMap new LinkedHashMap();for (char c : input.toCharArray()) {charsWithCountMap.merge(c, 1, Integer::sum);}System.out.println(charsWithCountMap);
}
有没有很厉害一行代码就搞定。第一个参数为键第二个参数为值第三个参数是一个 BiFunction意思是如果键已经存在了就重新根据 BiFunction 计算新的值。如果字符是第一次出现就赋值为 1否则就把之前的值 sum 1。02、如何反转字符串如果同学们对 StringBuilder 和 StringBuffer 很熟悉的话这道题就很简单直接 reverse() 就完事对不对public class ReverseAString {public static void main(String[] args) {reverseInputString(沉默王二);}private static void reverseInputString(String input) {StringBuilder sb new StringBuilder(input);String result sb.reverse().toString();System.out.println(result);}
}
输出结果如下所示二王默沉
多说一句StringBuffer 和 StringBuilder 很相似前者是同步的所有 public 方法都加了 synchronized 关键字可以在多线程中使用后者是不同步的没有 synchronized 关键字所以性能更佳没有并发要求的话就用 StringBuilder。03、如何判断一个字符串是前后对称的什么意思呢就好像一个字符串前后一折是对称的。就像你站在镜子前看到了一个玉树临风、闭月羞花的自己。public class PalindromeString {public static void main(String[] args) {checkPalindromeString(沉默王二);checkPalindromeString(沉默王二 二王默沉);}private static void checkPalindromeString(String input) {boolean result true;int length input.length();for (int i 0; i length / 2; i) {if (input.charAt(i) ! input.charAt(length - i - 1)) {result false;break;}}System.out.println(input 对称吗 result);}
}
输出结果如下所示沉默王二 对称吗 false
沉默王二 二王默沉 对称吗 true
说一下我的思路要判断字符串对折后是否对称很简单从中间劈开第一个字符对照最后一个字符一旦找到不等的那个就返回 false。注意三点1for 循环的下标从 0 开始到 length/2 结束。2下标 i 和 length-i-1 是对称的。3一旦 false 就 break。04、如何删除所有出现的指定字符字符串类没有提供 remove() 方法但提供了 replaceAll() 方法通过将指定的字符替换成空白字符就可以办得到对吧public class RemoveCharFromString {public static void main(String[] args) {removeCharFromString(沉默王二, 二);removeCharFromString(chenmowanger, n);}private static void removeCharFromString(String input, char c) {String result input.replaceAll(String.valueOf(c), );System.out.println(result);}
}
输出结果如下所示沉默王
chemowager
05、如何证明字符串是不可变的字符串不可变的这个事我曾写过两篇文章写到最后我都要吐了。但是仍然会有一些同学弄不明白隔段时间就有人私信我我就不得不把之前的文章放到收藏夹问的时候我就把链接发给他。之所以造成这个混乱有很多因素比如说Java 到底是值传递还是引用传递字符串常量池是个什么玩意这次又不得不谈虽然烦透了但仍然要证明啊public class StringImmutabilityTest {public static void main(String[] args) {String s1 沉默王二;String s2 s1;System.out.println(s1 s2);s1 沉默王三;System.out.println(s1 s2);System.out.println(s2);}
}
输出结果如下所示true
false
沉默王二
1String s1 沉默王二Java 在字符串常量池中创建“沉默王二”这串字符的对象并且把地址引用赋值给 s12String s2 s1s2 和 s1 指向了同一个地址引用——常量池中的那个“沉默王二”。所以此时 s1 s2 为 true。3s1 沉默王三Java 在字符串常量池中创建“沉默王三”这串字符的对象并且把地址引用赋值给 s1但 s2 仍然指向的是“沉默王二”那串字符对象的地址引用。所以此时 s1 s2 为 falses2 的输出结果为“沉默王二”就证明了字符串是不可变的。06、如何统计字符串中的单词数这道题呢主要针对的是英文字符串的情况。虽然中文字符串中也可以有空白字符但不存在单词这一说。public class CountNumberOfWordsInString {public static void main(String[] args) {countNumberOfWords(My name is Wanger);countNumberOfWords(I Love Java Programming);countNumberOfWords( Java is very important );}private static void countNumberOfWords(String line) {String trimmedLine line.trim();int count trimmedLine.isEmpty() ? 0 : trimmedLine.split(\\s).length;System.out.println(count);}
}
输出结果如下所示4
4
4
split() 方法可以对字符串进行拆分参数不仅可以是空格也可以使正则表达式代替的空白字符多个空格、制表符返回的是一个数组通过 length 就可以获得单词的个数了。如果对 split() 方法很感兴趣的话可以查看我之前写的一篇文章很饱满很丰富。咦拆分个字符串都这么讲究07、如何检查两个字符串中的字符是相同的如何理解这道题呢比如说字符串“沉默王二”和“沉王二默”就用了同样的字符对吧比如说字符串“沉默王二”和“沉默王三”用的字符就不同理解了吧public class CheckSameCharsInString {public static void main(String[] args) {sameCharsStrings(沉默王二, 沉王二默);sameCharsStrings(沉默王二, 沉默王三);}private static void sameCharsStrings(String s1, String s2) {SetCharacter set1 s1.chars().mapToObj(c - (char) c).collect(Collectors.toSet());System.out.println(set1);SetCharacter set2 s2.chars().mapToObj(c - (char) c).collect(Collectors.toSet());System.out.println(set2);System.out.println(set1.equals(set2));}
}
输出结果如下所示[默, 沉, 王, 二]
[默, 沉, 王, 二]
true
[默, 沉, 王, 二]
[默, 沉, 三, 王]
false
上面的代码用到了 Stream 流看起来很陌生但很好理解就是把字符串拆成字符然后收集到 Set 中Set 是一个不允许有重复元素的集合所以就把字符串中的不同字符收集起来了。08、如何判断一个字符串包含了另外一个字符串这道题有点简单对吧上一道还用 Stream 流这道题就直接送分了不用怀疑自己就用字符串类的 contains() 方法。public class StringContainsSubstring {public static void main(String[] args) {String s1 沉默王二;String s2 沉默;System.out.println(s1.contains(s2));}
}
输出结果如下所示true
contains() 方法内部其实调用的是 indexOf() 方法public boolean contains(CharSequence s) {return indexOf(s.toString()) 0;
}
09、如何在不用第三个变量的情况下交换两个字符串这道题就有点意思了对吧尤其是前提条件不使用第三个变量。public class SwapTwoStrings {public static void main(String[] args) {String s1 沉默;String s2 王二;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、如何从字符串中找出第一个不重复的字符来上个例子来理解一下这道题。比如说字符串“沉默王沉沉默二”第一个不重复的字符是“王”对吧因为“沉”重复了“默”重复了。public class FindNonRepeatingChar {public static void main(String[] args) {System.out.println(printFirstNonRepeatingChar(沉默王沉沉默二));System.out.println(printFirstNonRepeatingChar(沉默王沉));System.out.println(printFirstNonRepeatingChar(沉沉沉));}private static Character printFirstNonRepeatingChar(String string) {char[] chars string.toCharArray();ListCharacter discardedChars new ArrayList();for (int i 0; i chars.length; i) {char c chars[i];if (discardedChars.contains(c))continue;for (int j i 1; j chars.length; j) {if (c chars[j]) {discardedChars.add(c);break;} else if (j chars.length - 1) {return c;}}}return null;}
}
输出结果如下所示王
默
null
说一下我的思路1把字符串拆分成字符数组。2声明一个 List把重复的字符放进去。3外层的 for 循环从第一个字符开始如果已经在 List 中继续下一轮。4嵌套的 for 循环从第一个字符的下一个字符j i 1开始遍历如果找到和之前字符重复的就加入到 List 中跳出内层的循环如果找到最后j chars.length - 1也没有找到就是第一个不重复的字符对吧11、如何检查字符串中只包含数字有一种很傻的解法就是用 Long.parseLong(string) 对字符串强转如果转不成整形那肯定不是只包含数字对吧但这种方法也太不可取了所以还得换一种巧妙的就是使用正则表达式。public class CheckIfStringContainsDigitsOnly {public static void main(String[] args) {digitsOnlyString(123 沉默王二);digitsOnlyString(123);}private static void digitsOnlyString(String string) {if (string.matches(\\d)) {System.out.println(只包含数字的字符串 string);}}
}
输出结果如下所示只包含数字123
12、如何实现字符串的深度拷贝?由于字符串是不可变的所以可以直接使用“”操作符将一个字符串拷贝到另外一个字符串并且互不影响。public class JavaStringCopy {public static void main(String args[]) {String str 沉默王二;String strCopy str;str 沉默王三;System.out.println(strCopy);}
}
输出结果如下所示沉默王二
这个例子和之前证明字符串是不可变的例子几乎没什么差别对吧这的确是因为字符串是不可变的如果是可变对象的话深度拷贝就要注意了最好使用 new 关键字返回新的对象。public Book getBook() {Book clone new Book();clone.setPrice(this.book.getPrice());clone.setName(this.book.getName());return clone;
}
关于不可变对象请点击下面的链接查看我之前写了一篇文章。这次要说不明白immutable类我就怎么地最后希望这 12 个精致的字符串操作小技巧可以帮助大家巩固一波基础反正我自己已经重新巩固了一波很有收获的样子感觉就像是“一群小精灵在我脑子里跳舞一样”学它就对了
往期推荐
URL 去重的 6 种方案(附详细代码)多图证明Java到底是值传递还是引用传递磊哥工作十几年了竟没有用过do-while文末送书关注下方二维码收获更多干货