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
2
说一下我的思路:
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(); List<Character> 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
3
说一下我的思路:
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 个精致的字符串操作小技巧可以帮助大家巩固一波基础,反正我自己已经重新巩固了一波,很有收获的样子,感觉就像是“一群小精灵在我脑子里跳舞一样”,学它就对了!