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);