zoukankan      html  css  js  c++  java
  • 集合类的toArray方法坑

    集合类的toArray()方法相信大家都不陌生,它的作用是将集合转换成数组。但是这个方法有一个弊端,当toArray()方法使用不当时会产生ClassCastException(类转换异常)!

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        // 下面这行代码就会产生类转换异常。
        String[] strArray = (String[]) list.toArray();
        for (String item : strArray) {
          System.out.println(item);
        }
    }

    //报错
    原因为list.toArray()返回的是Object类型,强制转换的时候发生ClassCastException
    
    

    解决方案:toArray()方法的重载方法toArray(T[] a)。

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        // 传入一个String类型的数组。
        String[] strArray = list.toArray(new String[0]);
        for (String item : strArray) {
            System.out.println(item);
        }
    }

    注意事项:

    注意入参数组空间大小的设置:
    
    1、数组空间等于0时,将会动态的创建和集合size相同空间大小的数组,性能是最好的。
    2、数组空间大于0但是小于size时,会重新创建大小等于集合size的数组,此时会增加GC的负担。
    3、数组空间等于集合的size时,在普通情况下是没问题的,但是在高并发情况下,数组创建完成后,集合的size变大,此时影响跟第二条相同。
    4、数组空间大于集合的size时,一方面会造成空间浪费,另一方面会在使用数组时产生空指针的异常。因为多出来的空间会存入null。
  • 相关阅读:
    我的第二个裸板程序之链接地址与存储地址
    ARM你必须知道的事儿——为啥“PC = PC + 8”?
    typedef你真的理解么?
    centos使用--vsftpd配置
    centos使用--zsh
    laravel5.2总结--序列化
    laravel5.2总结--csrf保护
    laravel5.2总结--任务调度
    laravel5.2总结--本地化以及常量的使用
    laravel5.2总结--文件上传
  • 原文地址:https://www.cnblogs.com/gaomanito/p/13370448.html
Copyright © 2011-2022 走看看