OMG,12 个精致的 Java 字符串操作小技巧,学它(2)

简介: OMG,12 个精致的 Java 字符串操作小技巧,学它

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

沉默王二



1)String s1 = "沉默王二",Java 在字符串常量池中创建“沉默王二”这串字符的对象,并且把地址引用赋值给 s1


2)String s2 = s1,s2 和 s1 指向了同一个地址引用——常量池中的那个“沉默王二”。


所以,此时 s1 == s2 为 true。


3)s1 = "沉默王三",Java 在字符串常量池中创建“沉默王三”这串字符的对象,并且把地址引用赋值给 s1,但 s2 仍然指向的是“沉默王二”那串字符对象的地址引用。


所以,此时 s1 == s2 为 false,s2 的输出结果为“沉默王二”就证明了字符串是不可变的。


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) {
        Set<Character> set1 = s1.chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
        System.out.println(set1);
        Set<Character> set2 = s2.chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
        System.out.println(set2);
        System.out.println(set1.equals(set2));
    }
}



输出结果如下所示:


[默, 沉, 王, 二]

[默, 沉, 王, 二]

true

[默, 沉, 王, 二]

[默, 沉, 三, 王]

false

1

2

3

4

5

6

上面的代码用到了 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

1

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

2

说一下我的思路:


1)通过 concat() 方法把两个字符串拼接到一块。


2)然后通过 substring() 方法分别取出第二个字符串和第一个字符串。


相关文章
|
2月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
47 1
|
4天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
12 3
|
4天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
7 2
|
7天前
|
存储 移动开发 Java
java核心之字符串与编码
java核心之字符串与编码
13 2
|
15天前
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
205 4
|
24天前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
|
1月前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
|
2月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
46 0
|
2月前
|
存储 Java API
下一篇
无影云桌面