首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JMH - List#addAll比ArrayList#new快吗?

JMH(Java Microbenchmark Harness)是一个用于编写Java微基准测试的工具。它可以帮助开发者准确地测量代码的性能。关于List#addAllArrayList#new的性能比较,我们需要考虑多个因素。

基础概念

  1. List#addAll: 这是Java集合框架中的一个方法,用于将一个集合中的所有元素添加到另一个集合中。
  2. ArrayList#new: 这是创建一个新的ArrayList实例的操作。

性能比较

List#addAllArrayList#new的性能取决于具体的使用场景和数据量。

优势

  • List#addAll:
    • 当你需要将一个集合的元素添加到另一个集合时,addAll方法非常方便。
    • 如果目标集合已经存在并且有足够的空间容纳新元素,addAll可能会比创建一个新的ArrayList并逐个添加元素更快。
  • ArrayList#new:
    • 当你需要一个全新的集合,并且不确定初始容量时,创建一个新的ArrayList可能更合适。
    • 如果源集合非常大,预先分配足够的空间可以避免多次扩容操作,从而提高性能。

类型

  • List#addAll:
    • 这是一个方法,属于Java集合框架的一部分。
  • ArrayList#new:
    • 这是一个构造函数调用,用于创建一个新的ArrayList实例。

应用场景

  • List#addAll:
    • 当你需要合并两个集合时。
    • 当你希望将一个集合的内容复制到另一个已存在的集合中时。
  • ArrayList#new:
    • 当你需要一个新的集合来存储数据时。
    • 当你希望避免修改现有集合时。

性能测试

为了准确比较两者的性能,可以使用JMH编写微基准测试。以下是一个简单的示例:

代码语言:txt
复制
import org.openjdk.jmh.annotations.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(1)
@State(Scope.Benchmark)
public class ListAddAllBenchmark {

    private List<Integer> sourceList;
    private List<Integer> targetList;

    @Setup
    public void setup() {
        sourceList = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            sourceList.add(i);
        }
        targetList = new ArrayList<>();
    }

    @Benchmark
    public void testAddAll() {
        targetList.addAll(sourceList);
    }

    @Benchmark
    public void testNewArrayList() {
        List<Integer> newList = new ArrayList<>(sourceList);
    }

    public static void main(String[] args) throws Exception {
        org.openjdk.jmh.Main.main(args);
    }
}

可能遇到的问题

  1. 性能差异:
    • List#addAll可能会比ArrayList#new更快,因为它避免了多次元素添加操作。
    • 但是,如果目标集合需要扩容,addAll的性能可能会受到影响。
  • 内存使用:
    • ArrayList#new在创建新实例时可能会占用更多的内存,因为它需要分配新的内存空间。

解决方法

  • 优化初始容量:
    • 在创建ArrayList时,可以通过指定初始容量来避免多次扩容操作。
    • 在创建ArrayList时,可以通过指定初始容量来避免多次扩容操作。
  • 预分配空间:
    • 如果知道数据量,可以预先分配足够的空间以提高性能。
    • 如果知道数据量,可以预先分配足够的空间以提高性能。

参考链接

通过以上分析和示例代码,你可以更好地理解List#addAllArrayList#new的性能差异及其应用场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

听说count(8) count(*) 好多,是真的

