<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=Java%EF%BC%9A%E6%95%B0%E7%BB%84%E8%BD%ACList</id>
	<title>Java：数组转List - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.eijux.com/index.php?action=history&amp;feed=atom&amp;title=Java%EF%BC%9A%E6%95%B0%E7%BB%84%E8%BD%ACList"/>
	<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Java%EF%BC%9A%E6%95%B0%E7%BB%84%E8%BD%ACList&amp;action=history"/>
	<updated>2026-04-29T07:11:26Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>http://wiki.eijux.com/index.php?title=Java%EF%BC%9A%E6%95%B0%E7%BB%84%E8%BD%ACList&amp;diff=2734&amp;oldid=prev</id>
		<title>Eijux：​建立内容为“category:Java  == 关于 == Java数组转List的三种方式及对比。   首先 ArrayList 与 List 类有成员方法可以转换，其次应该想到辅助…”的新页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.eijux.com/index.php?title=Java%EF%BC%9A%E6%95%B0%E7%BB%84%E8%BD%ACList&amp;diff=2734&amp;oldid=prev"/>
		<updated>2021-04-26T14:27:54Z</updated>

		<summary type="html">&lt;p&gt;建立内容为“&lt;a href=&quot;/%E5%88%86%E7%B1%BB:Java&quot; title=&quot;分类:Java&quot;&gt;category:Java&lt;/a&gt;  == 关于 == Java数组转List的三种方式及对比。   首先 ArrayList 与 List 类有成员方法可以转换，其次应该想到辅助…”的新页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:Java]]&lt;br /&gt;
