这个工具类是前人留下来的,但是里面有些代码性能不是很好,需要优化一下。
- Collection工具类在初始化的时候最好能指定容量大小,这样避免了重新扩容带来的时间时间开销。例如:
//旧版本
public static Set<String> split2Set(String str, String split) {
HashSet<String> set = new HashSet<>();
String[] split2 = str.split(split);
for (String string : split2) {
set.add(string); //当set容量不足时,需要进行扩容,造成一定的时间开销。
}
return set;
}
//新版本
public static Set<String> split2Set(String str, String regex) {
String[] strArr = str.split(regex);
/*
我们直接在初始化的时候就指定HashSet的容量
*/
return new HashSet<>(Arrays.asList(strArr));//new ArrayList(Arrays.asList(strArr))
}
在这里再多说一下Arrays.asList(strArr)和new ArrayList(Arrays.asList(strArr))的区别。
Arrays.asList()返回的ArrayList并不是我们平常所使用的ArrayList,这个ArrayList是Arrays的一个静态内部类,它不可修改。还有另一个重要区别,Arrays$ArrayList所存储的值其实就是strArr的整体,也就是说,如果strArr的顺序、赋值发生了变化,Arrays$ArrayList也会发生变化。
char[] val = value; /* avoid getfield opcode */是什么意思?
avoid getfield opcode是String API中的内容,这里,value是String Class的成员变量,存储在堆中,为了避免每次使用它,我们都要去堆取,就使用char[] val将value存放到栈中。