优化工具类StringUtil

244 阅读1分钟

这个工具类是前人留下来的,但是里面有些代码性能不是很好,需要优化一下。

  1. 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,这个ArrayListArrays的一个静态内部类,它不可修改。还有另一个重要区别,Arrays$ArrayList所存储的值其实就是strArr的整体,也就是说,如果strArr的顺序、赋值发生了变化,Arrays$ArrayList也会发生变化。

  1. char[] val = value; /* avoid getfield opcode */是什么意思?
    avoid getfield opcode是String API中的内容,这里,value是String Class的成员变量,存储在堆中,为了避免每次使用它,我们都要去堆取,就使用char[] val将value存放到栈中。