Array、List、Set 互转实例
Array、List 互转
Array 转 List
1 | String[] s = new String[]{"A", "B", "C", "D", "E"}; |
注意这里 list 里面的元素直接是 s 里面的元素(list backed by the specified array),换句话就是说:对 s 的修改,直接影响 list。
1 | s[0] = "AA"; |
输出结果
1 | list: [AA, B, C, D, E] |
List 转 Array
1 | String[] dest = list.toArray(new String[0]); // new String[0]是指定返回数组的类型 |
输出结果
1 | dest: [AA, B, C, D, E] |
注意这里的 dest 里面的元素不是 list 里面的元素,换句话就是说:对 list 中关于元素的修改,不会影响 dest。
1 | list.set(0, "Z"); |
输出结果
1 | modified list: [Z, B, C, D, E] |
可以看到 list 虽然被修改了,但是 dest 数组没有没修改。
List、Set 互转
因为 List 和 Set 都实现了 Collection 接口,且 addAll(Collection<? extends E> c) 方法,因此可以采用 addAll() 方法将 List 和 Set 互相转换;另外,List 和 Set 也提供了 Collection<? extends E> c
作为参数的构造函数,因此通常采用构造函数的形式完成互相转化。
1 | // List 转 Set |
和 toArray() 一样,被转换的 List / Set 的修改不会对被转化后的 Set / List 造成影响。
Array、Set 互转
由上面可完成 Array 和 Set 的互转。
1 | // array 转 set |
Array、Array 互转
使用 org.apache.commons.beanutils.ConvertUtils.java
提供的 convert
方法。
1 | String str = "1,2,3,4,5,6,7,8"; |
Arrays.asList() 和 Collection.toArray()
上述列出的互相转换离不开 Arrays.asList() 和 Collection.toArray() 两个重要的方法;
This method acts as bridge between array-based and collection-based APIs, in combination with Collection.toArray. The returned list is serializable and implements RandomAccess.
Arrays.asList()
1 | @SafeVarargs |
这里出现的 ArrayList<> 并不是我们通常使用的 java.util.ArrayList,因为 java.util.ArrayList 没有数组作为参数的构造函数。查看对应的源码发现,其实 Arrays 类的静态内部类。
1 | /** |
可以看到,这个由 Arrays 类实现的另一个 Arrays$ArrayList,对于 java.util.ArrayList 类来讲,是比较简单粗糙的类。
没有扩容机制;
无法在指定位置 add(int index, E element),调用该方法会抛异常;这些不同让这个 ArrayList 看起来实际上就是一个 List-View 的数组。
Collection.toArray()
虽然 List、Set 的具体实现类都对 Collection.toArray() 方法进行了不同程度的重写,但是大致都差不多。
这里选 AbstractCollection.toArray() 的实现:
1 | public <T> T[] toArray(T[] a) { |
如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理