在已有数据的linkedList和arrayList集合中在中间位置新插入一条数据谁更快

以前一直以为是linked中间插入和头部插入都是比arrayList快的,今天开会的时候谈到这个面试题,这里就重新认识一下这两个集合。

结论:不想存在性能瓶颈,不是一定要linkedlist的场景就使用arraylist就可以了,除了头插,arraylist基本都是优于linkedlist的

1.中间插入数据
linkedlist:
中间插入数据linkedlist是需要遍历移动和new node节点的
arraylist:
arraylist可能需要扩容和一定要移动数据的,但是arraylist使用的system.ArrayCopy进行扩容和移动数据是非常高效的,直接内存地址拷贝,然后赋值
移动数据:理解一下System.arraycopy(elementData, index, elementData, index + 1, size - index);这行代码就会发现他只是将中间索引位置后面的数据直接copy到当前数组后一位的上
扩容:arraylist不一定需要扩容,每次扩容是原来的1.5倍,但是通过设置插入元素数,来保证他一定扩容进行测试,arraylist的速度还是更快。

    public void add(int index, E element) {rangeCheckForAdd(index);ensureCapacityInternal(size + 1);  // Increments modCount!!System.arraycopy(elementData, index, elementData, index + 1,size - index);elementData[index] = element;size++;}

测试程序

    public void test_ArrayList() {ArrayList<Integer> list = new ArrayList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 106710; i++) {list.add( i);}System.out.println("初始化耗时:" + (System.nanoTime() - startTime));startTime = System.nanoTime();list.add(list.size() >> 1, 1);System.out.println("耗时:" + (System.nanoTime() - startTime));}@Testpublic void test_LinkedList() {LinkedList<Integer> list = new LinkedList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 106710; i++) {list.add(i);}System.out.println("初始化耗时:" + (System.nanoTime() - startTime));startTime = System.nanoTime();list.add(list.size() >> 1, 1);System.out.println("耗时:" + (System.nanoTime() - startTime));}

2.头插入
头插入linkedlist就比arraylist快很多了,即便是arraylist不需要扩容,也比不过linkedlist
因为linkedlist唯一耗时的地方就是new一个node节点

代码

    @Testpublic void test_ArrayList_addCenter() {ArrayList<Integer> list = new ArrayList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 100000; i++) {list.add( i);}System.out.println("初始化耗时:" + (System.nanoTime() - startTime));startTime = System.nanoTime();
//        list.add(list.size() >> 1, 1);list.add(0,1);System.out.println("耗时:" + (System.nanoTime() - startTime));}@Testpublic void test_LinkedList_addCenter() {LinkedList<Integer> list = new LinkedList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 100000; i++) {list.addFirst(i);}System.out.println("初始化耗时:" + (System.nanoTime() - startTime));startTime = System.nanoTime();
//        list.add(list.size() >> 1, 1);list.add(1);System.out.println("耗时:" + (System.nanoTime() - startTime));}

3.尾插入
arraylist没扩容 基本持平,插入速度差不多,扩容的话linkedlist快一些
两组测试
3.1没扩容

    @Testpublic void test_ArrayList_addCenter() {ArrayList<Integer> list = new ArrayList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 100000; i++) {list.add( i);}System.out.println("初始化耗时:" + (System.nanoTime() - startTime));startTime = System.nanoTime();
//        list.add(list.size() >> 1, 1);list.add(1);System.out.println("耗时:" + (System.nanoTime() - startTime));}@Testpublic void test_LinkedList_addCenter() {LinkedList<Integer> list = new LinkedList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 100000; i++) {list.add(i);}System.out.println("初始化耗时:" + (System.nanoTime() - startTime));startTime = System.nanoTime();
//        list.add(list.size() >> 1, 1);list.add(1);System.out.println("耗时:" + (System.nanoTime() - startTime));}

3.2进行扩容

    @Testpublic void test_ArrayList_addCenter() {ArrayList<Integer> list = new ArrayList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 106710; i++) {list.add( i);}System.out.println("初始化耗时:" + (System.nanoTime() - startTime));startTime = System.nanoTime();
