@Test
public void listToString() {
ArrayList<String> longList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
longList.add(String.valueOf(i));
}
//方法1
long startTime1 = System.currentTimeMillis();
String join1 = getString1(longList);
long endTime1 = System.currentTimeMillis();
log.info("方法一耗时:数据量:{},耗时{}", longList.size(), (endTime1 - startTime1));
long startTime2 = System.currentTimeMillis();
//方法2
String join2 = getString2(longList);
long endTime2 = System.currentTimeMillis();
log.info("方法二耗时:数据量:{},耗时{}", longList.size(), (endTime2 - startTime2));
long startTime3 = System.currentTimeMillis();
//方法3
String join3 = getString3(longList);
long endTime3 = System.currentTimeMillis();
log.info("方法三耗时:数据量:{},耗时{}", longList.size(), (endTime3 - startTime3));
long startTime4 = System.currentTimeMillis();
//方法4
String join4 = getString4(longList);
long endTime4 = System.currentTimeMillis();
log.info("方法四耗时:数据量:{},耗时{}", longList.size(), (endTime4 - startTime4));
long startTime5 = System.currentTimeMillis();
//方法5
String join5 = getString5(longList);
long endTime5 = System.currentTimeMillis();
log.info("方法四耗时:数据量:{},耗时{}", longList.size(), (endTime5 - startTime5));
log.info("原始数据:{}",longList);
log.info(join1);
log.info(join2);
log.info(join3);
log.info(join4);
log.info(join5);
}
//方法1
public static String getString1(List<String> strList) {
if (CollectionUtils.isEmpty(strList)) {
return "";
}
return strList.stream().collect(Collectors.joining(","));
}
//方法2
@NotNull
private static String getString2(ArrayList<String> longList) {
return StringUtils.collectionToCommaDelimitedString(longList);
}
//方法3
private static String getString3(ArrayList<String> longList) {
return org.apache.commons.lang3.StringUtils.join(longList, ",");
}
//方法4
private static String getString4(ArrayList<String> longList) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < longList.size(); i++) {
sb.append(i);
if (i < longList.size() - 1) {
sb.append(",");
}
}
return String.valueOf(sb);
}
//方法5
private static String getString5(ArrayList<String> longList) {
return String.join(",", longList);
}
话不多说,上运行结果
注意 方法一跟方法五,如果数组是其它类型的 还需要转成String类型才能使用,如下
longList.stream().map(a -> String.valueOf(a)).collect(Collectors.toList());
耗时对比
数量级 百
结果:运行多次五种方式每次运行结果耗时相差不大
结论:运行多次效率比方法四=方法五>方法二>方法三>>方法一
数量级 千
结果:运行多次五种方式每次运行结果耗时相差不大
结论:运行多次效率比方法四>=方法五>方法二>方法三>>方法一
数量级 万
结果:运行多次五种方式每次运行结果耗时相差不大
结论:运行多次效率比方法四=方法五>方法二>方法三>>方法一
数量级 十万
结果:运行多次,其中方法五效率明显高于其它四种方法,方法二、方法三、方法四效率相差不大各有胜负,方法一效率最差远低于其它四种方法
结论:,方法五>方法二>=方法三>=方法四>>方法一
数量级 百万
结果:运行多次,其中方法五效率依然高于其它四种方法,方法二、方法三、方法四效率比较接近 方法三略占优,方法一效率最差
结论:,方法五>=方法三>方法二>方法四>方法一
数量级 千万
结果:运行多次,其中方法五效率依然高于其它四种方法,除了方法一,其它四种方法 计算数据量高了10倍,但耗时普遍增加了10---30倍,
结论:,方法五>方法一>>方法四=方法三>方法二
其它说明:如果是实时交互业务,当前响应时间已经影响用户体验
最后总结:方法五对于千万级别计算 远高于其它四种方式
String.join(",", longList)