【问题标题】:From Arraylist to Array从数组列表到数组
【发布时间】:2011-12-19 14:53:45
【问题描述】:

我想知道从 ArrayList 转换为 Array 是否安全/可取? 我有一个文本文件,每行一个字符串:

1236
1233
4566
4568
....

我想将它们读入数组列表,然后将其转换为数组。这样做是否可取/合法?

谢谢

【问题讨论】:

  • 可以,但你没有给我们足够的信息来告诉你这是否是个好主意。
  • ArrayLists 很好。我可以看到转换为数组的唯一原因是您是否需要调用需要它的方法。

标签: java arraylist


【解决方案1】:

是的it is safe to convert an ArrayList to an Array。这是否是一个好主意取决于您的预期用途。你需要ArrayList提供的操作吗?如果是这样,请将其保留为ArrayList。否则转走!

ArrayList<Integer> foo = new ArrayList<Integer>();
foo.add(1);
foo.add(1);
foo.add(2);
foo.add(3);
foo.add(5);
Integer[] bar = foo.toArray(new Integer[foo.size()]);
System.out.println("bar.length = " + bar.length);

输出

bar.length = 5

【讨论】:

  • ArrayList 为空怎么办?
  • The method toArray(T[]) in the type ArrayList&lt;Character&gt; is not applicable for the arguments (char[])
【解决方案2】:

这是最好的方法(恕我直言)。

List<String> myArrayList = new ArrayList<String>();
//.....
String[] myArray = myArrayList.toArray(new String[myArrayList.size()]);

此代码也适用:

String[] myArray = myArrayList.toArray(new String[0]);

但效果较差:字符串数组创建了两次:第一次创建零长度数组,然后创建、填充并返回实际大小的数组。所以,如果你知道所需的大小(来自list.size()),你应该创建一个足够大的数组来放置所有元素。在这种情况下,它不会被重新分配。

【讨论】:

【解决方案3】:
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

这是否是一个“好主意”实际上取决于您的用例。

【讨论】:

  • 谢谢,只是想知道:我不需要声明数组大小?
  • JavaDocs 是你的朋友。如果传入的数组太小,则返回一个新数组。该方法的另一个版本不使用 args,返回一个数组 Object
【解决方案4】:

假设 v 是一个 ArrayList:

String[] x = (String[]) v.toArray(new String[0]);

【讨论】:

    【解决方案5】:

    将集合转换为数组有两种方式:使用预先确定大小的数组(如c.toArray(new String[c.size()]))或使用空数组(如c.toArray(new String[0]))。 在较旧的 Java 版本中,建议使用预先确定大小的数组,因为创建适当大小的数组所必需的反射调用非常慢。然而,由于 OpenJDK 6 的更新较晚,这个调用被内化了,使得空数组版本的性能与预先调整大小的版本相同,有时甚至更好。此外,传递预先确定大小的数组对于并发或同步集合也是危险的,因为在 size 和 toArray 调用之间可能存在数据竞争,如果在操作期间集合同时收缩,这可能会导致数组末尾出现额外的空值。 您可以遵循统一的样式:使用空数组(在现代 Java 中推荐)或使用预先确定大小的数组(在较旧的 Java 版本或非基于 HotSpot 的 JVM 中可能更快) .

    【讨论】:

      【解决方案6】:

      这是较新 Java (>Java 6) 的推荐用法

      String[] myArray = myArrayList.toArray(new String[0]);
      

      在较早的 Java 版本中,建议使用预先确定大小的数组,因为 反射调用,这是创建适当大小的数组所必需的 很慢。然而,由于 OpenJDK 6 的更新较晚,这个调用是 内在化,使空数组版本的性能 与预尺寸版本相比,相同,有时甚至更好。 此外,传递预定大小的数组对于并发或 作为数据竞争的同步收集是可能的 和 toArray 调用,这可能会导致在末尾出现额外的空值 数组,如果集合在操作期间同时收缩。 这种检查允许遵循统一的风格:要么使用 空数组(在现代 Java 中推荐使用)或使用预先确定大小的 数组(在较旧的 Java 版本或非 HotSpot 中可能更快 基于 JVM)。

      【讨论】:

        【解决方案7】:

        大多数答案都被接受。但是从 Java 11 开始,还有另一种使用 toArray() 方法的方法,使用 方法引用运算符 或双冒号操作 (::)。

        这是一个例子:

        ArrayList<String> list = new ArrayList<>();
        
        // ... add strings to list
        
        // Since java 11    
        String[] strArray = list.toArray(String[]::new);
        
        
        // before java 11, as specified in the official documentation.
        strArray = list.toArray(new String[0]);
        

        【讨论】:

        • 谢谢,Harshit,直到你提到它,我才注意到这一点。
        【解决方案8】:

        Collection 接口包含将新集合转换为数组的 toArray() 方法。这种方法有两种形式。无参数版本将在 Object 数组中返回集合的元素:public Object[ ] toArray()。返回的数组不能转换为任何其他数据类型。这是最简单的版本。第二个版本要求您传入要返回的数组的数据类型:public Object [ ] toArray(Object type[ ])。

         public static void main(String[] args) {  
                   List<String> l=new ArrayList<String>();  
                   l.add("A");  
                   l.add("B");  
                   l.add("C");  
                   Object arr[]=l.toArray();  
                   for(Object a:arr)  
                   {  
                        String str=(String)a;  
                        System.out.println(str);  
                   }  
              }  
        

        参考这个链接http://techno-terminal.blogspot.in/2015/11/how-to-obtain-array-from-arraylist.html

        【讨论】:

          【解决方案9】:

          一种方法是添加第二个 for 循环,在第一个 for 循环内完成打印。像这样:

          static String[] SENTENCE; 
          
          public static void main(String []args) throws Exception{
          
             Scanner sentence = new Scanner(new File("assets/blah.txt"));
             ArrayList<String> sentenceList = new ArrayList<String>();
          
             while (sentence.hasNextLine())
             {
                 sentenceList.add(sentence.nextLine());
             }
          
             sentence.close();
          
             String[] sentenceArray = sentenceList.toArray(new String[sentenceList.size()]);
            // System.out.println(sentenceArray.length);
             for (int r=0;r<sentenceArray.length;r++)
             {
                 SENTENCE = sentenceArray[r].split("(?<=[.!?])\\s*"); //split sentences and store in array 
          
                 for (int i=0;i<SENTENCE.length;i++)
                 {
                     System.out.println("Sentence " + (i+1) + ": " + SENTENCE[i]);
                 }
             }    
          
          }
          

          【讨论】:

            【解决方案10】:
            ArrayList<String> a = new ArrayList<String>();
            a.add( "test" );
            @SuppressWarnings( "unused")
            Object[] array = a.toArray();
            

            这取决于您想要实现的目标,如果您以后需要操作数组,这将比将字符串保留在 ArrayList 中花费更多的精力。您还可以通过 list.get( index ); 随机访问 ArrayList

            【讨论】:

              【解决方案11】:

              我通常使用这种方法。

              public static void main(String[] args) {
              
                  ArrayList<Integer> list = new ArrayList<>();
                  list.add(1);
                  list.add(2);
                  list.add(3);
              
                  int[] arr = list.stream().mapToInt(i -> i).toArray();
              
                  System.out.println(Arrays.toString(arr)); // [1, 2, 3]
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-10-19
                • 2014-07-04
                • 2013-03-15
                • 2023-01-13
                • 2013-03-01
                • 2015-06-13
                • 2023-01-14
                • 1970-01-01
                相关资源
                最近更新 更多