一、引言
在Java应用程序中,Array与List是最基本也是最常用的数据类型之一。Array是Java语言中的一种数据结构,是一种有序、可重复、不可变、可以混合类型的数据结构;List是Java集合框架中的一种数据结构,是一个有序、可重复、可变、只能存储一种数据类型的数据结构。 在我们的Java应用程序中,我们可能经常需要转换Array为List,或者反过来,这就需要我们使用Java提供的转换工具类。本文将详细介绍Java提供的Array转List工具类,并从多个方面探讨其用法、优点和注意事项,以期能够给Java程序员带来帮助和启示。
二、ArrayToList转换工具的详细介绍
1、ArrayToList转换:
在Java中提供了一个Arrays.asList方法,可以把Array转换为List:
public static <T> List<T> asList(T... a){ return new ArrayList<>(a); }
从上面的代码可以看出,这个方法只是把Array封装成ArrayList,因此它的长度是不可变的。
2、ListToArray转换:
同样,在Java中提供了一个List.ToArray方法,可以把List转换为Array:
public <T> T[] toArray(T[] a){ if (a.length < size()){ return (T[])Arrays.copyOf(elementData, size(), a.getClass()); } System.arraycopy(elementData, 0, a, 0, size()); if (a.length > size()){ a[size()] = null; } return a; }
从上面的代码可以看出,这个方法实际上是调用了Arrays.copyOf的静态方法进行了数组的拷贝,从而把List转变为了Array。
3、ArrayToList转换与ArrayList的区别:
在转换中使用Arrays.asList方法封装的List是由数组实现的,而ArrayList则是由链表实现的,因此转换后的结果也有一些明显的区别:
- Arrays.asList方法封装的List的长度是不可变的;而ArrayList的长度是可变的。
- Arrays.asList方法封装的List是由数组实现的;而ArrayList是由链表实现的。
- Arrays.asList方法封装的List支持indexOf()、contains()、containsAll()等操作,但是不支持add()、addAll()、remove()和set()等操作;而ArrayList支持所有这些操作。
- Arrays.asList方法封装的List不能直接调用clear()方法来清空其元素;而ArrayList则可以。
三、小标题:
1、从Array转换成List
从Array转换成List使用很简单,只需调用Arrays.asList()方法即可:
Integer[] intArr = {1, 2, 3}; List<Integer> intList = Arrays.asList(intArr);
需要注意的是,在转换后的List中,如果调用List.set()方法,虽然不会抛出UnsupportedOperationException异常,但是实际上Array的元素并没有被改变,因为转换后的List底层存储的仍然是原来的Array。
2、从Array转换成ArrayList
从Array转换成ArrayList同样也是使用Arrays.asList()方法,但是需要将它作为构造函数参数传入:
Integer[] intArr = {1, 2, 3}; ArrayList<Integer> intList = new ArrayList<>(Arrays.asList(intArr));
需要注意的是,在转换后的ArrayList中,如果调用List.set()方法,Array的元素也会被改变,因为底层存储的是ArrayList,而不是原来的Array。
3、List toArray与List转换成Array
List.toArray()可以转换List为Array,但需要注意以下几点:
- 如果传入的数组的长度大于等于List的长度,则调用List.toArray()将返回一个与该List相同类型的数组,并将List中的所有元素复制到数组中。
- 如果传入的数组的长度小于List的长度,则调用List.toArray()将返回一个与该List相同类型的数组,与参数中传入的数组的长度相同,数组中保存了该List对象中前N个元素的引用,其中N由参数数组的长度确定,其余位置上的元素都为null。
List<String> strList = new ArrayList<>(); strList.add("Hello"); strList.add("world"); String[] strArray = strList.toArray(new String[0]);
需要注意的是,可以通过List的toArray()方法将List转换成Array,但是此时返回的数组已经切断与原List的联系,对返回的数组的修改不会同步到原List上。
4、注意事项
在使用ArrayToList转换工具类时,需要注意以下几点:
- ArrayToList转换结果中的List是由数组实现的,因此长度是不可变的;而ArrayList是由链表实现的,支持动态增删元素,但是相对而言效率上稍低。
- 在对ArrayToList转换结果中的List进行操作时,需要注意是否支持该操作,因为Arrays.asList()生成的List只是Arrays内部类,不支持add()等操作,需要自行转换成ArrayList之后才可以执行这些操作。
- 如果List存储的是可变对象,使用Arrays.asList()将不可行,因为这会导致修改原数组的元素。
- 必要时可以使用Arrays.copyOf()或者System.arraycopy()等方式生成新的数组。
- 在使用Arrays.asList()时,需要注意传递的是数组,而不是列表。
四、总结
在Java应用程序中,Array与List是最基本也是最常用的数据类型之一。在实际开发中我们可能经常需要转换Array为List,或者反过来。Java提供了一些很方便的转换工具类来帮助我们完成这些转换工作。我们只需要遵守一些注意事项并正确使用这些转换工具类,就可以很方便地完成Array和List之间的转换,提高我们的代码效率并优化程序性能。