java中字符串相关操作解析

一、多行字符串

每个操作系统对换行符的定义都不尽相同,所以在拼接多行字符串之前,需要先获取到操作系统的换行符,Java 可以通过下面的方式获取:

String newLine = System.getProperty("line.separator");

有了换行符,就可以使用 String 类的 concat() 方法或者直接使用“+”号操作符拼接多行字符串了。也可以使用StringBuilder 和StringBuffer也是可以的。

Java 8 的 String 类加入了一个新的方法 join(),可以将换行符与字符串拼接起来。

另外,Java 还可以通过 Files.readAllBytes() 方法从源文件中直接读取多行文本,格式和源文件保持一致:

String mutiLine = new String(Files.readAllBytes(Paths.get("src/main/resource/cmower.txt")));

使用String拼接多行字符串示例如下:

String newLine = System.getProperty("line.separator");
String useJoin = String.join(newLine, "hello", "world", "!");
System.out.println("使用java 8 String Join方法:" + newLine + useJoin);
// 输出结果如下
使用java 8 String Join方法:
hello
world
!

二、检查字符串是否为空

说到“空”这个概念,它在编程中有两种定义,英文单词分别是 empty 和 blank,来做一下区分。

如果字符串为 null,或者长度为 0,则为 empty;如果字符串仅包含空格,则为 blank。

示例如下:

// 区分空字符串:1、只有空格的字符串;2、为空的字符串
String blank = "  ";
String containNull = "";
System.out.println("只有空格的字符串" + StringUtils.isBlank(blank));
System.out.println("为null的字符串" + StringUtils.isEmpty(containNull));

三、生成随机字符串

有时候,我们需要生成一些随机的字符串,比如说密码,校验码等。

(1)使用原生jdk的方式生成随机数

// 生成a-z之间的随机6位数
// 'a'
int leftLimit = 97;
// 'z'
int rightLimit = 122;
int targetStringLength = 6;
Random random = new Random();
StringBuilder buffer = new StringBuilder(targetStringLength);
for (int i = 0; i < targetStringLength; i++) {
    int randomLimitedInt = leftLimit + (int) (random.nextFloat() * (rightLimit - leftLimit + 1));
    buffer.append((char) randomLimitedInt);
}
String generatedString = buffer.toString();

System.out.println("使用原生类库随机生成6位密码" + generatedString);

(2)使用 Apache 的 Commons Lang 包,RandomStringUtils.random() 生成随机数

// 使用工具类随机生成字符,第一个参数:位数,第二个参数:是否生成包含字符的随机字符,第三个参数:是否生成包含数字的随机数
String password = RandomStringUtils.random(6, true, true);

System.out.println("使用工具类随机生成6位密码:" + password);

四、删除字符串最后一个字符

删除字符串最后一个字符,最简单的方法就是使用 substring() 方法进行截取,0 作为起始下标,length() - 1 作为结束下标。

(1)不管怎么样,substring() 方法不是 null 安全的,需要先判空

示例如下:

String removeLastWords = "jason";
System.out.println("去掉最后一个字符串:" + removeLastChar(removeLastWords));

public static String removeLastChar(String s) {
    return (s == null || s.length() == 0) ? null : (s.substring(0, s.length() - 1));
}

(2)如果不想在操作之前判空,那么就直接用Apache 的 Commons Lang 包中的工具类

String removeLastWords = "jason";
System.out.println("使用工具类:" + StringUtils.substring(removeLastWords, 0, removeLastWords.length() - 1));

(3)如果目的非常明确——就是只删除字符串的最后一个字符,还可以使用 StringUtils 类的 chop() 方法

String removeLastWords = "jason";
System.out.println("目的非常明确:" + StringUtils.chop(removeLastWords));

// chop方法源码,内部也是使用的subString方法
public static String chop(String str) {
    if (str == null) {
        return null;
    } else {
        int strLen = str.length();
        if (strLen < 2) {
            return "";
        } else {
            int lastIdx = strLen - 1;
            String ret = str.substring(0, lastIdx);
            char last = str.charAt(lastIdx);
            return last == '\n' && ret.charAt(lastIdx - 1) == '\r' ? ret.substring(0, lastIdx - 1) : ret;
        }
    }
}

