Java集合ArrayList源码分析(三)

一、删除方法:

1)E remove(int index); 删除指定下标的元素,返回被删除元素内容
2) remove(Object obj); 删除指定元素
3) removeAll(Collection<?> c);删除两个集合的交集
4) retainAll(Collectino<?> c);保留两个集合的交集
5)clear(); 清空整个集合

二、改

E set(int index, E e); 使用符合类型的元素,替换指定下标元素,返回值是被替换的元素。

public E set(int index, E element) {
//检查索引是否合法
	rangeCheck(index);
//旧值
	E oldValue = elementData(index);
//赋新值
	elementData[index] = element;
//返回旧值
	return oldValue
}

三、查

1)int size(); 当前集合有效元素个数
2)boolean isEmpty(); 判断集合是否为空
3)boolean contains(Object obj); 判断指定元素是否存在
4)boolean containsAll(Collection<?> c); 判断指定集合是否为当前集合的子集合
5)Object[] toArray(); 获取当前集合中所有的Object类型数组
6)int indexOf(Oject obj); 获取指定元素在集合中第一次出现的的下标位置
7)int lastIndexOf(Object obj); 获取最后一次出现的下标位置
8)E get(int index); 获取集合中指定下标对应的元素
9)List subList(int fromIndex, int endIndex);

  • indexOf()方法:查找数组里面是否存在指定元素
public int indexOf(Object o) {
	if (o == null){//查找元素为空
		for (int i = 0; i < size; i++)
			if(elementData[i] == null)
			return i;
	} else {//查找的元素不为空
	//遍历数组,找到第一个和指定元素相等的元素,返回下标
		for (int i = 0; i < size; i++) {
			if(o.equals(elementData[i]))
			return i;
		}
	}
	//没有找到返回空
	return -1;
}
  • toArray();返回一个包含此集合中所有元素的数组。
public Object[] toArray() {
	//将集合赋值为数组
	return Arrays.copyOf(elemtentData, size);
}
  • boolean contains(Object obj); 判断指定元素是否存在
public boolean contains(Object o) {
    // 通过调用 indexOf 方法返回的下标来判断是否存在该元素
    return indexOf(o) >= 0;
}
//返回指定元素在集合中首次出现的索引,如果集合不包含该元素,则返回-1
public int indexOf(Object o) {
    // 如果指定元素为 null
    if (o == null) {
        // 从头遍历所有元素,null 用 == 判断,返回第一次 null 出现的下标
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        // 从头遍历所有元素,使用 equals 判断,返回第一次该元素出现的下标
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    // 不存在该元素则返回 -1
    return -1;
}
  • List subList(int fromIndex, int endIndex);
/**
 * 返回集合中指定 [fromIndex, toIndex) 位置元素构成的集合
 * 如果 fromIndex == toIndex,返回空集合
 */
public List<E> subList(int fromIndex, int toIndex) {
    // 检测子集的下标是否越界
    subListRangeCheck(fromIndex, toIndex, size);
    // 通过构造 SubList 返回,SubList 和 ArrayList 引用是同一个对象
    return new SubList(this, 0, fromIndex, toIndex);
}

/*
 * 检测子集的下标是否越界
 */
static void subListRangeCheck(int fromIndex, int toIndex, int size) {
    // 检测 fromIndex 是否小于 0 
    if (fromIndex < 0)
        throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
    // 检测 toIndex 是否大于 size
    if (toIndex > size)
        throw new IndexOutOfBoundsException("toIndex = " + toIndex);
    // 检测 fromIndex 是否大于 toIndex
    if (fromIndex > toIndex)
        throw new IllegalArgumentException("fromIndex(" + fromIndex +
                                           ") > toIndex(" + toIndex + ")");
}

四、注意:
1、ArrayList可以存放null;
2、ArrayList本质是一个elementData数组
3、arrayList区别于数组的地方在于能够自动扩展大小,其中关键的方法就是gorw()方法,不支持缩容。
4、arrayList由于本质是数组,所以它在数据的查询方面会很快,而在插入删除这些方面,性能下降很多,有移动很多数据才能达到应有的效果。

(1)ArrayList 本质上是一个可变数组,内部的元素可以直接通过get与set方法进行访问。元素顺序存储,随机访问很快,删除非头尾元素慢,新增元素慢而且费资源。
较适用于无频繁增删的情况,比数组效率低,如果不是需要可变数组,可考虑使用数组,非线程安全。
(2)LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能。但在get与set方面弱于ArrayList。
适用于 :没有大规模的随机读取,有大量的增加/删除操作.随机访问很慢,增删操作很快,不耗费多余资源,允许null元素,非线程安全。
(3)Vector (类似于ArrayList)线程安全的, Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%。

五、特征分析

一、增删慢:

  • 增加慢:
  1. 有可能触发扩容操作。在扩容方法操作中,从原数组拷贝数据到新数组浪费时间,同时在扩容操作会出现无效内 存销毁问题,同样浪费时间。
  2. 插入数据到指定下标位置,从插入位置开始,数组中的其他数据会整体向后移动。移动操作浪费时间。
  • 删除慢:
  1. 删除指定下标元素,数组中的元素整体向前移动。
  2. 删除元素较多情况下,会导致空间冗余。空间效率较低

二、查询快:

  • 【寻址操作】
    ArrayList底层数据操作方式为数组方式,数组+下标获取对应元素的操作效率是非常高!!!
    是CPU根据对应【地址】直接访问操作。
以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何忧何虑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值