大白话+画图 从源码角度一步步搞懂ArrayList和LinkedList的使用

德邦2017秋招Java笔试题全解析:HashMap、JVM与线程池核心考点复盘 Java基础是校招笔试的基石,而真正的考察点往往藏在原理之中。从集合框架的HashMap底层结构到JVM内存区域与垃圾回收,再到并发编程的线程池参数与锁机制,每一道笔试题都在检验开发者对语言本质的理解。理解负载因子为何是0.75、对象创建的内存分配流程、volatile与synchronized的边界,才能应对千变万化的题目变体。这些知识不仅是应对笔试的钥匙,更是解决线上OOM、SQL注入、事务失效等真实工程问题的底层支撑。从物流订单状态机到日常CRUD,扎实的Java功底决定了系统的稳定性与可维护性。本文 阅读详情

1.说说ArrayList

1.基本原理

ArrayList,原理就是底层基于数组来实现。

01.基本原理:
数组的长度是固定的,java里面数组都是定长数组,比如数组大小设置为100,此时你不停的往ArrayList里面塞入这个数据,此时元素数量超过了100以后,此时就会发生一个数组的扩容,就会搞一个更大的数组,把以前的数组拷贝到新的数组里面去。

这个数组扩容+元素拷贝的过程,相对来说会慢一些

02.缺点:

01:不要频繁的往arralist里面去塞数据,导致他频繁的数组扩容,避免扩容的时候较差的性能影响了系统的运行。

02: 数组来实现,数组你要是往数组的中间加一个元素,是不是要把数组中那个新增元素后面的元素全部往后面挪动一位,所以说,如果你是往ArrayList中间插入一个元素,或者随机删除某个元素,性能比较差,会导致他后面的大量的元素挪动一个位置。

03.优点:

基于数组来实现,非常适合随机读,你可以随机的去读数组中的某个元素。

例如:list.get(10),相当于是在获取第11个元素,这个随机读的性能是比较高的,随机读,list.get(2),list.get(20),随机读list里任何一个元素。
因为基于数组来实现,他在随机获取数组里的某个元素的时候,性能很高,他可以基于他底层对数组的实现来快速的随机读取到某个元素,直接可以通过内存地址来定位某个元素。
04.常用场景:
ArrayList,常用,如果你不会频繁的在里面插入一些元素,不会导致频繁的元素的位置移动、数组扩容,就是有一批数据,查询出来,灌入ArrayList中,后面不会频繁插入元素了,主要就是遍历这个集合,或者是通过索引随机读取某个元素。
如果果你涉及到了频繁的插入元素到list中的话,尽量还是不要用ArrayList,数组,定长数组,长度是固定的,元素大量的移动,数组的扩容+元素的拷贝。
05.场景示例:
开发系统的时候,大量的场景,需要一个集合,里面可以按照顺序灌入一些数据,ArrayList的话呢,他的最最主要的功能作用,就是说他里面的元素是有顺序的,我们在系统里的一些数据,都是需要按照我插入的顺序来排列的。

2.源码剖析

01.核心方法的剖析

咱们来启动一个demo工程,在里面写写集合的代码,跟进去看看各种集合的实现原理,直接可以看JDK底层的源码。

(1).示例代码:
publicclassArrayListDemo {publicstaticvoidmain(String[] args){
        ArrayList<String> sayLove =new ArrayList<String>();
       sayLove.add("老婆,早上好");
        sayLove.add("老婆,下午好");
        sayLove.add("老婆,下班啦,我去找你");
        sayLove.set(0,"老婆,早上好,我们一起吃早饭吧");
        sayLove.add(2,"老婆,注意坐姿,不要久坐哦");
    }
}
(2).构造函数分析:

默认的构造函数,直接初始化一个ArrayList实例的话,会将内部的数组做成一个默认的空数组,{},Object[],他有一个默认的初始化的数组的大小的数值,是10,也就是我们可以认为他默认的数组初始化的大小就是只有10个元素。

privatestaticfinal Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};//空数组this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

 privatestaticfinalint DEFAULT_CAPACITY = 10;//初始容量 10

注意点:

ArrayList的话,玩儿好的话,一般来说,你应该都不是使用这个默认的构造函数,你构造一个ArrayList的话,基本上来说就是默认他里面不会有太频繁的插入、移除元素的操作,大体上他里面有多少元素,你应该可以推测一下的。
基本上最好是给ArrayList构造的时候,给一个比较靠谱的初始化的数组的大小,比如说,100个数据,1000,10000,避免数组太小,往里面塞入数据的时候,导致数据不断的扩容,不断的搞新的数组。
ensureCapacityInternal(size + 1); // Increments modCount!!
你每次往ArrayList中塞入数据的时候,人家都会判断一下,当前数组的元素是否塞满了,如果塞满的话,此时就会扩容这个数组,然后将老数组中的元素拷贝到新数组中去,确保说数组一定是可以承受足够多的元素的。
(3).add(E)方法
日常多表白,恩爱不懈怠。

