3、Guava-Strings工具使用

文章介绍了Guava库中Strings工具类的使用,包括将空字符转为null、null转为空字符、判断字符串是否为空、求字符串公共前缀和后缀、字符串重复以及字符串首尾补全的方法。同时,对源码进行了分析,如isNullOrEmpty方法、emptyToNull、nullToEmpty等的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

strings.com 是强大的纯DOS环境 下的文本处理工具 STRINGS常用方法: 1、把文本文件 LIST.TXT 包含的行数赋值给变量 LN STRINGS LN=LINESIZE LIST.TXT 2、把文本文件 LIST.TXT 的大小传递给变量FS STRINGS FS=FILESIZE LIST.TXT 3、读取文本文件 LIST.TXT 的第5行内容并赋值给变31333137量 LN STRINGS LN=READ LIST.TXT,5 4、把变量 N 在原有基础上+1 和 -1 STRINGS N=ADD %N%,1 STRINGS N=SUB %N%,1 5、把字符串 ABCDEFG 中第四个字符以及后面共3个字符传递给变量 LX (DEF) STRINGS LX=MID ABCDEFG,4,3 6、查找字符串 ABCDEFG 中D所在的位置并赋值给变量DX,如果没找到DX=0 STRINGS DX=FIND ABCDEFG,D 7、找出字符串 ABCD EFG HIJ KLMN 中第二个单词并赋值给变量L2 STRINGS L2=PARSE ABCD EFG HIJ KLMN ,2 应用举例:逐一显示文件 LIST.TXT 各行内容 @ECHO OFF REM 读取LIST.TXT大小如果是0就转入 ERROR段 STRINGS FS=FILESIZE LIST.TXT IF %FS%*==0* GOTO ERROR REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT各行内容。 STRINGS L=LINESIZE LIST.TXT STRINGS L=ADD %L%,1 SET N=0 :LOOP STRINGS N=ADD %N%,1 STRINGS LX=READ LIST.TXT,%N% ECHO %LX% IF %N%*==%L%* GOTO END GOTO LOOP :ERROR ECHO LIST.TXT IS NULL :END SET FS= SET L= SET N= SET LX= --------------------------------------------- NSET 的常用方法: 1、把某一命令的执行结果传递给变量。 A.把 DIR 命令执行结果第7行中的第2个单词传递给变量 DIRX DIR /A /S |NSET /L7 DIRX=$2 B.把当前路径传递给变量 CDX CD |NSET CDX=$0 2、获取 LIST.TXT 文件第5行第2个单词的内容并赋值给变量 L52 NSET /L5 L52=$2 <LIST.TXT 举例:显示出 LIST.TXT 文件中第二个单词是 SYSTEM 的行的内容。 @ECHO OFF REM 读取LIST.TXT大小如果是0就转入 ERROR段 STRINGS FS=FILESIZE LIST.TXT IF %FS%*==0* GOTO ERROR REM 读取 LIST.TXT 行数 并用N作计数器以循环方式显示 LIST.TXT中第二个单词是 REM SYSTEM 的行的内容,每找到一个符合条件的行,就把变量M在原有基础上+1。 STRINGS L=LINESIZE LIST.TXT STRINGS L=ADD %L%,1 SET N=0 SET M=0 :LOOP STRINGS N=ADD %N%,1 STRINGS LX=READ LIST.TXT,%N% REM STRINGS LX2=PARSE %LX%,2 NSET /L%N% LX2=$2 diskn.txt REM 如果存在DISKN2.TXT 就删除之 if exist diskn2.txt del diskn2.txt >nul REM 获取DISKN.TXT文件行数并用N做计数器逐行判断,并把需要的信息传递给DISKN2.TXT REM 如果该行前两个字符是 NO 说明没有硬盘,就退出脚本 RE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值