1. ArrayList 相关方法和性能分析

1. ArrayList 相关方法和性能分析
1.1 ArrayList相关方法

底层数组

add(E e);
		添加在实例化对象过程中约束泛型对应具体数据类型元素对象。
	addAll(Collection<? extends E> c);
		添加参数集合到当前调用方法集合中,要求参数集合对象存储数据类型必须是当前集合对象实例化过程中,约束泛
		型对应具体数据类型,或者其子类类型。
	add(int index, E e);
		在指定下标位置,添加在实例化对象过程中约束泛型对应具体数据类型元素对象。
	addAll(int index, Collection<? extends E> c);
		在指定下标位置,添加参数集合到当前调用方法集合中,要求参数集合对象存储数据类型必须是当前集合对象实例化
		过程中,约束泛型对应具体数据类型,或者其子类类型。
删
	E remove(int index);
		在当前List集合中,删除指定下标元素,返回值是被删除元素对象本身
	remove(Object obj);
		在当前集合中,删除指定元素
	removeAll(Collection<?> c);
		在当前集合中,删除参数集合和当前集合的交集
	retainAll(Collection<?> c);
		在当前集合中,仅保留参数集合和当前集合的交集
	clear();
		清空当前集合中所有数据内容
改
	E set(int index, E e);List 集合中,使用符合实例化对象过程中约束泛型对应具体数据类型对象,替换指定下标元素,返回值是被替换
		元素对象本身
查
	int size();
		当前集合中有效元素个数
	boolean isEmpty();
		判断当前集合是否为空
	boolean contains(Object obj);
		判断参数对象是否在当前集合中存在
	boolean containsAll(Collection<?> c);
		判断参数集合是否是当前集合的子集合
	Object[] toArray();
		返回当前集合中所有元素对象的Object类型数组
	E get(int index);
		在当前集合中,获取指定下标元素
	int indexOf(Object obj);
		获取指定元素在当前集合中第一次出现的下标位置
	int lastIndexOf(Object obj);
		获取指定元素在当前集合中最后一次出现的下标位置
	List<E> subList(int fromIndex, int toIndex);
		从 fromIndex 下标开始,到 toIndex 下标结束,获取子集合对象,要求要头不要尾
1.2 实现过程问题

扩容问题

【原则】
	数组容量不可以修改

扩容流程:
	1. 获取当前底层数组容量
	2. 计算得到新数组容量 大约 1.5 倍
	3. 判断新数组容量是否满足当前添加数据要求 ==> 原数组容量 + 当前添加的元素个数
	4. 判断新数组容量是否超出 MAX_ARRAY_SIZE 【错误提示】
	5. 创建新数组
	6. 从原数组中移动数据到新数组
	7. 新数组地址保存到底层数组引用数据类型变量中。

方法分析:
	1. private 修饰有且只能类内使用
	2. 所需参数是当前添加元素的个数
	private void grow(int minCapacity);
/**
 * 私有化底层扩容方法,在添加数据的操作过程中,控制底层数组容量
 *
 * @param minCapacity 最小容量要求
 */
private void grow(int minCapacity) {
    // 1. 获取当前底层数组容量
    int oldCapacity = elementsData.length;

    // 2. 计算得到新数组容量 大约 1.5 倍
    int newCapacity = oldCapacity + oldCapacity / 2;

    // 3. 判断新数组容量是否满足当前添加数据要求 ==> 原数组容量 + 当前添加的元素个数
    if (newCapacity < minCapacity) {
        newCapacity = minCapacity;
    }

    // 4. 判断新数组容量是否超出 MAX_ARRAY_SIZE 【错误提示】
    if (newCapacity > MAX_ARRAY_SIZE) {
        throw new OutOfMemoryError();
    }

    // 5. 创建新数组
    Object[] newArray = new Object[newCapacity];

    // 6. 从原数组中移动数据到新数组,使用 size 更合适,是有效元素个数,避免无效拷贝
    for (int i = 0; i < size; i++) {
        newArray[i] = elementsData[i];
    }

    // 7. 新数组地址保存到底层数组引用数据类型变量中。
    elementsData = newArray;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值