分析如下:

publicbooleanadd(E e){
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        returntrue;
    }

#2 ensureCapacityInternal(size + 1);:判断一下当前的数组容量是不是满了,如果满了会进行扩容;

if (minCapacity - elementData.length > 0)
            grow(minCapacity);

1).第一次进入这个方法时,minCapacity=10,默认值,而此时底层还是个空数组,自然会进行数组的扩容。扩容代码如下:

privatevoidgrow(int minCapacity){
        // overflow-conscious codeint oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

秋招Java八股文核心考点梳理:从HashMap到JVM、并发与Spring 在Java后端开发的学习路径中,集合框架、JVM内存管理、并发编程与Spring框架是绕不开的核心技术基石。以HashMap为例,其底层数组+链表+红黑树的结构设计,体现了哈希冲突与查询效率的权衡;而JVM中OOM(OutOfMemoryError)的排查,则需要理解堆内存、垃圾回收与可达性分析等原理。掌握这些基础概念,不仅能解答面试中的高频问题,更能指导实际工程项目中的性能调优与故障排查。从技术价值的视角看,理解线程池参数、AQS同步器、Bean生命周期等机制,是构建高可靠、高并发服务的关键能力。无论是准 阅读详情

相关推荐

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档)

本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。

招风的黑耳优快云 156

Java集合容器核心原理与面试实战:从HashMap到ConcurrentHashMap

Java集合框架是每个开发者绕不开的基础知识,它封装了数组、链表、哈希表等经典数据结构,并提供了统一的接口与多种实现。理解集合的底层设计原理,如HashMap的数组+链表+红黑树结构、扩容机制以及哈希扰动函数,不仅能应对面试中的高频问题,更能指导实际工程中的容器选型与性能优化。从单线程的ArrayList到并发场景下的ConcurrentHashMap,集合框架体现了空间与时间、安全与性能之间的精妙权衡。掌握这些容器的工作原理,还能有效避免遍历修改异常、内存泄漏等常见陷阱。本文系统梳理了Java集合容器从整

weixin_33795093的博客 463

仿人型机械臂逆运动学避坑指南:当末端三关节平行时如何处理奇异点

本文深入探讨了6R仿人型机械臂在末三轴平行结构下的逆运动学求解策略,重点分析了运动学逆解中的奇异点问题及其处理方法。通过MATLAB实现展示了D-H参数建模、几何解析法求解流程以及奇异点规避策略,为工业机器人开发提供了实用的数值算法方案和工程优化技巧。

sss66的博客 882

练功秘籍---A

常用整理

CarryBest的博客 1650

CMIP6数据处理及在气候变化、水文、生态等领域中的应用

CMIP6、Biome-BGC、生态、气候变化、气象、水文、气候模式、植被、生态模式、遥感、极端气候、降水、WRF模式、动力降尺度、RCM、大气环流模型、贝叶斯模型、、降尺度

PhyliciaFelicia的博客 1550

Tailscale 自建 DERP 中继服务器

Tailscale自建DERP中继服务器

Accompagner的博客 4330

Java八股文不是背的:从JVM到HashMap,面试官到底在考什么?

在Java技术面试中,HashMap原理、JVM内存模型、垃圾回收机制、synchronized锁升级等高频考点,常被视为“八股文”而备受争议。然而,这些知识点其实是构建Java知识体系的关键索引。理解其背后的设计原理——例如HashMap为何用数组加链表加红黑树、加载因子为何是0.75,JVM为何分代收集,锁为何要升级——远比背诵标准答案更能体现技术深度。从概念到原理,从技术价值到应用场景,掌握这些底层逻辑不仅有助于应对面试追问,还能在实际开发中快速定位内存溢出、并发数据不一致等问题。本文从面试官视角拆解

weixin_33816300的博客 452

如何在Hyper-V、Virtual PC等虚拟机中使用USB设备

今天网盾科技给大家分享一篇在Hyper-V、Virtual PC等虚拟机中使用USB Over network软件用USB设备的方法。 当前Hyper-V Server与Microsoft Virtual PC的虚拟机,不支持USB的设备,如果你有USB设备需要在虚拟机中使用,例如USB的加密狗、智能卡、网上银行的U盾等,可以通过USB Over Network软件,通过网络,使用USB设备。 USB Over Network是一款“客户/服务器”软件,是这么一款功能强大 USB 设备共享软件。它使用方

