博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对java中arraylist深入理解
阅读量:7298 次
发布时间:2019-06-30

本文共 1056 字,大约阅读时间需要 3 分钟。

1、ArrayList插入删除一定慢么?

取决于你删除的元素离数组末端有多远,ArrayList拿来作为堆栈来用还是挺合适的,push和pop操作完全不涉及数据移动操作。

2、ArrayList的遍历和LinkedList遍历性能比较如何?

论遍历ArrayList要比LinkedList快得多,ArrayList遍历最大的优势在于内存的连续性,CPU的内部缓存结构会缓存连续的内存片段,可以大幅降低读取内存的性能开销。

3、ArrayList是如何扩容的?

ArrayList扩容后的大小等于扩容前大小的1.5倍,当ArrayList很大的时候,这样扩容还是挺浪费空间的,甚至会导致内存不足抛出OutOfMemoryError。扩容的时候还需要对数组进行拷贝,这个也挺费时的。所以我们使用的时候要竭力避免扩容,提供一个初始估计容量参数,以免扩容对性能带来较大影响。

4、ArrayList的默认数组大小为什么是10?

其实小编也没找到具体原因。据说是因为sun的程序员对一系列广泛使用的程序代码进行了调研,结果就是10这个长度的数组是最常用的最有效率的。也有说就是随便起的一个数字,8个12个都没什么区别,只是因为10这个数组比较的圆满而已。

5、ArrayList是线程安全的么?

当然不是,线程安全版本的数组容器是Vector。Vector的实现很简单,就是把所有的方法统统加上synchronized就完事了。你也可以不使用Vector,用Collections.synchronizedList把一个普通ArrayList包装成一个线程安全版本的数组容器也可以,原理同Vector是一样的,就是给所有的方法套上一层synchronized。

6、数组用来做队列合适么?

数组是非常适合做队列的。比如ArrayBlockingQueue内部实现就是一个环形队列,它是一个定长队列,内部是用一个定长数组来实现的。另外著名的Disruptor开源Library也是用环形数组来实现的超高性能队列,具体原理不做解释,比较复杂。简单点说就是使用两个偏移量来标记数组的读位置和写位置,如果超过长度就折回到数组开头,前提是它们是定长数组。

7、arraylist适合做队列吗?

ArrayList固然不适合做队列。因为队列一般是FIFO的,如果用ArrayList做队列,就需要在数组尾部追加数据,数组头部删除数组,反过来也可以。但是无论如何总会有一个操作会涉及到数组的数据搬迁,这个是比较耗费性能的。

 

本文转自:

转载地址:http://bpfnm.baihongyu.com/

你可能感兴趣的文章
Summation Order
查看>>
多线程
查看>>
extract-text-webpack-plugin 的使用及安装
查看>>
POJ 1408:Fishnet
查看>>
MariaDB的二进制包安装方法
查看>>
POJ 1703 Find them, Catch them
查看>>
线程死锁
查看>>
文件描述符fd、文件指针fp和vfork()
查看>>
【转】C++ const用法 尽可能使用const
查看>>
Centos7部署ntp服务器同步时间以及直接将本地时间同步为北京时间
查看>>
WPF(Trigger)
查看>>
bzoj 1011 近似估计
查看>>
Index
查看>>
第二次作业
查看>>
MySQL自学2018/05/02-数据类型
查看>>
新一代的树莓派3版本——Raspberry Pi 3 发布了
查看>>
PPT模板中的”书签”
查看>>
机器学习概述
查看>>
5、Python函数
查看>>
MOSS2010单点登录
查看>>