java中的数组与集合相互转换
1.数组转换成集合
数组转换为集合,用Arrays.asList方法。
public static void main(String[] args) { String[] arr = {"a","b","c","d","e"}; List<String> list = Arrays.asList(arr); System.out.println(list); // List的toString方法 } // 输出结果: [a, b, c, d, e]
如果给转换过来的集合添加一个元素呢?
public static void main(String[] args) { String[] arr = {"a","b","c","d","e"}; List<String> list = Arrays.asList(arr); list.add("f"); System.out.println(list); } // 输出结果: Exception in thread "main" java.lang.UnsupportedOperationException
报错了~
其实,由数组转换过来的集合,并不能添加或删除元素,但是可以用集合的其他方法,因为集合比数组的方法丰富很多。
再试一个基本数据类型的数组:
public static void main(String[] args) { int[] arr = {1,2,3,4,5}; List list = Arrays.asList(arr); System.out.println(list); } //输出结果: [[I@74a14482]
奇怪了,怎么不是[1,2,3,4,5]?而是内存地址?
原因是因为,基本数据类型的数组转换为集合时,会将整个数组当作一个对象来转换的!
如果加上泛型就很容易知道错误了。
List<int> list = Arrays.asList(arr); // 编译的时候就报错了。
List<int[]> list = Arrays.asList(arr); // 这样就没有报错,可以知道集合里面的是数组对象,数组没有重写toString方法,自然的,打印数组对象就出现了内存地址了。
如果非要把基本数据类型的数组转换为集合,而且打印符合我们的预期呢?
public static void main(String[] args) { Integer[] arr = {1,2,3,4,5}; List<Integer> list = Arrays.asList(arr); System.out.println(list); }
2.集合转换成数组
集合转换成数组用Collection接口的toArray方法。
<T> T[] toArray(T[] a) 返回包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型
public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); /*当集合转换数组时,数组长度如果小于等于集合的size时,转换后的数组长度等于集合的size。 如果数组的长度大于size,分配的数组长度就和指定长度一样,多余的是null */ String[] arr = list.toArray(new String[0]); for (String s:arr) { System.out.println(s); } }
代码成就万世基积沙镇海,梦想永在凌云意意气风发。