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

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

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

相关文章
|
26天前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
99 60
|
16天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
36 6
|
1月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
50 15
|
1月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
50 4
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
52 3
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
18 2
|
2月前
|
存储 移动开发 Java
java核心之字符串与编码
java核心之字符串与编码
23 2
|
2月前
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
764 4
|
2月前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
131 11
|
2月前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
下一篇
无影云桌面