zoukankan      html  css  js  c++  java
  • 集合转数组:toArray()最优化方法探索

    优化背景

    • 有些场景下(比如入参要求)需要将集合(比如List)转为数组类型,利用集合的toArray方法应该最为方便的,对于toArray()无参方法其返回的是Object[],强制转其他类型数组会ClassCastException。推荐使用带参数的toArray(T[]),不过使用上需要注意

    • list强转数组抛异常-ClassCastException

     @Test
        //list强转数组抛异常-ClassCastException
        public void arrayError(){
            List<String> listToArray = new ArrayList<>();
            listToArray.add("jav");
            listToArray.add(0, "python");
            listToArray.add("php");
            listToArray.add("c#");
            String[] str = (String[]) listToArray.toArray();
             System.out.println(Arrays.toString(str));
        }
    
    

    异常信息打印:

    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
    
    
    • 对于toArray()无参方法其返回的是Object[],正确写法
    @Test
        //list转数组,使用object对象接受再循环遍历转出
        public void arrayObject(){
            List<String> listToArray = new ArrayList<>();
            listToArray.add("jav");
            listToArray.add(0, "python");
            listToArray.add("php");
            listToArray.add("c#");
            String[] s = new String[listToArray.size()];
            Object[] o = listToArray.toArray();
            for (int i = 0; i < o.length; i++) {
                s[i] = o[i].toString();
            }
            System.out.println(Arrays.toString(s));
        }
    

    输出:[python, java, php, c#]

    toArray(new String[0]), 创建一个大小为0的数组,当为输入数组长度小于集合size时,toArray方法会自动创建一个等大数组放入数据并返回。
    toArray(new String[100000]),同上输入的10w数组比集合size小,toArray方法会重新创建一个等大数组放入数据并返回,原来的10w数组等于白建了
    toArray(new String[1000000]),输入数组长度与集合size相等,当是一个理想状态时,即数组size没有发生变化(比如没有并发情况),那么toArray方法会直接使用输入数组并返回,但如果在输入数组创建之后,原集合size发生了变化,最糟糕的情况会退化为#2
    toArray(new String[2000000]),输入数组长度大于集合size,那么toArray方法会直接使用输入数组并返回,当然多出去的那部分数组量就算浪费了

    • 最优化写法
      推荐1:
    @Test
        //list转数组-最优化写法
        public void OptimizeCode(){
            List<String> listToArray = new ArrayList<>();
            listToArray.add("jav");
            listToArray.add(0, "python");
            listToArray.add("php");
            listToArray.add("c#");
            String[] str = listToArray.toArray(new String[0]);
            System.out.println(Arrays.toString(str));
        }
    

    输出:[python, java, php, c#]

    推荐2:

     /**
         * stream流写法,推荐
         */
        @Test
        public void test(){
            List<String> listToArray = new ArrayList<>();
            listToArray.add("java");
            listToArray.add(0, "python");
            listToArray.add("php");
            listToArray.add("c#");
            String[] str = listToArray.stream().toArray(String[]::new);
            System.out.println(Arrays.toString(str));
        }
    
    • 由此可以看出,如果在没有特殊需要的情况下,推荐1和推荐2也是大多数情况下比较推荐的写法

    更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取:

    记录工作中使用的CI/CD流程
  • 相关阅读:
    使用 yo 命令行向导给 SAP UI5 应用添加一个新的视图
    SAP Fiori Elements 应用的 manifest.json 文件运行时如何被解析的
    SAP UI5 标准应用的多语言支持
    微软 Excel 365 里如何设置下拉菜单和自动高亮成指定颜色
    SAP Fiori Elements 应用里的 Title 显示的内容是从哪里来的
    本地开发好的 SAP Fiori Elements 应用,如何部署到 ABAP 服务器上?
    如何在 Cypress 测试代码中屏蔽(Suppress)来自应用代码报出的错误消息
    教你一招:让集群慢节点无处可藏
    应用架构步入“无服务器”时代 Serverless技术迎来新发展
    MySQL数据库事务隔离性的实现
  • 原文地址:https://www.cnblogs.com/CodingTest/p/15331906.html
Copyright © 2011-2022 走看看