//        list.add(list.size() >> 1, 1);list.add(1);System.out.println("耗时:" + (System.nanoTime() - startTime));}@Testpublic void test_LinkedList_addCenter() {LinkedList<Integer> list = new LinkedList<Integer>();long startTime = System.nanoTime();for (int i = 0; i < 106710; i++) {list.add(i);}System.out.println("初始化耗时:" + (System.nanoTime() - startTime));startTime = System.nanoTime();
//        list.add(list.size() >> 1, 1);list.add(1);System.out.println("耗时:" + (System.nanoTime() - startTime));}

测试结果就不截图了,有兴趣自己去跑一跑,debug看一看源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows高级编程学习笔记(二)

第三章 进程 发现这本书的文字很简练&#xff0c;知识点突出&#xff0c;而且翻译的基本没有拗口的地方&#xff0c;是本好书&#xff0c;(^o^)/~ 下面进入正题。 关于内存映射 Windows内存管理的分页机制在微机原理课程中有提到&#xff0c;后面的章节也有相关内容。这里提…

【转】1.5异步编程:.NET4.X 数据并行

任务并行库 (TPL) 是 .NET Framework 4的 System.Threading 和 System.Threading.Tasks 命名空间中的一组公共类型和 API。TPL的目的在于简化向应用程序中添加并行性和并发性的过程&#xff0c;从而提高开发人员的工作效率。TPL会动态地按比例调节并发程度&#xff0c;以便最有…

idea全局搜索搜不全的BUG

搜不全真是坑坏我了&#xff0c;修改业务后&#xff0c;差点就卷铺盖走人了… 修改配置 打开help -> Find Action 输入registry后搜索(点击框内任意一行后&#xff0c;直接输入就是搜索) page.size 将100的值改大&#xff0c;一步到位100000

Windows高级编程学习笔记(三)

第四章 线程 知识要点 每向系统获取一个句柄&#xff0c;会使相应对象的引用计数加1。而GetCurrentProcess()函数返回的是一个伪句柄&#xff0c;也就是不增加引用计数&#xff0c;相当于赋值拷贝。对应于线程&#xff0c;有GetCurrentThread()&#xff0c;情况同GetCurrentPr…

【转】1.6异步编程:IAsyncResult异步编程模型 (APM)

传送门&#xff1a;异步编程系列目录…… 大部分开发人员&#xff0c;在开发多线程应用程序时&#xff0c;都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作。然而&#xff0c;这个技术存在许多限制。最大的问题是没有一个内建的机制让你知道操作在什么时候…

python图形模块_使用Python图形模块:有没有办法将当前窗口保存为图像?

我正在使用pythongraphics模块。我要做的是将当前窗口保存为图像。在模块中&#xff0c;有一个选项可以将“图像”另存为图像(图像.保存()). 但这并没有帮助&#xff0c;因为它只是保存一个已经加载的图像。或者&#xff0c;如果你像我一样加载一个空白图像&#xff0c;希望在上…

Spark worker内存不足导致任务失败,报错Likely due to containers exceeding thresholds, or network issues

报错: Lost executor 33 on xx.xx.xx.152: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages. 原因&#xff1a; 由于spark某节点可用内存不足导致整个任务失败&#xff0c;在执行…

Qt:程序异常退出

现象 编译成功&#xff0c;但是运行时崩溃并在控制台输出&#xff1a;“程序异常错误”。 可能原因 查阅资料&#xff0c;原因可能是库错误。 最终解决方法 的确是库错误&#xff0c;原因是编译库的Qt版本和使用该库的Qt程序对应的Qt版本不相同。需要使用相同版本的Qt来生…

python用什么系统好_10分钟用python搭建一个超好用的CMDB系统