&lt;br /&gt;
== 关于 ==&lt;br /&gt;
Java数组转List的三种方式及对比。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
首先 ArrayList 与 List 类有成员方法可以转换，其次应该想到辅助类“'''Collections'''”也会有相应方式实现。&lt;br /&gt;
&lt;br /&gt;
=== Arrays.asList(strArray) ===&lt;br /&gt;
最常用的方式：通过“List list = Arrays.asList(strArray);”方式,将数组转换List后，'''不能对List增删，只能查改，否则抛异常'''。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
private void testArrayCastToListError() {&lt;br /&gt;
    String[] strArray = new String[2];&lt;br /&gt;
    List list = Arrays.asList(strArray);&lt;br /&gt;
    &lt;br /&gt;
    //对转换后的list插入一条数据&lt;br /&gt;
    list.add(&amp;quot;1&amp;quot;);&lt;br /&gt;
    System.out.println(list);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
执行结果：&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
Exception in thread &amp;quot;main&amp;quot; java.lang.UnsupportedOperationException&lt;br /&gt;
 at java.util.AbstractList.add(AbstractList.java:148)&lt;br /&gt;
 at java.util.AbstractList.add(AbstractList.java:108)&lt;br /&gt;
 at com.darwin.junit.Calculator.testArrayCastToList(Calculator.java:19)&lt;br /&gt;
 at com.darwin.junit.Calculator.main(Calculator.java:44)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
在“list.add(&amp;quot;1&amp;quot;);”处，抛出异常：UnsupportedOperationException。&lt;br /&gt;
&lt;br /&gt;
解析：&amp;lt;br/&amp;gt;&lt;br /&gt;
Arrays.asList(strArray) 返回值是 java.util.Arrays 类中一个私有静态内部类 java.util.'''Arrays.ArrayList'''，它并非 '''java.util.ArrayList''' 类。java.util.Arrays.ArrayList类具有 set()，get()，contains()等方法，但是不具有添加add()或删除remove()方法,所以调用add()方法会报错。【？？？】&lt;br /&gt;
&lt;br /&gt;
使用场景：&amp;lt;br/&amp;gt;&lt;br /&gt;
Arrays.asList(strArray)方式仅能用在将数组转换为List后，不需要增删其中的值，仅作为数据源读取使用。&lt;br /&gt;
&lt;br /&gt;
=== ArrayList&amp;lt;String&amp;gt;(Arrays.asList(strArray)) ===&lt;br /&gt;
通过 ArrayList 的构造器，将 Arrays.asList(strArray) 的返回值由 java.util.Arrays.ArrayList '''转为 java.util.ArrayList'''。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
private void testArrayCastToListRight() {&lt;br /&gt;
    String[] strArray = new String[2];&lt;br /&gt;
    ArrayList&amp;lt;String&amp;gt; list = new ArrayList&amp;lt;String&amp;gt;(Arrays.asList(strArray)) ;&lt;br /&gt;
&lt;br /&gt;
    list.add(&amp;quot;1&amp;quot;);&lt;br /&gt;
    System.out.println(list);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
执行结果：成功追加一个元素“1”。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
[null, null, 1]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
使用场景：需要在将数组转换为List后，对List进行增删改查操作，在List的数据量不大的情况下，可以使用。&lt;br /&gt;
&lt;br /&gt;
=== '''Collections.addAll()''' ===&lt;br /&gt;
通过 Collections.addAll(arrayList, strArray) 方式转换，根据数组的长度创建一个长度相同的List，然后通过 Collections.addAll() 方法，将数组中的元素转为二进制，然后添加到 List 中，这是'''最高效'''的方法。&lt;br /&gt;
# 创建与 Array 大小一致的 ArrayList；&lt;br /&gt;
# 通过 Collections.addAll() 方法将 Array 添加到 ArrayList；&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;3,4&amp;quot;&amp;gt;&lt;br /&gt;
private void testArrayCastToListEfficient(){&lt;br /&gt;
    String[] strArray = new String[2];&lt;br /&gt;
    ArrayList&amp;lt;String&amp;gt; arrayList = new ArrayList&amp;lt;String&amp;gt;(strArray.length);&lt;br /&gt;
    Collections.addAll(arrayList, strArray);&lt;br /&gt;
    &lt;br /&gt;
    arrayList.add(&amp;quot;1&amp;quot;);&lt;br /&gt;
    System.out.println(arrayList);&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
执行结果：同样成功追加一个元素“1”。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
[null, null, 1]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Collections.addAll() 方法源码：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public static &amp;lt;T&amp;gt; boolean addAll(Collection&amp;lt;? super T&amp;gt; c, T... elements) {&lt;br /&gt;
        boolean result = false;&lt;br /&gt;
        for (T element : elements)&lt;br /&gt;
            result |= c.add(element);//result和c.add(element)按位或运算,然后赋值给result&lt;br /&gt;
        return result;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Q&amp;amp;A ==&lt;br /&gt;
# 数组类型如果是整型数组，转为 List 时，会报错？&lt;br /&gt;
#: 在 JDK1.8 环境中测试，这三种转换方式是没有问题的。放心使用。对于 Integer[] 整型数组转 List 的方法和测试结果如下：&lt;br /&gt;
## 不支持增删：&lt;br /&gt;
##: &lt;br /&gt;
##: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
Integer[] intArray1 = new Integer[2];&lt;br /&gt;
List&amp;lt;Integer&amp;gt; list1 = Arrays.asList(intArray1);&lt;br /&gt;
System.out.println(list1);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
##: &lt;br /&gt;
## 支持增删：&lt;br /&gt;
##: &lt;br /&gt;
##: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;2&amp;quot;&amp;gt;&lt;br /&gt;
Integer[] intArray2 = new Integer[2];&lt;br /&gt;
List&amp;lt;Integer&amp;gt; list2 = new ArrayList&amp;lt;Integer&amp;gt;(Arrays.asList(intArray2)) ;&lt;br /&gt;
list2.add(2);&lt;br /&gt;
System.out.println(list2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
##: &lt;br /&gt;
## 支持增删，且数据量大最高效：&lt;br /&gt;
##: &lt;br /&gt;
##: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;2,3&amp;quot;&amp;gt;&lt;br /&gt;
Integer[] intArray3 = new Integer[2];&lt;br /&gt;
List&amp;lt;Integer&amp;gt; list3 = new ArrayList&amp;lt;Integer&amp;gt;(intArray3.length);&lt;br /&gt;
Collections.addAll(list3, intArray3);&lt;br /&gt;
list3.add(3);&lt;br /&gt;
System.out.println(list3);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: 可能出现的错误的转换：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
int[] intArray1 = new int[2];&lt;br /&gt;
List&amp;lt;Integer&amp;gt; list1 = Arrays.asList(intArray1);//此处报错！！！&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: 报错原因：等号两边类型不一致，编译不通过。【不能用 int 的数组转 List，只能用包装类 Integer】&lt;br /&gt;
# 为什么只能用 Integer 而不能用 int ？&lt;br /&gt;
#: List 源码如下：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
public interface List&amp;lt;E&amp;gt; extends Collection&amp;lt;E&amp;gt; {&lt;br /&gt;
   . . .&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: Arrays.asList() 源码如下：&lt;br /&gt;
#: &amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;  highlight=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
    public static &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; asList(T... a) {&lt;br /&gt;
        return new ArrayList&amp;lt;&amp;gt;(a);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
#: 如上：&lt;br /&gt;
#: List声明时，需要传递一个泛型“&amp;lt;E&amp;gt;”作为形参，asList()方法参数类型也是泛型中的通配类型“&amp;lt;T&amp;gt;”；&lt;br /&gt;
#: 而 Java 中所有的泛型必须是'''引用类型'''。&lt;br /&gt;
#: 而包装类 Integer 属于引用类型，而 int 是'''基础类型'''，所以……&lt;br /&gt;
#* 其他 8 种基本数据类型：byte、short、int、long、float、double、char，也都不是引用类型，所以 8 种基本数据类型都不能作为 List 的形参。&lt;br /&gt;
#*: 所以不存在“list&amp;lt;byte&amp;gt;”、“list&amp;lt;short&amp;gt;” 等基本类型的集合。&lt;br /&gt;
#* 但，String、数组、class、interface 是引用类型，都可以作为 List 的形参，&lt;br /&gt;
#*: 所以存在：“List&amp;lt;Runnable&amp;gt;”（接口类型的集合）、“List&amp;lt;int[]&amp;gt;”（数组类型的集合）、“List&amp;lt;String&amp;gt;”（类的集合）。&lt;/div&gt;</summary>
		<author><name>Eijux</name></author>
	</entry>
</feed>