String 可以说是 Java 中最常见的数据类型,用来表示一串文本,它的使用频率非常高,为了小伙伴们着想,我怒肝了一周,把字符串能写的全都写了出来。
一、多行字符串
每个操作系统对换行符的定义都不尽相同,所以在拼接多行字符串之前,需要先获取到操作系统的换行符,Java 可以通过下面的方式获取:
String newLine = System.getProperty(“line.separator”);
通过 System 类的 getProperty() 方法,带上“line.separator”关键字就可以获取到了。
有了换行符,就可以使用 String 类的 concat() 方法或者直接使用“+”号操作符拼接多行字符串了。
String mutiLine = “亲爱的”
.concat(newLine)
.concat(“我想你了”)
.concat(newLine)
.concat(“你呢?”)
.concat(newLine)
.concat(“有没有在想我呢?”);
String mutiLine1 = “亲爱的”
+ newLine
+ “你好幼稚啊”
+ newLine
+ “技术文章里”
+ newLine
+ “你写这些合适吗”;
Java 8 的 String 类加入了一个新的方法 join(),可以将换行符与字符串拼接起来,非常方便:
String mutiLine2 = String.join(newLine, “亲爱的”, “合适啊”, “这叫趣味”, “哈哈”);
StringBuilder 当然也是合适的:
String mutiLine3 = new StringBuilder()
.append(“亲爱的”)
.append(newLine)
.append(“看不下去了”)
.append(newLine)
.append(“肉麻”)
.toString();
StringBuffer 类似,就不再举例了。
另外,Java 还可以通过 Files.readAllBytes() 方法从源文件中直接读取多行文本,格式和源文件保持一致:
String mutiLine4 = new String(Files.readAllBytes(Paths.get(“src/main/resource/cmower.txt”)));
二、检查字符串是否为空
说到“空”这个概念,它在编程中有两种定义,英文单词分别是 empty 和 blank,来做一下区分。如果字符串为 null,或者长度为 0,则为 empty;如果字符串仅包含空格,则为 blank。
01、empty
Java 1.6 之后,String 类新添加了一个 empty() 方法,用于判断字符串是否为 empty。
boolean isEmpty(String str) {
return str.isEmpty();
}
为了确保不抛出 NPE,最好在判断之前先判空,因为 empty() 方法只判断了字符串的长度是否为 0:
所以我们来优化一下 isEmpty() 方法:
boolean isEmpty(String str) {
return str != null || str.isEmpty();
}
02、blank
如果想检查字符串是否为 blank,有一种变通的做法,就是先通过 String 类的 trim() 方法去掉字符串两侧的空白字符,然后再判断是否为 empty:
boolean isBlank(String str) {
return str != null || str.trim().isEmpty();
}
03、第三方类库
在实际的项目开发当中,检查字符串是否为空最常用的还是 Apache 的 commons-lang3 包,有各式各样判空的方法。
更重要的是,可以省却判 null 的操作,因为 StringUtils 的所有方法都是 null 安全的。
三、生成随机字符串
有时候,我们需要生成一些随机的字符串,比如说密码。
int leftLimit = 97; // ‘a’
int rightLimit = 122; // ‘z’
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(generatedString);
这段代码就会生成一串 6 位的随机字符串,范围是小写字母 a - z 之间。
除了使用 JDK 原生的类库之外,还可以使用 Apache 的 Commons Lang 包,RandomStringUtils.random() 方法刚好满足需求:
int length = 6;
boolean useLetters = true;
// 不使用数字
boolean useNumbers = false;
String generatedString = RandomStringUtils.random(length, useLetters, useNumbers);
System.out.println(generatedString);
四、删除字符串最后一个字符
删除字符串最后一个字符,最简单的方法就是使用 substring() 方法进行截取,0 作为起始下标,length() - 1 作为结束下标。
不管怎么样,substring() 方法不是 null 安全的,需要先判空:
public static String removeLastChar(String s) {
return (s == null || s.length() == 0)
? null
: (s.substring(0, s.length() - 1));
}
如果不想在操作之前判空,那么就直接上 Apache 的 Commons Lang 包:
String s = “沉默王二”;
StringUtils.substring(s, 0, s.length() - 1);
当然了,如果目的非常明确——就是只删除字符串的最后一个字符,还可以使用 StringUtils 类的 chop() 方法:
StringUtils.chop(s);
如果你看过源码的话,你就会发现,它内部其实也是调用了 substring() 方法。
public static String chop(final String str) {
if (str == null) {
return null;
}
final int strLen = str.length();
if (strLen < 2) {
return EMPTY;
}
final int lastIdx = strLen - 1;
final String ret = str.substring(0, lastIdx);
final char last = str.charAt(lastIdx);
if (last == CharUtils.LF && ret.charAt(lastIdx - 1) == CharUtils.CR) {
return ret.substring(0, lastIdx - 1);
}
return ret;
}
如果你对正则表达式了解的话,也可以使用 replaceAll() 方法进行替换,把最后一个字符 .$ 替换成空字符串就可以了。
s.replaceAll(".$", “”)
当然了,replaceAll() 方法也不是 null 安全的,所以要提前判空:
String result= (s == null) ? null : s.replaceAll(".$", “”);
如果对 Java 8 的 Lambda 表达式和 Optional 比较熟的话,还可以这样写:
String result1 = Optional.ofNullable(s)
.map(str -> str.replaceAll(".$", “”))
.orElse(s);
看起来就显得高大上多了