## ArrayList源码分析(五)
/**
* 获取当前集合中有效元素个数
*
* @return 有效元素个数
*/
public int size() {
return size;
}
/**
* 获取当前集合的子集合,截取范围是start <= n < end
*
* @param start start <= end 不得小于0
* @param end end >= start 不得小于等于size
* @return 截取得到的一个MyArrayList子集合对象
*/
public ArrayList<E> subList(int start, int end) {
if (start > end || start < 0 || end > size) {
throw new ArrayIndexOutOfBoundsException();
}
ArrayList<E> listTemp = new ArrayList<>(end - start);
for (int i = start; i < end; i++) {
listTemp.add(this.get(i));
}
return listTemp;
}
/*
* 这里需要类内使用的可以用于判断当前容量是否满足添加要求的方法
* 如果满足直接进入添加模式,如果不满足,需要执行grow方法,完成
* 底层数组的扩容问题。
*/
/**
* 每一次添加元素,都需要进行容量判断,如果满足可以进行添加操作
* 不满足需要制定grow方法。
*
* @param minCapacity 要去的最小容量判断
*/
private void ensureCapacity(int minCapacity) {
// 为了节约时间和空间,这里暂不考虑等于情况
if (minCapacity > elements.length) {
// 完成一个底层数组的扩容方法
grow(minCapacity);
}
}
/**
* 底层数组的扩容方法,原理是创建新数组,移植数组,保存新数组地址
*
* @param minCapacity
*/
private void grow(int minCapacity) {
// 1. 获取原数组容量
int oldCapacity = elements.length;
// 2. 计算得到新数组容量
int newCapacity= oldCapacity + (oldCapacity >> 1);
// 3. 判断新数组容量是否满足要求
if (newCapacity < minCapacity) {
newCapacity = minCapacity;
}
// 新数组容量大于允许的最大数组容量
if (newCapacity > MAX_ARRAY_SIZE) {
// 二次判断minCapacity是否小于MAX_APPAY_SIZE
if (minCapacity < MAX_ARRAY_SIZE) {
// 最小要求是不大于MAX_ARRAY_SIZE,代码可以运行
newCapacity = minCapacity;
} else {
throw new OutOfMemoryError("Overflow MAX_ARRAY_SIZE");
}
}
//
/*
* 4.使用数组工具类方法完成操作
* Arrays.copyOf(源数据数组,可以是任意数组,采用泛型约束,指定的新数组容量);
* a. 根据指定的新数组容量创建对应泛型数据类型的新数组
* b. 从源数组中拷贝内容到新数组
* c. 返回新数组首地址
*/
elements = Arrays.copyOf(elements, newCapacity);
}
}
ArrayList源码分析(五)
最新推荐文章于 2024-07-27 13:31:57 发布