{{ message }}new Vue({ el: #app, data: { message: Hello Vue.js! } })

【转】1.7异步编程:基于事件的异步编程模式(EAP)

传送门&#xff1a;异步编程系列目录…… 上一篇&#xff0c;我给大家介绍了“.NET1.0 IAsyncResult异步编程模型(APM)”&#xff0c;通过Begin*** 开启操作并返回IAsyncResult对象&#xff0c;使用 End*** 方法来结束操作&#xff0c;通过回调方法来做异步操作后其它事项。然…

C安全编程知识点

1、因为非零即为真&#xff0c;不要用下面的语句来判断 if (TRUE condition) 要改写成 if (condition) 判断条件为假也一样要用&#xff1a; if (!condition)

python怎样定义一个数组_python如何建立全零数组

语句格式&#xff1a; numpy.zeros(shape, dtypefloat, orderC) 参数说明&#xff1a; shape:整型或元素为整型的序列&#xff0c;表示生成的新数组的shape&#xff0c;如&#xff08;2&#xff0c;3&#xff09;或 2。 dtype:生成数组的数据格式&#xff0c;如numpy.int8。默认…

【转】1.8异步编程:.NET 4.5 基于任务的异步编程模型(TAP)

传送门&#xff1a;异步编程系列目录…… 最近我为大家陆续介绍了“IAsyncResult异步编程模型 (APM)”和“基于事件的异步编程模式(EAP)”两种异步编程模型。在.NET4.0 中Microsoft又为我们引入了新的异步编程模型“基于任务的异步编程模型(TAP)”&#xff0c;并且推荐我们在开…

Hbase模糊查询优化 - 并发查询

HBase模糊查询优化 - 并发查询 HBase查询优化续集&#xff0c;继上次优化后查询速度还是很慢&#xff0c; 这次优化我们使用并发查询&#xff0c;查询HBase库里的各region拆分情况&#xff0c;然后对查询的rowkey切分成多段&#xff0c;每一段单独去不同的region中查询&#x…

Qt: 找不到Qt5Widgets.lib

在静态编译的时候&#xff0c;提示错误&#xff1a; error: dependent ‘D:\IDE\Qt\5.4.2-mingw32-rel-static\5.4.2-mingw32-rel-static\lib\Qt5Widgets.lib 去目录下看了下&#xff0c;全部是libxxxxx.a文件&#xff0c;是linux的库文件。但是之前编译是正常的&#xff0c;这…

python3读写excel文件_python3 循环读取excel文件并写入json操作

文件内容&#xff1a;excel内容&#xff1a;代码&#xff1a; import xlrd import json import operator def read_xlsx(filename): # 打开excel文件 data1 xlrd.open_workbook(filename) # 读取第一个工作表 table data1.sheets()[0] # 统计行数 n_rows table.nrows data …

Qt:error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800

Visual Studio 2013生成Qt项目时报错。网上搜说是更改平台工具集&#xff0c;试了没用。退一步说我就是需要使用vs2013&#xff0c;改成其他的会不符合项目需求。于是打开了项目文件.sln&#xff0c;如下&#xff1a; 才发现目标工程的Qt版本是5.7.0&#xff0c;vs2013里面设置…

JAVA程序绑定到指定的CPU核上

由于服务器上某几个核被C程序绑定了&#xff0c;我们的java程序有的线程会使用到&#xff0c;导致C程序丢包异常&#xff0c;所以需要将JAVA程序绑定到指定的CPU核上 1.命令介绍 1.taskset命令 taskset -c <cpu核编号> <pid> #可以指定进程绑定到哪个cpu核上2.t…

【转】URN_URI_URL详解

URI&#xff0c;Uniform Resource Identifier&#xff0c;统一资源标识符。 URN&#xff0c;Uniform Resource Name&#xff0c;统一资源命名 URL&#xff0c;Uniform Resource Location&#xff0c;统一资源定位符。 URI 简单来理解就是标识/定义了一个资源&#xff0c;而 URL…

python生成json_生成动态嵌套JSON对象和数组-python - python

正如问题所解释的那样&#xff0c;我一直在尝试生成嵌套的JSON对象。在这种情况下&#xff0c;我有for循环从字典dic中获取数据。下面是代码&#xff1a; f open("test_json.txt", w) flag False temp "" start "{\n\t\"filename\"&quo…