谈Java集合类的toArray()的小bug
toArray()方法
它的作用是将集合转换成数组。但是这个方法有一个弊端,当toArray()方法使用不当时会产生ClassCastException(类转换异常)
public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);//下面这行代码就会产生类转换异常。Integer[] brr = (Integer[])list.toArray();for (Integer integer : brr) {System.out.println(integer);}}
如果使用toArray()转换数组,并且还想按原有的数据类型使用的话,如下
List<Integer> list = new ArrayList<>();list.add(1);list.add(2);Object[] array = list.toArray();for (Object o : array) {System.out.println((int)o);System.out.println((Integer) o);}
或者使用重载方法toArray(T[] a)方法
toArray(T[] a)方法
功能:将集合根据传入参的数据类型转换成对应的数组
public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);/*数组空间等于0时,将会动态的创建和集合size相同空间大小的数组,性能是最好的。数组空间大于0但是小于size时,会重新创建大小等于集合size的数组,此时会增加GC的负担。数组空间等于集合的size时,在普通情况下是没问题的,但是在高并发情况下,数组创建完成后,集合的size变大,此时会增加GC的负担。。数组空间大于集合的size时,一方面会造成空间浪费,另一方面会在使用数组时产生空指针的异常。因为多出来的空间会存入null*/Integer[] array = list.toArray(new Integer[0]); //注意这里基本数据类型,只能使用他的包装类型for (Integer integer : array) {System.out.println(integer);}}