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.
评论