我想知道从ArrayList转换为Array是否安全/可取? 我有一个文本文件,每行都有一个字符串:
1236
1233
4566
4568
....
我想将它们读入数组列表然后将其转换为数组。这样做是明智/合法的吗?
感谢
答案 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 );
答案 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]
}