String源码解析-String的使用注意2

454 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

String源码解析-String的使用注意

String的拆分

对于String拆分,我们常用的方法是spit,此方法声明的源代码:

    public String[] split(String regex, int limit) {
        ......
    }
    
    public String[] split(String regex) {
        ......
    }

方法有两个入参,一个是用于拆分的标准字符,另一个参数是限制用于拆分成几个元素。

另一个重载方法是一个参数,只包含一个用于拆分的字符,默认全部拆分。

Demo:

public class Demo {

    public static void main(String[] args) {
        String s = "a,b,c";
        System.out.println(s.split(",", 1));
        System.out.println(s.split(","));
    }
}

两个方法拆分的结果是不同的,limit参数会起到限制的作用,而且从结果可以看出不会再包含有拆分的字符。

再看以下Demo:

public class Demo {

    public static void main(String[] args) {
        String s = ",a,b,c";
        String[] split = s.split(",");
    }
}

最后的结果: 0 = "" 1 = "a" 2 = "b" 3 = "c" 可以看到,在返回数组的0位置,有一个空字符,String原生api没有提供可以去掉空格的字符串拆分方法,可以使用一些其他第三方api:

public class Demo {

    public static void main(String[] args) {
        String s = ",a,b,c";
        List<String> list = Splitter.on(',')
                    .trimResults()
                    .omitEmptyStrings()
                    .splitToList(a);
    }
}

这是Guava提供的API,对字符串进行分割,trimResults()表示方法内部会去掉空格,omitEmptyStrings()表示方法会去掉空值。

String的拼接

拼接一般使用的方法是join(),代码Demo:

String result = String.join("-",“a”,“b”,“c”,“d”);
String result2 = String.join("-",“a”,“b”,“c”,“d”).join("-",“a”,“b”);
result输出:a-b-c-d
result2输出:a-b

可以看出,如果进行连续拼接,最后一次的拼接会把前面所有的拼接全部覆盖。Guava也有相应的api提供,可以避免覆盖:

Joiner joiner = Joiner.on(",").skipNulls();
String result = joiner.join("hello","world").join("hello","world");


result结果为;hello,world,hello,world

此外,Joiner还可以拼接字符串List的所有参数,这里就不再贴相应代码,有兴趣可以进一步了解。

字符串的乱码问题

此处只是简单的提一下,不少时候会遇到字符串乱码的问题,比如打印一个字符串,结果打印的结果为???,其具体原因还是因为编码有问题。此时可以显示的写明编码方式,如:

String s1  ="hi 姜夔";
byte[] bytes = s1.getBytes("UTF-8");
String s2 = new String(bytes);
System.out.println(s2);

此时s2就不会乱码,因为此处显示的指定了编码集为UTF-8.