目录
3.Guava-Strings工具使用
3.1 使用示例
api方法 | 方法说明 |
---|---|
String emptyToNull(@Nullable String string) | 将空字符(Empty)转换为null |
String nullToEmpty(@Nullable String string) | 将null转换为空字符(Empty) |
boolean isNullOrEmpty(@Nullable String string) | 判断是否为null或者Empty |
String commonPrefix(CharSequence a, CharSequence b) | 求两字符串的公共前缀 |
String commonSuffix(CharSequence a, CharSequence b) | 求两字符串的公共后缀 |
String repeat(String string, int count) | 将字符串重复count次并进行拼接 |
String padStart(String string, int minLength, char padChar) | 从开始位置补全字符串 |
String padEnd(String string, int minLength, char padChar) | 从结尾位置补全字符串 |
//1.Strings工具类的使用
@Test
public void StringsMethodsCase(){
//(1)将空字符(Empty)转换为null
//规则:空字符和null均转换为null,否则保持不变
Assertions.assertEquals(Strings.emptyToNull(""),null);
Assertions.assertEquals(Strings.emptyToNull("Hello Strings"),"Hello Strings");
//(2)null转换为空字符(Empty)
//规则:null会转换为空字符(Empty),否则保持不变
Assertions.assertEquals(Strings.nullToEmpty(null),"");
Assertions.assertEquals(Strings.nullToEmpty("Hello Strings"),"Hello Strings");
//(3)判断是否为null或者Empty
Assertions.assertEquals(Strings.isNullOrEmpty(""),true);
Assertions.assertEquals(Strings.isNullOrEmpty(null),true);
//(3)两字符串的公共前缀
Assertions.assertEquals(Strings.commonPrefix("Hello","HeStrings"),"He");
//(4)两字符串的公共后缀
Assertions.assertEquals(Strings.commonSuffix("Hello","Stringsllo"),"llo");
//(5)字符串重复n次进行拼接
Assertions.assertEquals(Strings.repeat("He",5),"HeHeHeHeHe");
//(6)从开始位置补全字符串padStart(String string,int minLength,char padChar)
//规则:如果字符串string长度小于指定长度minLength,则使用padChar填充到长度minLength(在string首部填充)
//如果字符串string长度不小于指定长度minLength,则不做任何改变
Assertions.assertEquals(Strings.padStart("Hello",7,'A'),"AAHello");
Assertions.assertEquals(Strings.padStart("Hello",3,'A'),"Hello");
//(7)从结尾位置补全字符串
//规则:与padStart()类似,只是从尾部开始填充
Assertions.assertEquals(Strings.padEnd("Hello",7,'A'),"HelloAA");
Assertions.assertEquals(Strings.padEnd("Hello",3,'A'),"Hello");
}
3.2 源码分析
3.2.1 构造器
因为Strings类中所有的方法均是通过静态方法(static)提供外部使用,外界不需要使用Strings对应的对象,因此私有化构造方法
private Strings() {}
3.2.2 isNullOrEmpty
@Nullable表示该参数变量可以为null
最终实现代码:
return string == null || string.isEmpty();
3.2.3 emptyToNull
public static @Nullable String emptyToNull(@Nullable String string) {}
最终实现代码:
return stringIsNullOrEmpty(string) ? null : string;
static boolean stringIsNullOrEmpty(@Nullable String string) {
return string == null || string.isEmpty();
}
3.2.4 nullToEmpty
public static String nullToEmpty(@Nullable String string) {}
最终实现代码:
return (string == null) ? "" : string;
3.2.5 commonPrefix
public static String commonPrefix(CharSequence a, CharSequence b) {
//判断是否为null,a或者b为null,均直接抛出NPE
checkNotNull(a);
checkNotNull(b);
//两者最小长度(公共前缀长度不超过两者的最小长度)
int maxPrefixLength = Math.min(a.length(), b.length());
//从字符串开始比较是否相同直至失败
int p = 0;
while (p < maxPrefixLength && a.charAt(p) == b.charAt(p)) {
p++;
}
//判断最后两个字符是不是合法的“Java 平台增补字符”
if (validSurrogatePairAt(a, p - 1) || validSurrogatePairAt(b, p - 1)) {
p--;
}
return a.subSequence(0, p).toString();
}
3.2.6 commonSuffix
与commonPrefix类似,只是按位比较时从右向左
3.2.7 repeat
public static String repeat(String string, int count) {
//检查是否为null,如果为null,抛出NPE
checkNotNull(string);
//重复次数小于等于1
if (count <= 1) {
//重复次数必须大于等于0,否则报参数异常
checkArgument(count >= 0, "invalid count: %s", count);
//重复次数等于0,返回空串
//重复次数等一1,返回本身
return (count == 0) ? "" : string;
}
//字符串本身长度
final int len = string.length();
//重复后字符串长度
final long longSize = (long) len * (long) count;
//重复后长度最长不能超过intMax
final int size = (int) longSize;
if (size != longSize) {
//重复后太长,抛数据越界异常
throw new ArrayIndexOutOfBoundsException("Required array size too large: " + longSize);
}
//开辟size大小的char类型数组
final char[] array = new char[size];
//把这个字符串中的[0,len)区间的字符复制到目标字符数组array的[0,len)区间
string.getChars(0, len, array, 0);
int n;
for (n = len; n < size - n; n <<= 1) {
//复制原数组array中[0,n)区间的数据到目标数组array中[n,2n)区间中
System.arraycopy(array, 0, array, n, n);
}
//复制原数组array中[0,size-n)区间数据到目标数组[n,size)区间中
System.arraycopy(array, 0, array, n, size - n);
return new String(array);
}
System.arrayCopy说明:实现数组间的复制
public static native void arraycopy(Object src,int srcPos,Object dest, int destPos,int length);
参数说明:
Object src:原数组
int srcPos:从原数组的起始位置开始
Object dest:目标数组
int destpos:目标数组的开始位置
int length:要copy的数组的长度
repeat牛逼的地方:不是重复n次就循环调用System.arrayCopy()n次,而是[0,n)–>复制得到[0,2n)–>复制得到[0,4n),极大减少了数组间复制的次数。
3.2.7 padStart
public static String padStart(String string, int minLength, char padChar) {
//检查是否为null,为null则抛出NPE
checkNotNull(string);
//字符串长度已经大于指定长度,直接返回
if (string.length() >= minLength) {
return string;
}
//用StringBuilder直接拼接-->先拼接padChar
StringBuilder sb = new StringBuilder(minLength);
for (int i = string.length(); i < minLength; i++) {
sb.append(padChar);
}
sb.append(string);
return sb.toString();
}
3.2.8 padEnd
与padStart实现类似,只是后拼接padChar