好问题
Good  Question
  • 首 页
  • 问题
    • PHP
    • JAVA
    • CPlusPlus
    • C#
    • SQL
  • 关 于
  • 联 系
把Java的ArrayList转化成字符串的最好方法是什么? 关闭 返回上一级  

把Java的ArrayList转化成字符串的最好方法是什么?
+ 查看更多

发布日期:2018-03-23 17:02
分类:JAVA
浏览次数:77

我想把

ArrayList
作为一个完成的字符串输出。本来我想要使用标号分别把每个元素用
toString
方法输出。有其他更快的方法来实现它吗?你可以循环遍历它(或者移除一个每个元素)然后把他们连结成字符串,但是我认为这个方法很慢。

回答

基本上,使用循环来迭代取得
ArrayList
是唯一的选择。
不要使用这个代码,继续阅读到本答案的底部你可以看到为什么它令人不满意,它应该被替换:
ArrayList list = new ArrayList();
list.add("one");
list.add("two");
list.add("three");

String listString = "";

for (String s : list)
{
    listString += s + "t";
}

System.out.println(listString);
事实上,一个字符串连接是挺好的,因为
javac
编译器会优化字符串连接,总是把它作为一系列在
StringBuilder
上的
append
操作。这是从以上程序中的
for
循环中分解的一部分字节码:
   61:  new #13; //class java/lang/StringBuilder
   64:  dup
   65:  invokespecial   #14; //Method java/lang/StringBuilder."":()V
   68:  aload_2
   69:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  aload   4
   74:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   77:  ldc #16; //String t
   79:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   82:  invokevirtual   #17; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
正如所见,编译器会使用
StringBuilder
来优化此循环,所以性能应该不是一个大问题。 (好的,再认真看一下,
StringBuilder
在循环的每次重复中都会被实例化,因此这可能不是最有效率的字节码。实例化并且使用一个明确的
StringBuilder
可能会获得一个更好的性能。)
实际上,我认为任何一种输出(向磁盘或向显示器)都会比你担心的字符串连接的性能慢上一个数量级。
编辑:在评论中指出,编译器优化实际上会在每一个循环重复上创建一个新的
StringBuilder
的实例(这一点我之前提到过)。
Paul Tomblin提出了一个最好的优化方法的使用,就是在
loop
循环外面只初始化一个
StringBuilder
的对象。
ArrayList list = new ArrayList();
list.add("one");
list.add("two");
list.add("three");

StringBuilder sb = new StringBuilder();
for (String s : list)
{
    sb.append(s);
    sb.append("t");
}

System.out.println(sb.toString());
这会只在循环外部只实例化
StringBuilder
一次,在循环体内部只调用两次
append
方法,在(显示
StringBuilder
的实例化和循环的)字节码中验证了这点:
  // Instantiation of the StringBuilder outside loop:
   33:  new #8; //class java/lang/StringBuilder
   36:  dup
   37:  invokespecial   #9; //Method java/lang/StringBuilder."":()V
   40:  astore_2

   // [snip a few lines for initializing the loop]
   // Loading the StringBuilder inside the loop, then append:
   66:  aload_2
   67:  aload   4
   69:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  pop
   73:  aload_2
   74:  ldc #15; //String t
   76:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   79:  pop
因此,手写的优化方法实际上性能会更好,因为for循环的内部更加简短以及不需要在每次循环迭代中都实例化StringBuilder。 重写以上代码如下:
上一篇在JAVA中,如何读取流(InputStream)然后转换为String?
如何将每一个字符串的首字母大写下一篇
下一篇如何将每一个字符串的首字母大写

最新文章

  • 函数`__construct`用来干嘛的
    发布日期:2018-03-26
  • 通过访客的IP得到他们的地区
    发布日期:2018-03-26
  • 合并两个PHP对象的最好的方法是什么?
    发布日期:2018-03-26
  • 该如何把一该如何把一个对象转化成数组?
    发布日期:2018-03-26
  • 什么是输出缓冲区?
    发布日期:2018-03-26
  • 在PHP中怎么把用逗号分隔的字符串分隔在一个数组里?
    发布日期:2018-03-26
  • 在PHP中使用foreach循环时查找数组的最后一个元素
    发布日期:2018-03-26
关于好问
收集整理一些有用的问题和回答,造福中国的程序旺和IT喵们!
友情链接
起飞页 
相关信息
版权声明
Copyright © 2016 - 2022  苏州卡达网络科技有限公司 备案号:苏ICP备09008221号