央视有个黄西博士主持的节目,叫做《是真的?》,会以实验的方式验证一些奇奇怪怪的问题。 那我们今天就来验证一个神奇的事情:count(8) 会比count(*) 很多倍,是真的?...COUNT(8) ---------- 10000000 Elapsed: 00:00:00.75 哇,非常神奇,5.33秒 VS 0.75秒,整整7倍的性能差距,难道就是因为一个少敲了一个shift键(...内存的读取速度要比磁盘是路人皆知的事实,第一次的PK实际上就是磁盘读与内存读的区别(这里不多解释),根据执行计划,count(*) 与 count(8) (通常都习惯写成count(1))在性能上根本就没有任何区别...如果实验顺序是先执行sql1,再执行sql2,反而就会得出sql2的性能sql1好的结论来。

38010
  • 越南经济发展中国?数据告诉你

    最近1年,新闻经常刷屏越南经济发展,最近还有李嘉诚重仓越南什么的,让我十分好奇。...把越南GDP增长率与体量相近的泰国和菲律宾对比: 越南明显另外两国且平稳很多。 把越南GDP总量放到东盟十国里边对比是这样的: 越南位于中间位置。...2022年一季度,苹果AirPods的越南产量占苹果总产量的30% 富士康在越南的工厂 越南能这么承接欧美产业还在于其 关税优势,2020年生效的《欧盟-越南自贸协定》(EVFTA)将在十年内削减双方...5家企业市值超过100亿美元,分别是: 股市看的是预期,股市飞涨也能看出国家经济面预期向好,在知乎找到一个数据,全球最大的资产管理公司贝莱德在其跟踪新兴国家的股票持仓中,越南以26%的比例高居榜首,第二名尼日利亚的三倍还多...2020年私营单位平均工资 6678元/月,和今年5月的二手房均价 55226元/平米) 胡志明市,远处的高楼和近处交织的电线 查了下越南超市的物价,将其跟中国超市的对比: 除了鸡肉和牛奶,其他品类都只中国低一点点

    97210

    动图图解 | UDP就一定TCP

    话说,UDPTCP? 相信就算不是八股文老手,也会下意识的脱口而出:"是"。 这要追问为什么,估计大家也能说出个大概。 但这也让人好奇,用UDP就一定用TCP?...丢包的原因有很多,之前写过的《用了TCP协议,就一定不会丢包?》有详细聊到过,这里就不再展开。 那UDP和TCP的态度就不太一样了。 UDP表示,"哦,是?然后呢?...用UDP就一定用TCP? 这时候UDP就不服了:"正因为没有这些复杂的TCP可靠性机制,所以我很快啊" 嗯,这也是大部分人认为UDPTCP的原因。 实际上大部分情况下也确实是这样的。...而UDP则没有实现,因此一般来说TCPUDP慢。 TCP是面向连接的协议,而UDP是无连接的协议。这里的"连接"其实是,操作系统内核在两端代码里维护的一套复杂状态机。...大家可以在评论区里,叫我一靓仔? 我这么善良质朴的愿望,能被满足

    82930

    JMH - Java 代码性能测试的终极利器、必须掌握

    long end = System.currentTimeMillis(); System.out.println(end - start); 上面可能就是你最常见的性能测试了,这样的测试结果真的准确?...JMH 介绍 那么如何对 Java 程序进行一次精准的性能测试呢?难道需要掌握很多 JVM 优化细节?难道要研究如何避免,并进行正确编码才能进行严格的性能测试?...JMH 使用 JMH 的使用首先引入 maven 所需依赖,当前最新版 为 1.23 版本。 <!...stringAdd 方法平均耗时 267.393ms,而 stringBuilderAppend 方法平均耗时只有 8.847ms,可见 StringBuilder 的 append 方法进行字符串拼接速度的多...掌握了 JMH 基准测试之后,可以尝试测试一些常用的工具或者框架的性能如何,看看哪个工具的性能最好,比如 FastJSON 真的 GSON 在进行 JSON 转换时更 Fast

    5.5K20

    性能调优必备利器之 JMH

    if 还是 switch ?HashMap 的初始化 size 要不要指定,指定之后性能可以提高多少?各种序列化方法哪个耗时更短? 无论出自何种原因需要进行性能评估,量化指标总是必要的。...在大部分场合,简单地回答谁谁慢是远远不够的,如何将程序性能量化呢? 这就需要我们的主角 JMH 登场了!...该工具是由 Oracle 内部实现 JIT 的大牛们编写的,他们应该任何人都了解 JIT 以及 JVM 对于基准测试的影响。...JMH 比较典型的应用场景如下: 想准确地知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性 对比接口不同实现在给定条件下的吞吐量 查看多少百分的请求在多长时间内完成 下面我们以字符串拼接的两种方法为例子使用...在介绍完常用的注解后,让我们来看下 JMH 有哪些陷阱。 JMH 陷阱 在使用 JMH 的过程中,一定要避免一些陷阱。

    53220

    性能调优必备利器之 JMH

    if 还是 switch ?HashMap 的初始化 size 要不要指定,指定之后性能可以提高多少?各种序列化方法哪个耗时更短? 无论出自何种原因需要进行性能评估,量化指标总是必要的。...在大部分场合,简单地回答谁谁慢是远远不够的,如何将程序性能量化呢? 这就需要我们的主角 JMH 登场了!...该工具是由 Oracle 内部实现 JIT 的大牛们编写的,他们应该任何人都了解 JIT 以及 JVM 对于基准测试的影响。...JMH 比较典型的应用场景如下: 想准确地知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性 对比接口不同实现在给定条件下的吞吐量 查看多少百分的请求在多长时间内完成 下面我们以字符串拼接的两种方法为例子使用...在介绍完常用的注解后,让我们来看下 JMH 有哪些陷阱。 JMH 陷阱 在使用 JMH 的过程中,一定要避免一些陷阱。

    51410

    性能调优必备利器之 JMH

    if 还是 switch ?HashMap 的初始化 size 要不要指定,指定之后性能可以提高多少?各种序列化方法哪个耗时更短? 无论出自何种原因需要进行性能评估,量化指标总是必要的。...在大部分场合,简单地回答谁谁慢是远远不够的,如何将程序性能量化呢? 这就需要我们的主角 JMH 登场了!...该工具是由 Oracle 内部实现 JIT 的大牛们编写的,他们应该任何人都了解 JIT 以及 JVM 对于基准测试的影响。...JMH 比较典型的应用场景如下: 想准确地知道某个方法需要执行多长时间,以及执行时间和输入之间的相关性 对比接口不同实现在给定条件下的吞吐量 查看多少百分的请求在多长时间内完成 下面我们以字符串拼接的两种方法为例子使用...在介绍完常用的注解后,让我们来看下 JMH 有哪些陷阱。 JMH 陷阱 在使用 JMH 的过程中,一定要避免一些陷阱。

    1.1K20

    try catch 对性能影响

    当然一般而言,不会这么就下定论,所以接着你就会继续运行数次,然后可能还是会看见类似上面的结果。很有可能你就会确信forTrytryFor。但是这个测试的结果是不准确的,确切的说是无效的。...图1 图2 图3 从上面结果看来,绝大多数时候,tryForforTry。那是不是可以说tryForforTry快了呢?...比如图1中的forTry竟然图2的forTry快了近6倍。...偶尔forTry会比tryFor(我上面的截取的是比较有代表性的结果,实际运行的时候绝大多数情况显示的是tryFor) 那是什么导致了结果如此的扑朔迷离?...JMH官方主页:http://openjdk.java.net/projects/code-tools/jmh/ 正确的测试 测试环境: JVM版本: java version "1.8.0_91" Java

    1.5K20

    if还是switch?解密switch背后的秘密

    -- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core --> org.openjdk.jmh...从 Score 的值可以看出,当分支判断增加至 15 个,switch 的性能 if 的性能高出了约 3.7 倍,而之前有 5 个分支判断时的测试结果为,switch 的性能 if 的性能高出了约...也就是说 tableswitch 的存储结构类似于数组,是直接用索引获取元素的,所以整个查询的时间复杂度是 O(1),这也意味着它的搜索速度非常。...可以看出在分支判断为 9 个时,tableswitch 的性能 lookupwitch 的性能快了约 1.3 倍。但即使这样 lookupwitch 依然 if 查询性能要高很多。...总结 switch 的判断条件是 5 个时,性能 if 高出了约 2.3 倍,而当判断条件的数量越多时,他们的性能相差就越大。

    2K40
    领券