Element[] array = {new Element(1), new Element(2), new Element(3)};
我想将此数组转换为
ArrayList
类的对象。ArrayList<Element> arraylist = ???;
#1 楼
new ArrayList<>(Arrays.asList(array));
评论
是的在(最常见的)情况下,您只需要一个列表,新的ArrayList调用也是必需的。
–卡卢姆
08年10月1日在14:41
@Luron-只需使用List
–游泳池
2011年6月29日15:18
@Calum和@Pool-如下面Alex Miller的回答所述,使用Arrays.asList(array)而不将其传递到新的ArrayList对象中将固定列表的大小。使用ArrayList的更常见原因之一是能够动态更改其大小,您的建议将阻止这种情况。
–赛马会
2011-09-26 19:04
Arrays.asList()是一个可怕的函数,永远不要照原样使用它的返回值。它破坏了列表模板,因此即使看起来确实多余,也请始终按此处指示的形式使用它。好答案。
–亚当
13年1月23日在3:28
@Adam请研究java.util.List的javadoc。添加协议允许他们抛出UnsupportedOperationException。 docs.oracle.com/javase/7/docs/api/java/util/…诚然,从面向对象的角度来看,要使用集合必须多次了解具体实现并不是一件好事-这为了使框架简单,这是一个务实的设计选择。
– lbalazscs
13年2月22日在9:41
#2 楼
给出:Element[] array = new Element[] { new Element(1), new Element(2), new Element(3) };
最简单的答案是:
List<Element> list = Arrays.asList(array);
这将很好地工作。但有一些警告:
从asList返回的列表具有固定大小。因此,如果您希望能够在代码的返回列表中添加或删除元素,则需要将其包装在新的
ArrayList
中。否则,您将得到一个UnsupportedOperationException
。从
asList()
返回的列表由原始数组支持。如果您修改原始数组,则列表也会被修改。这可能令人惊讶。 评论
两种操作的时间复杂度是多少?我的意思是使用和不使用显式arraylist构造。
–该死
2012年5月23日,2:17
Arrays.asList()仅通过包装现有数组来创建ArrayList,因此它为O(1)。
– Alex Miller
2012年5月23日13:15
包装在新的ArrayList()中将导致迭代固定大小列表的所有元素并将其添加到新的ArrayList中,因此O(n)也是如此。
– Alex Miller
2012年5月23日13:21
asList()返回的List的实现未实现List的几种方法(例如add(),remove(),clear()等),这些方法解释了UnsupportedOperationException。绝对是一个警告...
– sethro
2012年11月14日19:33
当问题要求“ ArrayList类的对象”时,我认为假定它引用的类是java.util.ArrayList是合理的。 Arrays.asList实际上返回一个java.util.Arrays.ArrayList,它不是另一个类的实例。因此,第三点警告是,如果您尝试在需要上述条件的环境中使用它,那么它将无法正常工作。
–戴夫L。
16年6月24日在19:16
#3 楼
(旧线程,但只有2美分,没有提到Guava或其他库以及其他一些细节)如果可以的话,请使用Guava
值得指出番石榴的方式,这大大简化了这些恶作剧:
用法
对于不可变列表
使用
ImmutableList
类及其of()
和copyOf()
工厂方法(元素可以通过t为空):List<String> il = ImmutableList.of("string", "elements"); // from varargs
List<String> il = ImmutableList.copyOf(aStringArray); // from array
对于可变列表
使用
Lists
类及其newArrayList()
工厂方法:List<String> l1 = Lists.newArrayList(anotherListOrCollection); // from collection
List<String> l2 = Lists.newArrayList(aStringArray); // from array
List<String> l3 = Lists.newArrayList("or", "string", "elements"); // from varargs
还请注意其他类中其他数据结构的类似方法,例如
Sets
中。为什么使用番石榴?
主要的吸引力可能是由于类型安全的泛型而减少了混乱,因为使用番石榴工厂方法可以在大多数时间推断类型。但是,自从Java 7随新的Diamond运算符一起出现以来,该论点的用处就减少了。
但这不是唯一的原因(并且Java 7尚无处不在):简写语法也非常方便,如上所述,方法初始化器允许编写更具表现力的代码。在一个Guava调用中,当前的Java集合需要2个调用。
如果您不能...
获取不可变列表
使用JDK的
Arrays
类及其asList()
工厂方法,并用Collections.unmodifiableList()
包装:List<String> l1 = Collections.unmodifiableList(Arrays.asList(anArrayOfElements));
List<String> l2 = Collections.unmodifiableList(Arrays.asList("element1", "element2"));
请注意,返回的
asList()
类型是使用具体的List
实现,但不是ArrayList
。这是一个内部类型,它模拟java.util.ArrayList
,但实际上直接引用传递的数组并使它“直写”(修改反映在数组中)。它禁止通过简单扩展
ArrayList
的方式通过List
API的某些方法进行修改(因此,不支持添加或删除元素),但是它允许调用AbstractList
来覆盖元素。因此,此列表并非真正不变,因此对set()
的调用应使用asList()
进行包装。如果需要可变列表,请参阅下一步。
获取可变列表
与上述相同,但包裹有实际的
Collections.unmodifiableList()
:List<String> l1 = new ArrayList<String>(Arrays.asList(array)); // Java 1.5 to 1.6
List<String> l1b = new ArrayList<>(Arrays.asList(array)); // Java 1.7+
List<String> l2 = new ArrayList<String>(Arrays.asList("a", "b")); // Java 1.5 to 1.6
List<String> l2b = new ArrayList<>(Arrays.asList("a", "b")); // Java 1.7+
用于教育目的:手动的好方法
// for Java 1.5+
static <T> List<T> arrayToList(final T[] array) {
final List<T> l = new ArrayList<T>(array.length);
for (final T s : array) {
l.add(s);
}
return (l);
}
// for Java < 1.5 (no generics, no compile-time type-safety, boo!)
static List arrayToList(final Object[] array) {
final List l = new ArrayList(array.length);
for (int i = 0; i < array.length; i++) {
l.add(array[i]);
}
return (l);
}
评论
+1但请注意,由Arrays.asList返回的List是可变的,因为您仍然可以设置元素-只是无法调整大小。对于没有番石榴的不可变列表,您可能会提到Collections.unmodifiableList。
– Paul Bellora
2013年1月10日在2:54
@haylem在您的“用于教育目的:好方法”部分中,Java 1.5+的arrayToList不正确。您正在实例化String列表,并尝试从给定的数组中检索字符串,而不是使用泛型参数类型T。除此之外,好的答案是+1,这是唯一包括手动方式的参数。
–afsantos
13年5月16日13:41
Id'将您的“如果无法... /对于不可变列表”部分重命名为“对于不可修改列表”,因为以后对包装的数组所做的更改可能会将其更改。它仍然是O(1),但是为了实现不可变性,您必须进行复制,例如通过Collections.unmodifiableList(new ArrayList <>(Arrays.asList(array)))进行复制。
– maaartinus
19年11月19日在9:35
#4 楼
由于这个问题已经很老了,令我惊讶的是,没有人提出最简单的形式:List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));
从Java 5开始,
Arrays.asList()
带有varargs参数,而您没有必须显式构造数组。评论
特别是,List
– 18446744073709551615
16年7月12日在15:29
#5 楼
new ArrayList<T>(Arrays.asList(myArray));
确保
myArray
与T
具有相同的类型。例如,如果尝试从List<Integer>
数组创建int
,则会出现编译器错误。#6 楼
另一种方法(虽然本质上等效于new ArrayList(Arrays.asList(array))
解决方案的性能:Collections.addAll(arraylist, array);
#7 楼
Java 9在Java 9中,可以使用
List.of
静态工厂方法来创建List
文字。如下所示:List<Element> elements = List.of(new Element(1), new Element(2), new Element(3));
这将返回包含三个元素的不可变列表。如果需要可变列表,请将该列表传递给
ArrayList
构造函数:new ArrayList<>(List.of(// elements vararg))
JEP 269:集合的便捷工厂方法
JEP 269为Java集合提供了一些便捷的工厂方法API。这些不变的静态工厂方法内置在Java 9及更高版本的
List
,Set
和Map
接口中。评论
List.of()将不会按照原始问题的要求返回java.util.ArrayList的实例。因此,仅第二个选项是有效答案。
– tquadrat
19年7月5日在12:31
#8 楼
您可能只需要一个列表,而不是一个ArrayList。在这种情况下,您可以执行以下操作:List<Element> arraylist = Arrays.asList(array);
评论
那将得到原始输入数组的支持,这就是为什么(可能)想要将其包装在新的ArrayList中的原因。
–比尔蜥蜴
08年10月1日在14:46
请谨慎使用此解决方案。如果您看,Array ISN不会返回真实的java.util.ArrayList。它返回一个实现所需方法的内部类,但是您不能更改列表中的成员。它只是数组的包装。
– Mikezx6r
08-10-1 14:47
您可以将List
–僧侣
09-10-9 22:48
@ Mikezx6r:一点校正:这是一个固定大小的列表。您可以更改列表的元素(设置方法),不能更改列表的大小(不能添加或删除元素)!
–user85421
09年12月4日在13:10
是的,请注意,这取决于您要对列表执行的操作。值得注意的是,如果OP仅想遍历元素,则根本不需要转换数组。
– PaulMurrayCbr
13年5月5日在9:23
#9 楼
另一项更新即将于2014年结束,您也可以使用Java 8:ArrayList<Element> arrayList = Stream.of(myArray).collect(Collectors.toCollection(ArrayList::new));
如果只是
List
,就会保存一些字符List<Element> list = Stream.of(myArray).collect(Collectors.toList());
评论
最好不要依赖于实现,但是Collectors.toList()实际上返回一个ArrayList。
–bcsb1001
2014年12月31日19:55
不正确使用Stream.of(...);这将创建一个元素流。改用Arrays.stream
–帕特里克·帕克(Patrick Parker)
16年11月18日在11:59
我不认为这两个选项是有效的,但Arrays.stream稍好一点,因为您可以使用带有“ start”,“ end” args的重载方法以固定大小创建它。另请参阅:stackoverflow.com/a/27888447/2619091
–yamilmedina
16年11月30日在21:45
#10 楼
如果您使用:new ArrayList<T>(Arrays.asList(myArray));
,您可以创建并填写两个列表!填充两次大列表确实是您不希望执行的操作,因为每次需要扩展容量时,它都会创建另一个
Object[]
数组。幸运的是,JDK实现速度很快,而
Arrays.asList(a[])
很好完成。它创建一种名为Arrays.ArrayList的ArrayList,其中Object []数据直接指向该数组。// in Arrays
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
//still in Arrays, creating a private unseen class
private static class ArrayList<E>
private final E[] a;
ArrayList(E[] array) {
a = array; // you point to the previous array
}
....
}
危险的一面是,如果更改初始数组,您更改列表!确定要吗?也许是,也许不是。
如果没有,最容易理解的方法是这样做:
ArrayList<Element> list = new ArrayList<Element>(myArray.length); // you know the initial capacity
for (Element element : myArray) {
list.add(element);
}
或者如@glglgl所说,您可以使用以下命令创建另一个独立的ArrayList:我喜欢使用
Collections
,Arrays
或Guava。但是,如果不合适,或者您感觉不到,只需改写另一条优雅的行即可。评论
我看不到答案结尾处的循环与新的ArrayList
– glglgl
2015年2月22日在17:03
Collections在数组的开头创建一个指针。我的循环创建了许多指针:每个数组成员一个。因此,如果原始数组发生变化,则我的观点仍然会朝着先前的价值观发展。
–尼古拉斯·佐佐(Nicolas Zozol)
15年2月22日在19:59
新的ArrayList
– glglgl
15年2月22日在21:56
#11 楼
在Java 9
中,您可以使用:List<String> list = List.of("Hello", "World", "from", "Java");
List<Integer> list = List.of(1, 2, 3, 4, 5);
评论
请注意,这不是明确要求的ArrayList。
–多里安·格雷(Dorian Gray)
18年8月3日在20:57
#12 楼
根据问题,使用Java 1.7的答案是:ArrayList<Element> arraylist = new ArrayList<Element>(Arrays.<Element>asList(array));
但是最好总是使用以下接口:
List<Element> arraylist = Arrays.<Element>asList(array);
#13 楼
// Guava
import com.google.common.collect.ListsLists
...
List<String> list = Lists.newArrayList(aStringArray);
#14 楼
您可以使用不同的方法进行转换List<Element> list = Arrays.asList(array);
List<Element> list = new ArrayList();
Collections.addAll(list, array);
Arraylist list = new Arraylist();
list.addAll(Arrays.asList(array));
有关更多详细信息,请参考http:// javarevisited。 blogspot.in/2011/06/converting-array-to-arraylist-in-java.html
#15 楼
从Java 8开始,有一种更简单的转换方式:import java.util.List;
import static java.util.stream.Collectors.toList;
public static <T> List<T> fromArray(T[] array) {
return Arrays.stream(array).collect(toList());
}
#16 楼
正如所有人所说的那样 new ArrayList<>(Arrays.asList("1","2","3","4"));
创建数组的最常见的最新方法是observableArrays
ObservableList:允许侦听器进行监听的列表跟踪更改的发生时间。
对于Java SE,您可以尝试
FXCollections.observableArrayList(new Element(1), new Element(2), new Element(3));
,这是根据Oracle Docs
>
observableArrayList()
创建一个新的空可观察列表,该列表由arraylist支持。
observableArrayList(E ... items)
创建一个新的可观察数组列表,其中添加了项
更新Java 9
在Java 9中也很简单:
List<String> list = List.of("element 1", "element 2", "element 3");
#17 楼
您也可以在Java 8中使用流来实现它。 List<Element> elements = Arrays.stream(array).collect(Collectors.toList());
评论
从Java 8开始,Collectors.toList()将返回ArrayList。但是,这在Java的未来版本中可能会有所不同。如果您想要特定类型的集合,请使用Collectors.toCollection()代替,您可以在其中指定要创建的确切集合类型。
–拉贾·安巴扎甘(Raja Anbazhagan)
19年2月4日在11:08
#18 楼
如果看到
Arrays.asList()
方法的定义,您将得到以下内容: public static <T> List<T> asList(T... a) //varargs are of T type.
因此,您可以这样初始化
arraylist
: List<Element> arraylist = Arrays.asList(new Element(1), new Element(2), new Element(3));
注意:每个
new Element(int args)
将被视为单个对象,并且可以作为var-args
传递。对于这个问题,可能还会有另一个答案。
如果看到
java.util.Collections.addAll()
方法的声明,您将得到以下内容:public static <T> boolean addAll(Collection<? super T> c, T... a);
所以,此代码也非常有用
Collections.addAll(arraylist, array);
#19 楼
另一种简单的方法是使用for-each循环将数组中的所有元素添加到新的ArrayList中。ArrayList<Element> list = new ArrayList<>();
for(Element e : array)
list.add(e);
#20 楼
如果数组是原始类型,则给出的答案将不起作用。但是从Java 8开始,您可以使用:int[] array = new int[5];
Arrays.stream(array).boxed().collect(Collectors.toList());
评论
此解决方案似乎也不适用于char数组。
– PixelMaster
18 Jun 10'在19:55
#21 楼
您可以在Java 8中执行以下操作ArrayList<Element> list = (ArrayList<Element>)Arrays.stream(array).collect(Collectors.toList());
评论
投票失败,因为该演员看来非常危险。没有任何内容指定返回的列表类型实际上是ArrayList,如javadoc所述:“不保证返回的列表的类型,可变性,可序列化性或线程安全性”
–多里安·格雷(Dorian Gray)
18年7月3日在17:45
如果要显式创建ArrayList,请尝试以下操作:ArrayList
–多里安·格雷(Dorian Gray)
18年8月3日在20:53
#22 楼
即使有很多关于该问题的书面答案,我也将添加我的意见。假设您有
Element[] array = { new Element(1), new Element(2), new Element(3) };
可以通过以下方式创建新的ArrayList
ArrayList<Element> arraylist_1 = new ArrayList<>(Arrays.asList(array));
ArrayList<Element> arraylist_2 = new ArrayList<>(
Arrays.asList(new Element[] { new Element(1), new Element(2), new Element(3) }));
// Add through a collection
ArrayList<Element> arraylist_3 = new ArrayList<>();
Collections.addAll(arraylist_3, array);
它们非常好支持ArrayList的所有操作
arraylist_1.add(new Element(4)); // or remove(): Success
arraylist_2.add(new Element(4)); // or remove(): Success
arraylist_3.add(new Element(4)); // or remove(): Success
,但是以下操作仅返回ArrayList的列表视图,而不返回实际的ArrayList。
// Returns a List view of array and not actual ArrayList
List<Element> listView_1 = (List<Element>) Arrays.asList(array);
List<Element> listView_2 = Arrays.asList(array);
List<Element> listView_3 = Arrays.asList(new Element(1), new Element(2), new Element(3));
因此,它们在尝试进行一些ArrayList操作时会出错。
listView_1.add(new Element(4)); // Error
listView_2.add(new Element(4)); // Error
listView_3.add(new Element(4)); // Error
有关数组链接的列表表示的更多信息。
#23 楼
最简单的方法是添加以下代码。经过测试和检验。String[] Array1={"one","two","three"};
ArrayList<String> s1= new ArrayList<String>(Arrays.asList(Array1));
#24 楼
另一个Java8解决方案(我可能错过了大部分答案)。如果是这样,我表示歉意。这将创建一个ArrayList(与List相对),即可以删除元素
package package org.something.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Junk {
static <T> ArrayList<T> arrToArrayList(T[] arr){
return Arrays.asList(arr)
.stream()
.collect(Collectors.toCollection(ArrayList::new));
}
public static void main(String[] args) {
String[] sArr = new String[]{"Hello", "cruel", "world"};
List<String> ret = arrToArrayList(sArr);
// Verify one can remove an item and print list to verify so
ret.remove(1);
ret.stream()
.forEach(System.out::println);
}
}
输出为...
你好
世界
#25 楼
我们可以轻松地将数组转换为ArrayList
。我们使用Collection接口的
addAll()
方法来将内容从一个列表复制到另一个列表。 Arraylist arr = new Arraylist();
arr.addAll(Arrays.asList(asset));
评论
这比接受9年的答案效率低。
– AjahnCharles
17年7月10日在10:06
ArrayLists构造函数之一接受一个?扩展Collection
–塔莫格纳·乔杜里(Tamoghna Chowdhury)
17-10-6在20:26
#26 楼
使用以下代码将元素数组转换为ArrayList。Element[] array = {new Element(1), new Element(2), new Element(3)};
ArrayList<Element>elementArray=new ArrayList();
for(int i=0;i<array.length;i++) {
elementArray.add(array[i]);
}
#27 楼
给定的对象数组:Element[] array = {new Element(1), new Element(2), new Element(3) , new Element(2)};
将数组转换为列表:
List<Element> list = Arrays.stream(array).collect(Collectors.toList());
将数组转换为ArrayList
ArrayList<Element> arrayList = Arrays.stream(array)
.collect(Collectors.toCollection(ArrayList::new));
将数组转换为LinkedList
LinkedList<Element> linkedList = Arrays.stream(array)
.collect(Collectors.toCollection(LinkedList::new));
打印列表:
list.forEach(element -> {
System.out.println(element.i);
});
输出
1
2
3
#28 楼
每个人都已经为您的问题提供了足够好的答案。现在,从所有建议中,您需要确定哪个将满足您的要求。您需要了解两种类型的集合。一个是未修改的集合,另一个是允许您稍后修改对象的集合。
因此,在这里,我将给出两个用例的简短示例。
创建不可变的集合::何时不想在创建后修改集合对象
List<Element> elementList = Arrays.asList(array)
创建可变的集合::何时您可能要在创建后修改创建的集合对象。
List<Element> elementList = new ArrayList<Element>(Arrays.asList(array));
评论
List
–Priyanka
17-9-9上午8:57
请注意,您的“不可变集合”并不是真正不变的-Arrays.asList返回的List只是原始数组的包装,并允许通过get和set访问和修改单个项。您可能应该澄清一下,您的意思是“不添加或删除元素”,而不是“不可变的”,这意味着根本不更改。
–塔莫格纳·乔杜里(Tamoghna Chowdhury)
17-10-6在20:24
#29 楼
Java 8的Arrays类提供了stream()方法,该方法的重载版本可以接受基本数组和对象数组。/**** Converting a Primitive 'int' Array to List ****/
int intArray[] = {1, 2, 3, 4, 5};
List<Integer> integerList1 = Arrays.stream(intArray).boxed().collect(Collectors.toList());
/**** 'IntStream.of' or 'Arrays.stream' Gives The Same Output ****/
List<Integer> integerList2 = IntStream.of(intArray).boxed().collect(Collectors.toList());
/**** Converting an 'Integer' Array to List ****/
Integer integerArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> integerList3 = Arrays.stream(integerArray).collect(Collectors.toList());
#30 楼
下面的代码似乎是实现此目的的好方法。new ArrayList<T>(Arrays.asList(myArray));
评论
在Java9中-> List@MarekM这个答案是错误的,因为它不会返回ArrayList。海报专门要求这样做。
我认为他没有使用List接口进行挖掘,因为这是最佳做法。但是,如果您要在这里-新的ArrayList <>(List.of(“ Hello”,“ World”,“ from”,“ Java”)));
关键不是使用接口,而是解决方案中返回的列表不可修改。那可能更多是一个问题,也是他要求ArrayList的原因