网站页眉尺寸网站开发的架构
web/
2025/9/27 17:38:58/
文章来源:
网站页眉尺寸,网站开发的架构,英文外链平台,如何注销网站1. ArrayList 与 数组的区别
ArrayList 的底层是数组队列#xff0c;相当于动态数组。与 Java 中的数组相比#xff0c;它的容量能动态增长。在添加大量元素前#xff0c;应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 …1. ArrayList 与 数组的区别
ArrayList 的底层是数组队列相当于动态数组。与 Java 中的数组相比它的容量能动态增长。在添加大量元素前应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。
2 ArrayList 的初始化容量
// 默认容量是10
private static final int DEFAULT_CAPACITY 10;
// 如果容量为0的时候就返回这个数组
private static final Object[] EMPTY_ELEMENTDATA {};
// 使用默认容量10时返回这个数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {};
// 元素存放的数组
transient Object[] elementData;
// 元素的个数
private int size;// 记录被修改的次数
protected transient int modCount 0;
// 数组的最大值
private static final int MAX_ARRAY_SIZE Integer.MAX_VALUE - 8
ArrayList有三个构造方法不同的构造方法的容量是不一样的具体可以查看JDK 源码。
如果不传入初始容量就使用默认容量并设置 elementData为DEFAULTCAPACITY_EMPTY_ELEMENTDATA如果传入初始容量会判断这个传入的值如果大于0就 new一个新的Object数组如果等于0就直接设置 elementData为 EMPTY_ELEMENTDATA。如果传入一个 Collection则会调用toArray()方法把它变成一个数组并赋值给elementData。同样会判断它的长度是否为0如果为0设置elementData为EMPTY_ELEMENTDATA。
3. ArrayList 的扩容具体指什么
ArrayList里面有两个概念一个是capacity它表示的就是“容量”其实质是数组elementData的长度。而size则表示的“存放的元素的个数”。 因为 Java 中数组操作不能越界所以我们必须要保证在插入操作的时候不会抛出数组越界异常。
4. ArrayList是如何实现扩容的
扩容主要分两种自动扩容和手动扩容。 自动扩容底层主要是三个私有方法
// 扩容一个
private Object[] grow() {return grow(size 1);
}// 保证扩容到期望容量minCapacity及以上
private Object[] grow(int minCapacity) {return elementData Arrays.copyOf(elementData,newCapacity(minCapacity));
}// 根据期望容量minCapacity计算实际需要扩容的容量
private int newCapacity(int minCapacity) {// overflow-conscious codeint oldCapacity elementData.length; // 得到旧容量int newCapacity oldCapacity (oldCapacity 1); // 设置新容量为旧容量的1.5倍if (newCapacity - minCapacity 0) { // 如果新容量仍然小于期望容量if (elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA) // 如果是使用的默认容量return Math.max(DEFAULT_CAPACITY, minCapacity); // 取默认容量和期望容量较大值返回if (minCapacity 0) // overflow // 检查期望容量是否越界int 的范围throw new OutOfMemoryError();return minCapacity; // 返回期望容量}// 如果新容量大于期望容量判断一下新容量是否越界return (newCapacity - MAX_ARRAY_SIZE 0)? newCapacity: hugeCapacity(minCapacity);
}可以看到底层其实是调用了Arrays.copyOf方法来进行扩充数组容量的。这里我们主要看一下最后一个方法newCapacity(int minCapacity)的实现。 默认情况下新的容量会是原容量的1.5倍这里用了位运算提高效率。一般情况下如果扩容1.5倍后就大于期望容量那就返回这个1.5倍旧容量的值。而如果小于期望容量那就返回期望容量。这里对默认容量10做了特殊处理。 使用1.5倍这个数值而不是直接使用期望容量是为了防止频繁扩容影响性能。试想如果每次add操作都要扩容一次那性能将会非常低下。 手动扩容主要是一个公有方法ensureCapacity
public void ensureCapacity(int minCapacity) {if (minCapacity elementData.length !(elementData DEFAULTCAPACITY_EMPTY_ELEMENTDATA minCapacity DEFAULT_CAPACITY)) {modCount;grow(minCapacity);}
}
5. ArrayList有缩容吗
ArrayList没有缩容。无论是remove方法还是clear方法它们都不会改变现有数组elementData的长度。但是它们都会把相应位置的元素设置为null以便垃圾收集器回收掉不使用的元素节省内存。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82887.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!