查看“Java:数组转List”的源代码
←
Java:数组转List
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Java]] == 关于 == Java数组转List的三种方式及对比。 首先 ArrayList 与 List 类有成员方法可以转换,其次应该想到辅助类“'''Collections'''”也会有相应方式实现。 === Arrays.asList(strArray) === 最常用的方式:通过“List list = Arrays.asList(strArray);”方式,将数组转换List后,'''不能对List增删,只能查改,否则抛异常'''。 <syntaxhighlight lang="java" highlight="3"> private void testArrayCastToListError() { String[] strArray = new String[2]; List list = Arrays.asList(strArray); //对转换后的list插入一条数据 list.add("1"); System.out.println(list); } </syntaxhighlight> 执行结果:<br/> <syntaxhighlight lang="java"> Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at com.darwin.junit.Calculator.testArrayCastToList(Calculator.java:19) at com.darwin.junit.Calculator.main(Calculator.java:44) </syntaxhighlight> 在“list.add("1");”处,抛出异常:UnsupportedOperationException。 解析:<br/> Arrays.asList(strArray) 返回值是 java.util.Arrays 类中一个私有静态内部类 java.util.'''Arrays.ArrayList''',它并非 '''java.util.ArrayList''' 类。java.util.Arrays.ArrayList类具有 set(),get(),contains()等方法,但是不具有添加add()或删除remove()方法,所以调用add()方法会报错。【???】 使用场景:<br/> Arrays.asList(strArray)方式仅能用在将数组转换为List后,不需要增删其中的值,仅作为数据源读取使用。 === ArrayList<String>(Arrays.asList(strArray)) === 通过 ArrayList 的构造器,将 Arrays.asList(strArray) 的返回值由 java.util.Arrays.ArrayList '''转为 java.util.ArrayList'''。 <syntaxhighlight lang="java" highlight="3"> private void testArrayCastToListRight() { String[] strArray = new String[2]; ArrayList<String> list = new ArrayList<String>(Arrays.asList(strArray)) ; list.add("1"); System.out.println(list); } </syntaxhighlight> 执行结果:成功追加一个元素“1”。 <syntaxhighlight lang="java" highlight=""> [null, null, 1] </syntaxhighlight> 使用场景:需要在将数组转换为List后,对List进行增删改查操作,在List的数据量不大的情况下,可以使用。 === '''Collections.addAll()''' === 通过 Collections.addAll(arrayList, strArray) 方式转换,根据数组的长度创建一个长度相同的List,然后通过 Collections.addAll() 方法,将数组中的元素转为二进制,然后添加到 List 中,这是'''最高效'''的方法。 # 创建与 Array 大小一致的 ArrayList; # 通过 Collections.addAll() 方法将 Array 添加到 ArrayList; <syntaxhighlight lang="java" highlight="3,4"> private void testArrayCastToListEfficient(){ String[] strArray = new String[2]; ArrayList<String> arrayList = new ArrayList<String>(strArray.length); Collections.addAll(arrayList, strArray); arrayList.add("1"); System.out.println(arrayList); } </syntaxhighlight> 执行结果:同样成功追加一个元素“1”。 <syntaxhighlight lang="java" highlight=""> [null, null, 1] </syntaxhighlight> Collections.addAll() 方法源码: <syntaxhighlight lang="java" highlight=""> public static <T> boolean addAll(Collection<? super T> c, T... elements) { boolean result = false; for (T element : elements) result |= c.add(element);//result和c.add(element)按位或运算,然后赋值给result return result; } </syntaxhighlight> == Q&A == # 数组类型如果是整型数组,转为 List 时,会报错? #: 在 JDK1.8 环境中测试,这三种转换方式是没有问题的。放心使用。对于 Integer[] 整型数组转 List 的方法和测试结果如下: ## 不支持增删: ##: ##: <syntaxhighlight lang="java" highlight="2"> Integer[] intArray1 = new Integer[2]; List<Integer> list1 = Arrays.asList(intArray1); System.out.println(list1); </syntaxhighlight> ##: ## 支持增删: ##: ##: <syntaxhighlight lang="java" highlight="2"> Integer[] intArray2 = new Integer[2]; List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(intArray2)) ; list2.add(2); System.out.println(list2); </syntaxhighlight> ##: ## 支持增删,且数据量大最高效: ##: ##: <syntaxhighlight lang="java" highlight="2,3"> Integer[] intArray3 = new Integer[2]; List<Integer> list3 = new ArrayList<Integer>(intArray3.length); Collections.addAll(list3, intArray3); list3.add(3); System.out.println(list3); </syntaxhighlight> #: 可能出现的错误的转换: #: <syntaxhighlight lang="java" highlight=""> int[] intArray1 = new int[2]; List<Integer> list1 = Arrays.asList(intArray1);//此处报错!!! </syntaxhighlight> #: 报错原因:等号两边类型不一致,编译不通过。【不能用 int 的数组转 List,只能用包装类 Integer】 # 为什么只能用 Integer 而不能用 int ? #: List 源码如下: #: <syntaxhighlight lang="java" highlight=""> public interface List<E> extends Collection<E> { . . . } </syntaxhighlight> #: Arrays.asList() 源码如下: #: <syntaxhighlight lang="java" highlight=""> public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } </syntaxhighlight> #: 如上: #: List声明时,需要传递一个泛型“<E>”作为形参,asList()方法参数类型也是泛型中的通配类型“<T>”; #: 而 Java 中所有的泛型必须是'''引用类型'''。 #: 而包装类 Integer 属于引用类型,而 int 是'''基础类型''',所以…… #* 其他 8 种基本数据类型:byte、short、int、long、float、double、char,也都不是引用类型,所以 8 种基本数据类型都不能作为 List 的形参。 #*: 所以不存在“list<byte>”、“list<short>” 等基本类型的集合。 #* 但,String、数组、class、interface 是引用类型,都可以作为 List 的形参, #*: 所以存在:“List<Runnable>”(接口类型的集合)、“List<int[]>”(数组类型的集合)、“List<String>”(类的集合)。
返回至“
Java:数组转List
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息