ArrayList有什么用
发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,本篇内容介绍了" ArrayList有什么用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Array
千家信息网最后更新 2024年11月17日ArrayList有什么用
本篇内容介绍了" ArrayList有什么用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
ArrayList
是一个有序列表。
public class ArrayListextends AbstractList implements List , RandomAccess, Cloneable, java.io.Serializable
RandomAccess
标识接口,无内部方法,表示可以随机访问内部元素Cloneable
标识接口,无内部方法,表示可以进行负责java.io.Serializable
标识接口,无内部方法,表示支持序列化
底层数据结构是一个对象数组
transient Object[] elementData;
ArrayList对象有存储上限
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
缩容,当buffer分配的空间容量大于实际存储的元素数量时,通过缩容释放对于的资源。
public void trimToSize() { modCount++; if (size < elementData.length) { elementData = (size == 0) ? EMPTY_ELEMENTDATA : Arrays.copyOf(elementData, size); }}
扩容,步长为原容量的 50%, 扩容后将原buffer复制到新创建的buffer中。所以ArrayList如果存在频繁扩容的情况,会引起程序性能下降。
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity);}
插入或删除指定位置的Element,都会引起底层数据的批量复制
插入
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 E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue;}private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work}
清空数据时,并不释放底层数组分配的空间,只是将数组中的对象持有复制成null
,方便虚拟机在GC时,直接将对象内存释放。
public void clear() { modCount++; // clear to let GC do its work // 释放句柄,告诉GC对象可以被回收,但并不是立即回收 for (int i = 0; i < size; i++) elementData[i] = null; size = 0;}
在数据计算中存在集合求交集运算,在ArrayList中同样提供了该方法。
求交集
public boolean retainAll(Collection> c) { Objects.requireNonNull(c); return batchRemove(c, true);}private boolean batchRemove(Collection> c, boolean complement) { final Object[] elementData = this.elementData; int r = 0, w = 0; boolean modified = false; try { for (; r < size; r++) if (c.contains(elementData[r]) == complement) elementData[w++] = elementData[r]; } finally { // Preserve behavioral compatibility with AbstractCollection, // even if c.contains() throws. if (r != size) { System.arraycopy(elementData, r, elementData, w, size - r); w += size - r; } if (w != size) { // clear to let GC do its work for (int i = w; i < size; i++) elementData[i] = null; modCount += size - w; size = w; modified = true; } } return modified;}
ArrayList实现了Serializable接口,表示它可以被序列化,在其内部提供了jdk标准的序列化和反序列号的方法。通过序列化和发序列化方法可以发现,JDK并不是把ArrayList所有属性都写入文件,只是将size,以及数组中的每一个对象进行了序列化。
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // Write out element count, and any hidden stuff int expectedModCount = modCount; s.defaultWriteObject(); // Write out size as capacity for behavioural compatibility with clone() s.writeInt(size); // Write out all elements in the proper order. for (int i=0; i0) { // be like clone(), allocate array based upon size not capacity ensureCapacityInternal(size); Object[] a = elementData; // Read in all elements in the proper order. for (int i=0; i " ArrayList有什么用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
序列
对象
方法
接口
数据
数组
底层
标识
交集
元素
内容
只是
实际
容量
情况
更多
知识
空间
分配
存储
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
湖南有几台游戏服务器
双路服务器上一颗cpu可以吗
手游网络修改数据库
ibm服务器raid1
网络安全建设机制文件
重庆电话网络技术服务活动
做软件开发要懂弱电吗
网络安全计算机三级证书
网络安全专业就业前景硕士生
四川企业党建软件开发
太仓管理软件开发备案
文藏图案数据库
php留言板源码无需数据库
服务器安全狗访问认证
影盟服务器
松下电器大连软件开发
宁夏app软件开发案例
软件开发中架构cs
测试服务器是否正常开启
原舟互联网科技有限公司
中拓互联网络科技有限公司诈骗
网络攻防好还是网络安全好
IBM服务器怎样登录管理口
请创建一个数据库用户表
倩女幽魂手游夜来香服务器
服务器能改装个人电脑吗
php抓取数据库
测试服务器是否正常开启
珠海家政软件开发联系方式
资金盘软件开发多少钱