原则
- 虽然使用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 -> demoServiceString 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的Splitterprivate static void guavaSplit() {String str = ",a,b,c";// 使用jdk自带的 split// [, a, b, c] 空值也取出来了System.out.println(Arrays.toString(str.split(",")));// guava apiList<String> list = Splitter.on(",").trimResults() // 去除空格.omitEmptyStrings() // 去除 空值.splitToList(str);// -> [a, b, c] 空值去掉了System.out.println(list);}
合并
可以用
join,但是建议用guava的Jointerprivate static void guavaJointer() {// 1. 指定 join 时添加的分隔符// 2. 并且join 有 null 时跳过Joiner joiner = Joiner.on("#").skipNulls();String result = joiner.join("a", "b", null, "c");// -> a#b#cSystem.out.println(result);// -> a#b#cresult = joiner.join(Lists.newArrayList("a", "b", null, "c"));System.out.println(result);}
