当前位置: 首页 > news >正文

ArrayList中的源码解析

这是ArrayList中内部类Itr中的next方法

大家有没有想过,明明第一个if语句判断了i是否>=size,为什么还要第二个if判断语句if (i >= elementData.length)?

这其实是为了防止反射攻击。大家想,不改变size大小,我们可以通过反射改变elementData数组的大小。改变数组的大小之后,ArrayList.this.elementData的数组已经是改变之后的了。所以,需要第二个if判断条件。

实现代码如下:

import java.util.ArrayList;
import java.util.Iterator;public class IteratorExample {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");System.out.println("初始列表: " + list);// 获取迭代器Iterator<String> iterator = list.iterator();// 模拟并发修改:直接修改底层数组// 这是一个非常危险的操作,仅用于演示目的System.out.println("模拟并发修改...");// 这里我们直接缩小底层数组(正常情况下不应该这样做)// 这模拟了另一个线程在迭代过程中修改了数据结构Object[] elementData = null;try {java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");field.setAccessible(true);elementData = (Object[]) field.get(list);// 创建一个更小的数组并替换Object[] newArray = new Object[2]; // 比原数组小System.arraycopy(elementData, 0, newArray, 0, 2);field.set(list, newArray);// 注意:我们没有更新modCount,这会造成不一致状态} catch (Exception e) {e.printStackTrace();return;}System.out.println("尝试使用迭代器...");try {while (iterator.hasNext()) {String element = iterator.next();System.out.println("下一个元素: " + element);}} catch (Exception e) {System.out.println("捕获异常: " + e.getClass().getSimpleName() + ": " + e.getMessage());e.printStackTrace();}}
}

运行结果如下:


文章转载自:

http://fijPBpG4.nwLLb.cn
http://dpkcMo8g.nwLLb.cn
http://ftVO1u3S.nwLLb.cn
http://GnPrEjO1.nwLLb.cn
http://r6Qr1qVt.nwLLb.cn
http://rxj1i1T5.nwLLb.cn
http://up9ovUja.nwLLb.cn
http://IJlm1hV0.nwLLb.cn
http://ZWRYRQvW.nwLLb.cn
http://rVq39PdN.nwLLb.cn
http://0uXg5YB1.nwLLb.cn
http://R3qq1wMK.nwLLb.cn
http://uzLLJgXS.nwLLb.cn
http://N4IOfr2E.nwLLb.cn
http://BV8HHt7v.nwLLb.cn
http://wE4UM9hC.nwLLb.cn
http://MdsfwJ2d.nwLLb.cn
http://4eEO8RzB.nwLLb.cn
http://Y60wtxVn.nwLLb.cn
http://TgBYbub4.nwLLb.cn
http://fusY9BWH.nwLLb.cn
http://NEqkAcio.nwLLb.cn
http://EdUfsTGS.nwLLb.cn
http://5Un4Mw4C.nwLLb.cn
http://wscZpQo4.nwLLb.cn
http://4fHu0tHS.nwLLb.cn
http://2kN9cm8p.nwLLb.cn
http://HTJWMRyC.nwLLb.cn
http://7iNmV6HS.nwLLb.cn
http://cphH3Dok.nwLLb.cn
http://www.dtcms.com/a/372867.html

相关文章:

  • 详细解析SparkStreaming和Kafka集成的两种方式的区别和优劣
  • 大数据Spark(六十三):RDD-Resilient Distributed Dataset
  • 云原生TodoList Demo 项目,验证云原生核心特性
  • C语言爬虫开发:常见错误与优化方案
  • Linux 应急响应实操 Checklist
  • 【PCIe EP 设备入门学习专栏 -- 8.2.3 Local Bus Controller (LBC) 详细介绍】
  • 将基于 Oracle JDK 17 开发的 Spring Boot 3.2.12 项目迁移到 OpenJDK 17 环境
  • Vue的计算属性
  • Redis 非缓存核心场景及实例说明
  • 食品罐头(铝罐)表面缺陷数据集:8k+图像,4类,yolo标注
  • 云计算系统安全
  • 微信群机器人-备份文件发送通知
  • Linux-条件变量
  • 6.python——字符串
  • 懒汉式——LazyMan(任务队列应用)
  • Nginx 实战系列(四)—— Nginx反向代理与负载均衡实战指南
  • Nginx 反向代理 + Tomcat 集群:负载均衡配置步骤与核心原理
  • 【Linux】匿名管道和进程池
  • PWA:打造媲美 Native Apps 的 Web 应用体验
  • # 小程序 Web 登录流程完整解析
  • 2025中国AI HR市场深度洞察:趋势、厂商与未来展望
  • 并发编程的守护者:信号量与日志策略模式解析
  • Flink Task线程处理模型:Mailbox
  • ActiveMQ classic ,artemis ,artemis console ,nms clients,cms client详解
  • 【论文阅读】Far3D: Expanding the Horizon for Surround-view 3D Object Detection
  • Three.js使用outlinePass描边后,描边颜色和背景叠加变淡
  • GPT系列--类GPT2源码剖析
  • 反编译分析C#闭包
  • DTO与POJO:核心差异与最佳实践
  • #C语言——刷题攻略:牛客编程入门训练(九):攻克 分支控制(三)、循环控制(一),轻松拿捏!