首页 > 编程语言 >Java开发手册中为什么要求集合转数组toArray时禁止使用无参方法,而使用传参长度为0的空数组

Java开发手册中为什么要求集合转数组toArray时禁止使用无参方法,而使用传参长度为0的空数组

时间:2024-07-17 14:22:40浏览次数:13  
标签:无参 toArray Java String list add 数组 new size

场景

Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751

参考以上性能测试工具的使用。

阿里巴巴《java开发手册》泰山版关于集合转数组时规范声明:

【强制】使⽤集合转数组的⽅法,必须使⽤集合的 toArray(T[] array),传⼊的是类型完全⼀致、⻓度为0的空数组。

反例:直接使⽤ toArray ⽆参⽅法存在问题,此⽅法返回值只能是 Object[] 类,若强转其它类型数组将出现ClassCastException 错误

 

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

新建测试类,分别测试以上四种情况

//测试完成时间
@BenchmarkMode(Mode.AverageTime)
//设置统计结果的时间单位
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 2,time = 1,timeUnit = TimeUnit.SECONDS)
//测试次数和时间,参数同上
@Measurement(iterations = 5,time = 1,timeUnit = TimeUnit.SECONDS)
//fork一个线程,进行 fork 的次数,可用于类或者方法上。如果 fork 数是 2 的话,则 JMH 会 fork 出两个进程来进行测试。
@Fork(1)
//通过 State 可以指定一个对象的作用范围,JMH 根据 scope 来进行实例化和共享操作。@State 可以被继承使用,
//Scope.Thread:默认的 State,每个测试线程分配一个实例
@State(Scope.Thread)
public class ListToArrayTest {
    public static void main(String[] args) throws RunnerException {
        //启动基准测试
        Options options = new OptionsBuilder()
                .include(ListToArrayTest.class.getSimpleName())//要导入的测试类
                .build();
        new Runner(options).run();//执行测试
    }

    //list设置为0
    @Benchmark
    public void listZeroTest(){
        List<String> list = new ArrayList<>(3);
        list.add("badao");
        list.add("de");
        list.add("chengxvyuan");
        String[] array = list.toArray(new String[0]);
    }

    //等于size
    @Benchmark
    public void listEqualTest(){
        List<String> list = new ArrayList<>(3);
        list.add("badao");
        list.add("de");
        list.add("chengxvyuan");
        String[] array = list.toArray(new String[list.size()]);
    }

    //大于size
    @Benchmark
    public void listGranterTest(){
        List<String> list = new ArrayList<>(3);
        list.add("badao");
        list.add("de");
        list.add("chengxvyuan");
        String[] array = list.toArray(new String[1000]);
    }

    //小于size
    @Benchmark
    public void listLessTest(){
        List<String> list = new ArrayList<>(3);
        list.add("badao");
        list.add("de");
        list.add("chengxvyuan");
        String[] array = list.toArray(new String[2]);
    }
}

测试结果

//Benchmark                        Mode  Cnt    Score   Error  Units
//ListToArrayTest.listEqualTest    avgt    5   10.533 ± 1.294  ns/op
//ListToArrayTest.listGranterTest  avgt    5  308.779 ± 7.831  ns/op
//ListToArrayTest.listLessTest     avgt    5   10.437 ± 0.572  ns/op
//ListToArrayTest.listZeroTest     avgt    5   10.277 ± 0.481  ns/op

从上面的结果中可以看出,阿里手册推荐的设置为0的方法性能最好,大于size的方法性能最差。

具体原因已经给出:

1) 等于 0,动态创建与 size 相同的数组,性能最好。
2) ⼤于 0 但小于 size,重新创建⼤小等于 size 的数组,增加 GC 负担。
3) 等于 size,在⾼并发情况下,数组创建完成之后,size 正在变⼤的情况下,负⾯影响与 2 相同。
4) ⼤于 size,空间浪费,且在 size 处插⼊ null 值,存在 NPE 隐患。

标签:无参,toArray,Java,String,list,add,数组,new,size
From: https://www.cnblogs.com/badaoliumangqizhi/p/18307219

相关文章

  • Java中的RESTful API设计与实现
    Java中的RESTfulAPI设计与实现大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言在现代Web开发中,RESTfulAPI已经成为数据传输的标准方式。REST(RepresentationalStateTransfer)是一种基于资源的架构风格,广泛应用于互联网服务中。本文将详细介绍......
  • Java中的分布式文件系统设计与实现
    Java中的分布式文件系统设计与实现大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言分布式文件系统是支持大规模数据存储和访问的关键基础设施之一。本文将探讨在Java语言环境中设计和实现分布式文件系统的关键技术和策略。二、分布式文件系统的......
  • Java中的响应式编程与Reactor框架使用详解
    Java中的响应式编程与Reactor框架使用详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言响应式编程是一种面向数据流和变化传播的编程范式,它适用于处理异步数据流和事件驱动的场景。Reactor框架是在Java中实现响应式编程的强大工具,本文将深入......
  • java八股复习指南-多线程篇
    多线程线程的实现在Java中,实现多线程的主要有以下四种继承Thread类,重写run()方法;实现Runnable接口,实现run()方法,并将Runnable实现类的实例作为Thread构造函数的参数target;实现Callable接口,实现call()方法,然后通过FutureTask包装器来创建Thread线程;......
  • 使用Java和JHipster快速构建现代化的Web应用
    使用Java和JHipster快速构建现代化的Web应用大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!引言在当今快节奏的软件开发环境中,快速构建现代化的Web应用是开发团队面临的重要挑战之一。本文将介绍如何利用Java和JHipster工具来快速搭建一个现代化的Web应......
  • 华为OD机试D卷 --找座位--24年OD统一考试(Java & JS & Python & C & C++)
    文章目录题目描述输入描述输出描述用例题目解析java源码python源码javascript源码c源码c++源码题目描述在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。现在给出一排观众座位分布图,座位中存......
  • 华为OD机试D卷 --密码输入检测--24年OD统一考试(Java & JS & Python & C & C++)
    文章目录题目描述输入描述输出描述用例题目解析java源码python源码javascript源码c源码c++源码题目描述给定用户密码输入流input,输入流中字符‘<’表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密......
  • 如何在Java中实现事件驱动的微服务架构
    如何在Java中实现事件驱动的微服务架构大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言事件驱动架构(EDA)是一种基于事件进行通信和操作的架构模式,适用于高度分布式和松耦合的系统。微服务架构结合事件驱动可以提升系统的可扩展性和响应性。本文将......
  • Java中的单元测试与集成测试最佳实践
    Java中的单元测试与集成测试最佳实践大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言在软件开发过程中,测试是保证代码质量和系统稳定性的重要环节。Java作为一种广泛使用的编程语言,其测试工具和框架也非常成熟。本文将详细介绍Java中的单元测试......
  • java八股复习指南
    spring全家桶理解Spring框架核心:ioc和aop1.ioc:控制反转是指把对象的创建和配置的控制权从调用方转移给spring容器,我们可以将对象交给容器管理,即bean,这样不需要自己去new对象,只需要获取bean就可以使用。好比在家自己做菜,菜的味道全部由自己控制;去餐馆吃饭,菜的味道则是交由餐馆......