从Arraylist到Array

时间:2011-11-01 15:47:51

标签: java arraylist

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

1236
1233
4566
4568
....

我想将它们读入数组列表然后将其转换为数组。这样做是明智/合法的吗?

感谢

12 个答案:

答案 0 :(得分:206)

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

答案 1 :(得分:74)

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

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

此代码也有效:

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

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

答案 2 :(得分:6)

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

这是否是一个“好主意”真的取决于你的用例。

答案 3 :(得分:4)

假设v是一个ArrayList:

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

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

随机访问ArrayList

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

一种方法是添加Second 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]);
       }
   }    

}

答案 9 :(得分:0)

String content = new String(Files.readAllBytes(Paths.get("C://temp//temp.txt")),
    StandardCharsets.UTF_8);

List<String> wordsList = Arrays.asList(content.split(System.getProperty("line.separator")));
Stream<String> wordsStream = Stream.of(content.split(System.getProperty("line.separator"))); 

// The resulting arrays
String[] wordsArray0 = wordsList.stream().toArray(String[]::new);
String[] wordsArray1 = wordsStream.toArray(String[]::new);

答案 10 :(得分:0)

大多数答案都可以接受。但是从 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]);

答案 11 :(得分:0)

我通常使用这种方法。

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]
}