原则
- 虽然使用new 声明的字符串调用intern方法,也可以让字符串进行驻留,但在业务代码中滥用intern,可能会产生性能问题。
-XX:+PrintStringTableStatistic
可以查看字符串常量表- 字符串常量池是一个固定容量的Map。如果容量太小(Number of buckets=60013)、字符串太多(1000万个字符串),那么每一个桶中的字符串数量会非常多,所以搜索起来就很慢。输出结果中的Average bucket size=167,代表了Map中桶的平均长度是167。
-XX:StringTableSize=xxx
可以设置字符串常量表长度
- 所以没事别轻易用intern,如果要用一定要注意控制驻留的字符串的数量,并留意常量表的各项指标。
hashcode、equals、compareTo
- hashcode 可以通过
Objects.hash
方法生成 - 如果要实现
Comparable
,请记得equals
、hashCode
、compareTo
三者逻辑一致 - lombok 的注解默认不实现父类的属性
乱码问题
原因
- 指定的字符集不支持复杂汉字
- 使用支持复杂汉字的字符集
- 字节数组和字符串相互转换时字符串不匹配
- 使用相同字符集
- 一般都用 UTF-8 即可
private static void characterDemo() {
String str = "呵呵哒";
// 指定字符集
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
// 指定字符集
String target = new String(bytes, StandardCharsets.UTF_8);
}
首字母大写/小写
使用
substring()
public String substring(int beginIndex [,int endIndex])
substring()
是调用String
的一个构造方法,后者调用Arrays.copyOfRange(字符数组, 开始offset, 结束offset);
/**
* 首字母小写
*/
private static void firstCharacterLower() {
String name = DemoService.class.getName();
// DemoService -> demoService
String targetName = name.substring(0, 1).toLowerCase() + name.substring(1);
}
equals 如何实现
- 如果内存地址不一致(
==
进行比较) ,false - 如果类型不一致 (
instance
进行比较 ),false- 如果长度不一致,false
- 如果内容不一致 false
常用 api
替代
拆分
简单场景可以用
public String[] split(String regex [,int limit])
private static void simpleSplitDemo() {
String str = "a,b,c";
// 分成三个 [a, b, c]
System.out.println(Arrays.toString(str.split(",")));
// 分成 limit 个 [a, b,c]
System.out.println(Arrays.toString(str.split(",", 2)));
}
但是如果需要结果去除空值等要求,可以用
guava
的Splitter
private static void guavaSplit() {
String str = ",a,b,c";
// 使用jdk自带的 split
// [, a, b, c] 空值也取出来了
System.out.println(Arrays.toString(str.split(",")));
// guava api
List<String> list = Splitter.on(",")
.trimResults() // 去除空格
.omitEmptyStrings() // 去除 空值
.splitToList(str);
// -> [a, b, c] 空值去掉了
System.out.println(list);
}
合并
可以用
join
,但是建议用guava
的Jointer
private static void guavaJointer() {
// 1. 指定 join 时添加的分隔符
// 2. 并且join 有 null 时跳过
Joiner joiner = Joiner.on("#").skipNulls();
String result = joiner.join("a", "b", null, "c");
// -> a#b#c
System.out.println(result);
// -> a#b#c
result = joiner.join(Lists.newArrayList("a", "b", null, "c"));
System.out.println(result);
}