(4)如果你对正则表达式了解的话,也可以使用 replaceAll() 方法进行替换,把最后一个字符 .$ 替换成空字符串就可以了。

String removeLastWords = "jason";
System.out.println("使用正则表达式:" + removeLastWords.replaceAll(".$", ""));

当然了,replaceAll() 方法也不是 null 安全的,所以要提前判空:

String result= (removeLastWords == null) ? null : removeLastWords.replaceAll(".$", "");

(5)如果对 Java 8 的 Lambda 表达式和 Optional 比较熟的话,还可以这样写

String removeLastWords = "jason";
String result1 = Optional.of(removeLastWords).map(str -> str.replaceAll(".$", "")).orElse(removeLastWords);
System.out.println("使用lambda:" + result1);

五、统计字符在字符串中出现的次数

要统计字符在字符串中出现的次数,有很多方法,如下:

(1)直接使用 JDK 的 API 就是最直接的一种

// 统计字符在字符串中出现的次数
String someString = "jasonn";
char someChar = 'n';
int count = 0;

for (int i = 0; i < someString.length(); i++) {
    if (someString.charAt(i) == someChar) {
        count++;
    }
}
System.out.println("n出现的次数:" + count);

(2)使用Java 8 的特性

String someString = "jasonn";
long count = someString.chars().filter(ch -> ch == 'n').count();
System.out.println("使用java 8特性:" + count1);

(3)使用第三方类库,可以选择 Apache 的 Commons Lang 包

String someString = "jasonn";
int result =  StringUtils.countMatches(someString, "n");
System.out.println("使用第三方类库:" + result);

六、拆分字符串

大多数情况下,String 类的 split() 方法就能够满足拆分字符串的需求,除了这个还有其他的方法,如下:

(1)使用String的split()方法

// 拆分字符串
String str = "a,b,c,d";
String[] arryStr = str.split(",");
System.out.println("拆分的字符串:" + ArrayUtils.toString(arryStr));
// 结果如下
拆分的字符串:{a,b,c,d}

(2)使用Apache 的 Commons Lang 包中的StringUtils 类

String str = "a,b,c,d";
System.out.println("使用工具类:" + ArrayUtils.toString(StringUtils.split(str, ",")));

七、字符串比较

字符串的比较有两种方法:使用==和equals()来进行比较。

String a = "jason";
String b = "jason";
String c = new String("jason");
// true
System.out.println(a == b);
// false
System.out.println(a == c);
// true
System.out.println(a.equals(c));

需要注意:

== :当用于值比较时 比较数值是否相等,用于比较引用时是比较两个对象的引用地址是否相同;

equals:就是用来判断字符串的值是否相等。

八、字符串拼接

在操作字符串时经常会遇到字符串拼接的场景,拼接字符串的方法如下:

(1)+号操作符拼接字符串

String firstStr = "jason";
String secondStr = "小蜗牛";
String result = firstStr + secondStr; // +号操作在底层其实是使用的StringBuilder的append方法
System.out.println(result);
// 结果
jason小蜗牛

(2)使用StringBuilder(线程不安全) 和StringBuffer(线程安全)

StringBuilder stringBuilder = new StringBuilder();
System.out.println(stringBuilder.append(firstStr).append(secondStr));

StringBuffer stringBuffer = new StringBuffer();
System.out.println(stringBuffer.append(firstStr).append(secondStr));

// 结果
jason小蜗牛

(3)String 类的 concat 方法

String firstStr = "jason";
String secondStr = "小蜗牛";
String result = firstStr.concat(secondStr)
System.out.println(result);

(4)String 类的 join 方法

JDK 1.8 提供了一种新的字符串拼接方式:String 类增加了一个静态方法 join。

String firstStr = "jason";
String secondStr = "小蜗牛";
String result = String.join("",firstStr, secondStr); // 第一个参数是分隔符
System.out.println(result);

(5)使用Apache 的 Commons Lang3 包中的工具类

String firstStr = "jason";
String secondStr = "小蜗牛";
String result = StringUtils.join(firstStr, secondStr);
System.out.println(result);
posted @ 2020-10-23 11:39  jason小蜗牛  阅读(491)  评论(0编辑  收藏  举报