wangdunkeji_idc的博客 4999

2023Java面试八股文高频题解析:从集合到JVM、Spring,揭秘面试官考察本质

在Java技术栈的面试考察中,集合框架与并发机制始终是绕不开的核心环节。HashMap作为最常用的数据结构,其哈希碰撞处理、扩容逻辑与红黑树转换原理,不仅检验候选人的源码阅读深度,更直接影响实际系统的查询性能;而JVM内存区域划分与垃圾回收算法,则决定了高并发场景下的稳定性和调优空间。理解这些基础原理,能够帮助开发者从“背答案”转向“讲思路”,真正应对面试官的层层追问。本文结合2023年高频Java面试题,系统梳理了从基础语法、集合框架到Spring框架、MySQL索引及Redis缓存等核心知识点,并深入分

weixin_33826609的博客 359

Diffix3D+复现

上下载模型,将其放在一个目录中,并将目录名填在demo代码中from_pretrained的cache_dir参数里。目录结构应该是"<PATH>/nvidia/difix/…给的requirements文件中pytorch和xformers的版本没有指定,这里测试过以下版本,可以成功运行。将readme中的demo代码新建一个python脚本复制进去,然后将脚本放在src目录中运行。如果遇到网络问题无法加载huggingface上的预训练模型,可以手动从。如果出现,以下错误重新。

NeverMakeIt的博客 1085

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

Muduo is a multithreaded C++ network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。 muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码...

大秦坑王的专栏 3万+

Java校招笔试核心考点与实战避坑指南

在软件工程人才筛选中,校招笔试既考核语言基础又检验工程素养。理解JVM内存模型与运行时数据区,是定位 java: outofmemoryerror: insufficient memory 等线上故障的根基;掌握lambda函数与java stream的声明式编程,则是现代Java开发的必备技能。从集合原理到并发编程,从SQL优化到Linux排查,笔试题目往往围绕高频基础知识展开。本文以网易Java开发工程师笔试题型为例,梳理考点框架、备考方法与考场时间策略,帮助求职者扎实基本功、规避常见陷阱,稳步通关校招

weixin_34414196的博客 275

利用大规模生物活性挖掘,计算识别针对癌基因驱动蛋白 EGFR、BRAF 与 CDK4 的高亲和力抑制剂

背景:精准癌症治疗需要小分子抑制剂与致瘤蛋白靶点之间的精确匹配。方法:我们使用 Python 及 ChEMBL 数据库 API 开发了一套计算流程,系统性地筛选针对 EGFR、BRAF 与 CDK4 的高亲和力配体。对 IC50 < 1000 nM 的生物活性进行过滤,并检索候选化合物的分子结构(SMILES)以供后续优化。结果:本研究共识别出 [插入总数] 种独特化合物。其中,对 BRAF 激酶而言,我们挑选了一批 IC50 低至 6.0 nM 的高效实验性化合物。

u012133341的博客 96

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 289

数字图像处理:直方图匹配或规定化Histogram Matching (Specification)原理及感悟

本文介绍了连续图像和数字图像直方图匹配(直方图规定化)的原理、处理过程,并提供了案例进行了讲解。可以看到,直方图均衡处理是直方图匹配的一个重要桥梁。 最后,对于直方图规定化这个翻译个人觉得很low,个人感觉叫指定直方图更好理解,但Histogram Specification怎么翻译确实不太好把握,因此还是叫Histogram Matching直方图匹配最好。

老猿Python 2880

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 198

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 130

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 501

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 635

java框架大全

java框架大全

qq_39326137的博客 183

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 361

SecureRandom做随机源,这个Java随机字符串工具类有3个方法

本文分享一款JDK17环境下的Java随机字符串工具类,内置3个开箱即用的方法,全部采用SecureRandom加密安全随机源,不存在弱随机、可预测、取模偏差等问题。工具类支持默认62字符集随机串、纯数字随机串、自定义字符集随机串三种生成模式,支持Unicode码点级别的字符集处理,兼容Emoji等增补字符,边界处理严格,异常信息明确,适合验证码、邀请码、盐值、随机口令、短链码等场景,源码可直接复制使用。

Java后端 | AI智能体应用实战派 | 电脑技能行家 299
上一篇: GitHub标星81.6k!Alibaba技术官甩出的SpringCloud笔记,细节满满、无微不至
下一篇: Github接近10w点赞!Java面试必备开源指南,开启一路狂飙!
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值