从阵列列表到阵列


111

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

1236
1233
4566
4568
....

我想将它们读入数组列表,然后将其转换为数组。建议这样做/合法吗?

谢谢


8
可以,但是您没有给我们足够的信息来告诉您这是否是个好主意。
乔恩·斯基特

6
ArrayLists很好。我看到转换为数组的唯一原因是是否需要调用需要它的方法。
迈克·琼斯,

Answers:


214

是的,将转换为是安全ArrayListArray。一个好主意取决于您的预期用途。您需要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为空怎么办?
ThanosFisherman

48
然后它是空的。
IMustBeSomeone,2016年

1
The method toArray(T[]) in the type ArrayList<Character> is not applicable for the arguments (char[])
亚伦·弗兰克

75

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

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

此代码也可以:

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

但是效果不佳:字符串数组创建了两次:第一次创建零长度数组,然后创建,填充和返回实际大小的数组。因此,如果您知道所需的大小(从list.size()),则应创建足够大的数组以放置所有元素。在这种情况下,它不会重新分配。


4
new String[0]和之间的区别的很好的解释new String[size]
gamliela 17/09/14

4
new String[0]实际上更有效。shipilev.net/blog/2016/arrays-wisdom-ancients
Radiodef '18

5
ArrayList<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

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


谢谢,只是好奇地知道:我不需要声明数组大小吗?
Eddy Freeman

JavaDocs是您的朋友。如果传入的数组太小,则会返回一个新数组。该方法的另一个版本不使用args,返回数组Object
Brian Roach


1

有两种样式可以将集合转换为数组:使用预定义大小的数组(如c.toArray(new String[c.size()]))或使用空数组(如c.toArray(new String[0]))。在较早的Java版本中,建议使用预先设置大小的数组,因为创建适当大小的数组所需的反射调用非常慢。但是,由于OpenJDK 6的更新较晚,因此此调用变得很有趣,与空大小版本相比,空数组版本的性能相同,有时甚至更好。此外,传递大小预定义的数组对于并发或同步集合很危险,因为在size和toArray调用之间可能会发生数据争用,如果在操作过程中同时缩小了集合,则可能导致数组末尾出现额外的null。您可以遵循统一样式:使用空数组(在现代Java中建议使用)或使用预定大小的数组(在较早的Java版本或基于非HotSpot的JVM中可能更快)


1

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

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

在较早的Java版本中,建议使用预先设置大小的数组,因为创建适当大小的数组所需的反射调用非常慢。但是,由于OpenJDK 6的更新较晚,因此该调用变得很有趣,与空大小版本相比,空数组版本的性能相同,有时甚至更好。此外,传递大小预定义的数组对于并发或同步集合很危险,因为在size和toArray调用之间可能会发生数据争用,如果在操作过程中同时缩小了集合,则可能导致数组末尾出现额外的null。此检查允许遵循统一的样式:使用空数组(在现代Java中建议使用)或使用预定大小的数组(在较早的Java版本或基于非HotSpot的JVM中可能更快)。


0

Collection接口包括toArray()方法,用于将新集合转换为数组。此方法有两种形式。no参数版本将在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


0

一种方法是在第二个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]);
       }
   }    

}

0
ArrayList<String> a = new ArrayList<String>();
a.add( "test" );
@SuppressWarnings( "unused")
Object[] array = a.toArray();

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.