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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【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的数组.

相关文章
|
2月前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
51 6
|
1月前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
42 0
|
2月前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
2月前
|
存储 算法 Java
Java内存管理深度剖析与优化策略####
本文深入探讨了Java虚拟机(JVM)的内存管理机制,重点分析了堆内存的分配策略、垃圾回收算法以及如何通过调优提升应用性能。通过案例驱动的方式,揭示了常见内存泄漏的根源与解决策略,旨在为开发者提供实用的内存管理技巧,确保应用程序既高效又稳定地运行。 ####
|
1月前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
49 8
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
2月前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
80 5
|
1月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
1月前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。

推荐镜像

更多