今天刚接触到Java有Hutool这样一个强大好用的工具包,封装了很多Java开发时的痛点,官方文档称使用hutool可以让Java代码的编写也变得甜甜的。
我在写一段生成算法题测试数据的Java代码中尝试使用了这个工具包,确实精简好用。但是使用过度导致了一个小bug。
首先上代码:
public class Main {
public static void main(String[] args) throws Exception {
String in="";
String template = "{}\n{}";
String template2 = "{} {}";
String str= "";
for(int i = 5; i <= 5; i++ ) {
TimeInterval timer = DateUtil.timer();
in = Convert.toStr(i)+".in";
int T = RandomUtil.randomInt(1,6); //T组数据
str = Convert.toStr(T);
for(int j=1; j<=T; j++) {
int N = RandomUtil.randomInt(1, 100001);
str = StrUtil.format(template, str, N);
for (int k = 1; k <= N; k++) {
int pos = RandomUtil.randomInt(1, 100001);
str = StrUtil.format(template2,str,pos);
}
}
FileWriter writer = new FileWriter(in);
writer.write(str);
System.out.println("Create File\t"+in+"\t"+timer.intervalRestart());
}
}
}
上文中的template = "{} {}"
就是Hutool包的一个功能,使用占位符来生成格式化的字符串。再下文中的str = StrUtil.fomat(template,str,pos)
就能按原字符串+空格+pos值这样格式化的生成字符串了
这里就是这段代码的问题所在,其实不需要这么麻烦,直接str.append(" ").append(Convert.toStr(pos));
即可,但是我初学hutool,糊涂的使用工具。
造成的结果是本来几秒就能跑完的程序足足要跑上十几分钟。
那么原因是什么呢,通过查看hutool包的源码可以发现,每一次使用格式化字符串来拼接代码都会新开一个StringBuilder,对于这个代码来说,生成最后的结果字符串足足开启了近百万个StringBuilder,当然是又卡又慢的要死。
所以,谨记教训,不要滥用工具包,平平淡淡才是真。
修改之后的代码:
public class Main {
public static void main(String[] args) throws Exception {
String in="";
String template = "{}\n{}";
String template2 = "{} {}";
StringBuilder str= new StringBuilder();
for(int i = 5; i <= 5; i++ ) {
TimeInterval timer = DateUtil.timer();
in = Convert.toStr(i)+".in";
int T = 5;//RandomUtil.randomInt(1,6); //T组数据
str = new StringBuilder(Convert.toStr(T));
for(int j=1; j<=T; j++) {
int N = 100000;//RandomUtil.randomInt(1, 100001);
str = new StringBuilder(StrUtil.format(template, str.toString(), N));
for (int k = 1; k <= N; k++) {
int pos = RandomUtil.randomInt(1, 100001);
str.append(" ").append(Convert.toStr(T)); //StrUtil.format(template2,str,pos);
}
}
FileWriter writer = new FileWriter(in);
writer.write(str.toString());
System.out.println("Create File\t"+in+"\t"+timer.intervalRestart()+"ms");
}
}
}