Strings源码解析
Strings类介绍
Strings是Guava提供的一个操作String的方法类集合。功能没有apache-commons的StringUtils类强大。但这边分析的是Guava的源码,所以……
首先,看下Strings类提供了哪些方法我们可以使用。
1 | public static void main(String[] args) { |
类图
主要属性
无
主要方法
Strings()
1 | private Strings() {} |
私有的构造函数,表明这个类不希望被实例化。
Strings类也是被final字符修饰的,同样表明这个类不需要被实例化。
nullToEmpty()
1 | /** |
如果传入的字符串是null,则将它转为空字符串""
返回,否则返回原字符串。
Platform.nullToEmpty()
1 | static String nullToEmpty( { String string) |
静态方法,如果字符串为null,返回空字符串,否则返回原字符串。
isNullOrEmpty()
1 | /** |
如果传入的字符串为null或者长度为0,返回true,否则返回false。
Platform.stringIsNullOrEmpty()
1 | static boolean stringIsNullOrEmpty( { String string) |
如果传入的字符串为null或者长度为0,返回true,否则返回false。
padStart()
1 | /** |
将一个字符串加上指定的前缀,直到长度满足指定的长度。如果当前字符串的长度已经大于等于指定的长度,则直接返回当前字符串。
padEnd()
1 | /** |
将一个字符串加上指定的后缀,直到长度满足指定的长度。如果当前字符串的长度已经大于等于指定的长度,则直接返回当前字符串。
repeat
1 | /** |
将一个字符串重复指定的次数返回。
以字符串abc
为例,假设我们需要重复它5次。
初始化时:len = 3;longSize = 3 * 5 = 15;array = new char[15];
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
执行到代码28行。string.getChars(0,len,array,n,n);方法将字符串abc
拷贝到数组的起始位置,此时数组为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a | b | c |
进入30行的循环时,n = 3, size - n = 12,执行数组拷贝,此时数组为
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a | b | c | a | b | c |
因为n = 6 < (size - n = 9),所以会在执行一次数组拷贝,此时要在位置6处,从数组array的头部,拷贝6个元素(n <<= 1的结果为3 × 2,左移)。此时数组为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a | b | c | a | b | c | a | b | c | a | b | c |
此时n = 12 > (size - 12 = 3),跳出循环。
最后在33行,执行拷贝,将位置12-14填充。得到:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
a | b | c | a | b | c | a | b | c | a | b | c | a | b | c |
commonPrefix()
1 | /** |
寻找两个字符串的公共前缀。
validSurrogatePairAt()
1 | /** |
众所周知java采用UTF-16编码unicode字符集。UTF-16使用使用一个16位单元(两字节)或者两个16为单元表示一个unicode字符。使用两个单元的,前面那个单元叫highsurrogate 后面那个叫lowsurrogate。而char只占一个16位单元(两字节),在判断的时候使用的char来进行的比较。所以最后一个字符是占4字节的字符的时候会出现highsurrogate 相同,lowsurrogate不同,非同一个单元对,这就表明不是一个相同的字符。所以公共前缀的长度需要减一。
commonSuffix()
1 | /** |
寻找两个字符串的公共后缀。
1 | /** |
向模式串中的%s处按序插入目标对象。如果%s不够的话,该方法会尽最大可能的返回合理的结果,而不是和JDK提供的方法一样抛出异常。
lenientToString()
1 | private static String lenientToString( { Object o) |
讲一个对象转为String返回。
如果该对象为null,返回字符串形式的null。否则调用该对象的toString方法。如果调用出异常的话,就返回该对象的HashCode。类名+‘@’+此对象的哈希码。