【JAVA学习之路 | 进阶篇】ArrayList,Vector,LinkedList内存解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 【JAVA学习之路 | 进阶篇】ArrayList,Vector,LinkedList内存解析

1.ArrayList

(1). 特点 :

  • 实现了List接口,存储有序的,可重复的数据.
  • 底层使用Object[]数组存储.
  • 线程不安全.(底层方法未用synchronized修饰.)

(2). 版本解析 :


<i> : JDK7版本


ArrayList<String> list =new ArrayList<>();


//底层会初始化数组,直接new了一个长度为10的数组


Object[] elementData =new Object[10];


list.add("AA")//elementData[0] ="AA";


list.add("BB")//elementData[1] ="BB";

......

当添加第11个元素时,底层的elementData数组已满,则需要扩容.扩容为原来数组长度的1.5倍.并将原来的数组的内容copy到新创建的数组中.


<ii> JDK8版本

ArrayList<String> list =new ArrayList<>();


//底层也会初始化数组,但该数组的长度为0


Object[] elementData =new Object[]{};


list.add("AA");//首次添加元素时,会初始化数组 : elementData =new Object[10];并elementData[0] ="AA";


list.add("BB");//elementData[1] ="BB".


当添加到11个元素时,底层数组已满,需要数组扩容,同样扩容至原来数组长度的1.5倍.并将原来数组的内容copy到新new出来的数组中.


小结 :


JDK7版本有点类似于饿汉式,一上来直接new长度为10的数组.


JDK8版本有点类似于懒汉式,创建ArrayList对象时new了一个长度为0的数组,当需要添加元素时,才new一个长度为10的数组.

2.Vector(JDK8版本)

Vector<String> vector =new Vector<>();


//底层初始化数组,长度为10;


Object[] elementData =new Object[10];


vector.add("AA");//elementData[0] ="AA"


vector.add("BB");//elementData[1] ="BB"


当添加到第11个元素时,数组已满,需要扩容.扩容至原来数组长度的两倍大小.并将原来的数组的内容copy到新new出来的数组.

3.LinkedList(链表)

(1). 特点

  • 实现了List接口,可存储有序的,可重复的数据.
  • 底层使用双向链表存储.

(2). 解析


LinkedList<String> list =new LinkedList<>();


//底层没做什么.


list.add("AA");//将"AA"封装到一个Node对象1中,list对象的属性first,last(类型Node<E>)都指向了该Node对象(first,last分别为指向链表的头结点的指针和尾结点的指针).


list.add("BB");//将"BB"封装到一个Node对象2中,并将last指针指向了Node对象2,Node对象里有属性(Node<E> prev, E item, Node<E> next),并将node1.next =node2,node2.prev =node1.构成了双向链表.

4.建议

(1). Vector基本上已经不使用了.被版本抛弃了.


(2). ArrayList底层使用Object[]数组结构.查找与尾部添加的时间复杂度为O(1);而删除与插入的时间复杂度为O(n).


(3). LinkedList底层使用双向链表存储.查找与尾部添加的时间复杂度为O(n);而删除与插入的时间复杂度为O(1).


(4). 在选择了ArrayList的前提下,重载构造器ArrayList list1 =new ArrayList();


//底层创建了长度为10的数组


ArrayList list2 =new ArrayList(int capacity)


//底层创建了长度为capacity的数组.

目录
打赏
0
1
1
0
6
分享
相关文章
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
131 29
JVM简介—1.Java内存区域
【YashanDB知识库】kettle同步大表提示java内存溢出
在数据导入导出场景中,使用Kettle进行大表数据同步时出现“ERROR:could not create the java virtual machine!”问题,原因为Java内存溢出。解决方法包括:1) 编辑Spoon.bat增大JVM堆内存至2GB;2) 优化Kettle转换流程,如调整批量大小、精简步骤;3) 合理设置并行线程数(PARALLELISM参数)。此问题影响所有版本,需根据实际需求调整相关参数以避免内存不足。
|
2月前
|
java设置栈内存大小
在Java应用中合理设置栈内存大小是确保程序稳定性和性能的重要措施。通过JVM参数 `-Xss`,可以灵活调整栈内存大小,以适应不同的应用场景。本文介绍了设置栈内存大小的方法、应用场景和注意事项,希望能帮助开发者更好地管理Java应用的内存资源。
53 4
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
50 10
【YashanDB 知识库】kettle 同步大表提示 java 内存溢出
【问题分类】数据导入导出 【关键字】数据同步,kettle,数据迁移,java 内存溢出 【问题描述】kettle 同步大表提示 ERROR:could not create the java virtual machine! 【问题原因分析】java 内存溢出 【解决/规避方法】 ①增加 JVM 的堆内存大小。编辑 Spoon.bat,增加堆大小到 2GB,如: if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms512m" "-Xmx512m" "-XX:MaxPermSize=256m" "-
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
273 4
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
63 1
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
86 29

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等