数组转集合

在Java中,数组和ArrayList是用于存储元素列表的最常见的两种数据结构。而且,经常需要在它们之间进行转换。面对这样高频的一个转换需求,我们有必要寻找到一种高效的方法。那么什么样的转换方式才是最高效的呢?本文将带领大家一步一步推导出最后的答案。首先,我们把这个场景实例化为一个具体问题:如何把如下所示的 数组 转换成 ArrayList ?

Element[] array = {new Element(1),new Element(2),new Element(3)};

常见方法

对于熟悉 Arrays 工具类的读者而言,可能会提出如下的这个解决方法:

ArrayList arrayList = new ArrayList(Arrays.asList(array));

针对此方法,我们首先查看一下 Java Doc 中对于 ArrayList 的构造方法是如何描述的:

ArrayList(Collection< ? extends E > c) : Constructs a list containing the elements of the specified collection, in the order they are returned by the colleciton’s iterator.

所以,ArrayList 的构造方法会执行如下的两个操作:
1. 把 collection 转换成一个 数组
2. 把 数组 中的所有元素拷贝到 ArrayList 的底层数组 elementData 中。

我们来直接看一眼 ArrayList 的构造函数的源码:

public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;

if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}

错误方法

另一个简单、直接的方法是:

List list = Arrays.asList(array);

这个方法似乎是最简单。但是,该方法却并不好,Arrays.asList 方法返回的 list 是一个固定大小的 List。实际上,此处返回的这个 list, 它的类型并不是我们常见的 java.util.ArrayList ,而是定义于 java.util.Arrays 内部的一个私有静态内部类。我们知道 ArrayList 本质上是利用一个数组(array)来实现的,而且此处从 asList() 方法返回的这个 list 是固定大小的List,list 的大小由原始的数组大小决定。在此种情况下,如果我们在 list 的基础上新增或者删减元素,程序就会抛出一个 UnsupportedOperationException 异常。

list.add(new Element(4));
Exception in thread "main" java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
at collection.ConvertArray.main(ConvertArray.java:22)

终极方法

针对上述两个方法的一些明显缺点,有人提出了一个改进方法:

Element[] array = {new Element(1), new Element(2)};
List list = new ArrayList(array.length);
Collections.addAll(list, array);

这个方法利用 Collections 工具类的 addAll 方法,消除了“常见方法”中 数组转Collection,Collection再转数组 的这两个冗余过程,同时,消除了“错误方法”中获得的最终list是一个固定大小List的错误。

结论

实际上,这不是一个很难的问题,但确实一个非常有意思的问题。可能,每一个Java程序员都了解ArrayList,但是解决此问题的过程中,很可能会犯一些小错误。至于这三个方法的性能对比试验,有兴趣的读者请自己尝试。

转:http://www.tiantianbianma.com/java-array-convert-arraylist.html/

时间: 2024-10-24 23:29:00

数组转集合的相关文章

C#语言中数组和集合

数组.集合→用于储存多个同类型的数据数组 定长→用于保存固定数量的数据 在功能上,数组能实现的所有功能,集合都能实现:反之,集合能实现的某些功能,数组难以实现 占用内存少 便利速度快集合 不定长→保存的数据数量,可以在程序的执行过程中,发生变化 占用内存多 便利速度慢课时六:数组和集合 数组.集合→用于储存多个同类型的数据 数组 定长→用于保存固定数量的数据 在功能上,数组能实现的所有功能,集合都能实现:反之,集合能实现的某些功能,数组难以实现 占用内存少 便利速度快 集合 不定长→保存的数据数

.NET 基础 一步步 一幕幕[数组、集合、异常捕获]

数组.集合.异常捕获 数组: 一次性存储多个相同类型的变量. 一维数组: 语法: 数组类型[] 数组名=new 数组类型[数组长度]; 声明数组的语法: A.数据类型 [] 数组名称= new 数据类型[2]{1,2}: B.数据类型 [] 数组名称 = new 数据类型[数组大小]; C. 数据类型 [] 数组名称 = {数据,数据,数据,数据}; ***数组的长度一旦固定了,就不能再被改变了 可以通过索引来访问数组中的元素: 数组名称[索引位置] 案例: 多维数组:多个线性数组的值 二维:i

非计算机专业的码农C#学习笔记 五、数组和集合

数组和集合 1.数组问题Array (1)一维数组:int[] arr={1,2,3,5,5} string[] s={s,l,s,g} (2)二维数组:int[,] arr=new int[2,2]{{1,2},{3,4}} 类型[,] 数组名=new 类型[行数(元素数),列数(元素的子元素数]{{元素1,元素2},{元素…},…,} l  动态数组:类型[,] 数组名=new 类型[M,N],int M=””;int N=””; l  查看内部元素:foreach(int n in arr

集合转数组,数组转集合,集合中只可以装引用数据类型

1 package com.pang.jihe_demo; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.List; 6 7 public class Demo01 { 8 public static void main(String[] args) { 9 //集合转数组,集合中只可以装引用数据类型 10 ArrayList<Integer> list = new ArrayList

java中有关数组或集合的起始位详解

在jdbc连接数据库时,起始位都是从1开始的 例如:Class.forName("com.mysql.jdbc.Driver"); conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "ms"); String sql="SELECT * FROM users WHERE NAME=?"; pstm=

数组与集合List的相互转化

数组转化为集合 #此运用的是Arrays中的asList方法,返回一个List集合 *当数组元素为基本数据类型是把整个数组当作一个元素放入List集合中,代码举例: int[] a = {1,2,3}; List<int[]> list = Arrays.asList(a);//asList是静态方法 *当数组元素为对象时,是把数组的每个元素分别放入List集合当中,代码举例: String[] s = {"ni", "hao"}; List<St

前端C#基础:数组与集合

学习web前端是一个带有一点小乐趣的过程.它是与理科思维比较相关联的,所以学习好他就必须掌握牢固的基础,对基础知识的细节要了解.下面我就总结两个我们经常用到,但又因为他们定义与用法都比较相近,而经常搞混的知识点:集合与数组. 数组与集合 相同点: 1.一个数组类型变量可以存放多个同类型的数据.2.数组项的编号称为索引或下标.3.数组的索引(下标)是一个int类型的数字,从0开始.   依次为每一个数组项编号. 4. 数组(集合)项:  变量名[ n ] 5.数组(集合)项的读取: 变量名[ 索引

java 基本数据类型数组与集合之间相互转换

Arrays工具类的asList()方法的使用* A:案例演示 * Arrays工具类的asList()方法的使用 * Collection中toArray(T[] a)泛型版的集合转数组 数组转集合 :  Arrays工具类的asList()方法的使用  public static void demo2() { //int[] arr = {11,22,33,44,55}; //List<int[]> list = Arrays.asList(arr); 基本数据类型的数组转换成集合,会将整

数组和集合的相互转换

1.集合转换为数组 package cn; import java.util.ArrayList; /**  * 集合转换为数组  */ public class ListToArrayDemo { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("hello"); list.add("world&qu

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响),如以下代码将无法通过编译. foreach (int x in myArray) { x++; //错误代码,因为改变了元素的值 Console.WriteLine(x); } 如果要让自定义的数据类型支持foreach循环,则该类型必须实现IEnumerable<T>接口,且存在对应此列表的IEnumerator<T>实现. 实际上,在.Net的底层(IL语言层面)而言, foreach (var