From Arraylist to Array

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

1236
1233
4566
4568
....

我想把它们读入数组列表,然后转换成 Array。这样做是明智的[合法的]吗?

thanks

240183 次浏览

是的 将 ABC0转换为 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<String> myArrayList = new ArrayList<String>();
...
String[] myArray = myArrayList.toArray(new String[0]);

它是否是一个“好主意”将真正取决于您的用例。

assuming v is a ArrayList:

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

这取决于您希望实现什么,如果您需要在以后操作数组,这将比将字符串保存在 ArrayList 中花费更多的精力。您还可以通过 list.get( index );对数组列表进行随机访问

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

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

此代码也适用于:

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

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

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

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


}

将集合转换为数组有两种样式: 使用预设大小的数组(如 c.toArray(new String[c.size()]))或使用空数组(如 c.toArray(new String[0]))。 在较早的 Java 版本中,建议使用预调整大小的数组,因为创建适当大小的数组所必需的反射调用非常缓慢。然而,由于后期更新的 OpenJDK 6这个调用是内在化的,使得空数组版本的性能相同,有时甚至更好,相比预调整大小的版本。对于并发或同步收集,传递预先调整大小的数组也是危险的,因为 size 和 toArray 调用之间可能存在数据竞争,如果收集在操作期间并发收缩,那么在数组末尾可能导致额外的 null。 You can follow the uniform style: 要么使用空数组(这是现代 Java 中推荐的) ,要么使用预调整大小的数组(在较老的 Java 版本或非基于 HotSpot 的 JVM 中可能更快).

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

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

在较早的 Java 版本中,建议使用预调整大小的数组,如 反射调用,这是创建一个适当大小的数组所必需的 但是由于 OpenJDK6的后期更新,这个调用非常缓慢 使空数组版本的性能变为 same and sometimes even better, compared to the pre-sized version. 此外,传递预设大小的数组对于并发或 同步收集作为一个数据竞赛之间的大小是可能的 和 toArray 调用,这可能导致在 如果集合在操作期间并发收缩,则为。 此检查允许遵循统一的样式: 使用 空数组(在现代 Java 中推荐使用)或使用预先调整大小的 Array (在旧的 Java 版本或非 HotSpot 中可能更快 基于 JVM)。

大多数答案都是可以接受的。但是自从 Java11以来,还有另一种使用 方法引用运算符方法引用运算符或双冒号操作(: :)的 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]);

我通常用这种方法。

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