Java ArrayList和LinkedList
ArrayList
ArrayList是Java中最常用的数据结构之一,它是一个动态数组的实现,允许你在程序中存储和管理一个可变大小的对象列表,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
基本概念
ArrayList是List接口的一个实现类,它允许存储任意类型的对象,并且可以动态调整其大小。
List接口表示一个有序的集合,其中的元素可以重复,每个元素都有一个整数索引表示其位置。
动态数组:ArrayList使用一个数组作为其底层数据结构,当数组的空间不足时,ArrayList会自动扩展数组的大小。
内部结构
数组:ArrayList内部维护了一个对象数组,用于存储元素。
容量:ArrayList有一个内部的容量,即数组的大小。当添加的元素超过了当前容量时,ArrayList会创建一个新的更大的数组,并将旧数组中的所有元素复制到新数组中。
扩展策略:默认情况下,ArrayList在需要更多空间时会将数组的大小增加50%,但你可以通过构造函数指定初始容量或增量策略。
特点
可变性:ArrayList的大小是可变的,你可以随时添加或删除元素。
索引访问:ArrayList支持通过索引访问元素,这使得随机访问非常快。
线程不安全:ArrayList不是线程安全的,如果你需要在多线程环境中使用它,你需要自己进行同步控制。
允许null值:ArrayList允许存储null值。
常用方法
添加元素:add(E e) - 向列表的末尾添加一个元素。
获取元素:get(int index) - 返回指定索引处的元素。
设置元素:set(int index, E element) - 替换指定索引处的元素。
删除元素:remove(int index) - 删除指定索引处的元素。
迭代器:iterator() - 返回一个迭代器,用于遍历列表中的元素。
示例代码
下面是一个简单的示例,展示了如何使用ArrayList:
import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {// 创建一个 ArrayListList<String> programmingLanguages = new ArrayList<>();// 添加元素programmingLanguages.add("Java");programmingLanguages.add("C");programmingLanguages.add("Python");programmingLanguages.add("C++");programmingLanguages.add("Visual Basic .NET");programmingLanguages.add("JavaScript");// 获取元素String firstLanguage = programmingLanguages.get(0);System.out.println("First language: " + firstLanguage);// 设置元素programmingLanguages.set(0, "Kotlin");System.out.println("Updated first language: " + programmingLanguages.get(0));// 删除元素programmingLanguages.remove(1); // 删除索引为1的元素System.out.println("After removing an element: " + programmingLanguages);// 遍历元素for (String language : programmingLanguages) {System.out.println(language);}}
}
当你运行这段代码时,它将输出更新后的列表和每个编程语言的名称。
深入理解
容量和扩展:ArrayList的默认初始容量为10。当添加元素导致当前数组容量不足时,ArrayList会创建一个新的数组,其大小通常是原数组大小的1.5倍,并将所有元素复制到新的数组中。
性能:由于ArrayList使用数组作为底层数据结构,因此随机访问非常快(O(1))。但是,插入或删除元素(尤其是在列表的中间位置)可能导致大量的元素移动,这可能会很慢(O(n))。
内存消耗:由于ArrayList可能需要预留额外的空间来容纳更多的元素,因此它可能会占用比实际需要更多的内存。
使用场景
当你需要一个可以动态扩展的有序列表时,ArrayList是一个很好的选择。
如果你需要频繁地进行随机访问,但插入和删除操作相对较少,那么ArrayList非常适合。
在需要快速随机访问的场景中,如索引数据库记录、缓存、配置文件等。
LinkedList
LinkedList是Java集合框架中的一个重要组成部分,它是一种基于双向链表实现的List接口。
基本概念
LinkedList是List接口的一个实现类,它使用双向链表来存储元素。
List接口定义了一个有序集合,允许重复元素,并且可以通过索引访问元素。
双向链表是一种数据结构,其中每个元素(节点)包含一个指向其前一个节点的引用和一个指向其后一个节点的引用。
内部结构
节点:LinkedList中的每个元素都是一个节点,每个节点包含两个部分:数据和两个引用(一个指向前一个节点,另一个指向后一个节点)。
头节点和尾节点:LinkedList维护了对头节点和尾节点的引用,这使得在链表两端添加和删除元素变得非常高效。
特点
插入和删除操作高效:由于LinkedList使用双向链表实现,因此在链表的任意位置插入或删除元素都非常高效,只需要更新相邻节点的引用即可。
随机访问较慢:与基于数组的ArrayList相比,LinkedList的随机访问(通过索引访问元素)较慢,因为需要从头节点开始遍历链表直到找到目标节点。
允许重复元素:LinkedList允许存储重复元素。
线程不安全:LinkedList不是线程安全的。如果多个线程同时访问或修改链表,则需要外部同步机制。
示例代码
下面是一个简单的示例,展示了如何使用LinkedList:
import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {// 创建一个 LinkedListList<String> languages = new LinkedList<>();// 添加元素languages.add("Java");languages.add("C");languages.add("Python");// 在指定位置插入元素languages.add(1, "C++");// 删除元素languages.remove("C");// 获取元素String firstLanguage = languages.getFirst(); // 或者 languages.get(0)String lastLanguage = languages.getLast();// 遍历并打印元素for (String language : languages) {System.out.println(language);}}
}
当你运行这段代码时,它将输出:
Java
C++
Python
深入理解
内部实现:LinkedList的每个节点包含一个next引用指向下一个节点,一个prev引用指向前一个节点,以及一个item来存储实际的数据。
迭代器:LinkedList提供了高效的迭代器实现,可以用来遍历链表中的元素。
性能:LinkedList在插入和删除操作上的性能优于ArrayList,尤其是在链表的中间位置,但随机访问操作不如ArrayList高效。
使用场景
频繁的插入和删除操作:如果你需要在列表中频繁插入和删除元素,那么LinkedList是一个很好的选择。
不确定大小的列表:如果你不确定列表最终会有多大,或者列表的大小会动态变化,LinkedList是一个好的选择,因为它不需要像ArrayList那样预留额外的空间。
不需要频繁随机访问:如果大部分操作是插入和删除,并且不需要频繁地根据索引访问元素,那么LinkedList非常适合。
ArrayList、LinkedList和Vector的相同点和不同点
ArrayList, LinkedList, 和 Vector 都是 Java 中 List 接口的具体实现类,它们都提供了存储和操作有序集合的功能。下面是它们之间的一些相同点和不同点:
相同点
-
实现了 List 接口:
-
它们都实现了 List 接口,因此支持 List 接口中定义的所有方法,比如 add(), remove(), get(), set() 等。
-
-
允许 null 元素:
-
这三个类都允许在列表中存储 null 元素
-
-
索引访问:
-
它们都可以通过索引来访问元素。
-
-
有序性:
-
这些类都是有序的,即元素按照添加顺序保存。
-
-
可变性:
-
它们都是可变的,意味着可以在列表中添加、删除或修改元素。
-
不同点
-
数据结构:
-
ArrayList: 基于动态数组实现。当空间不足时,会自动扩展数组的容量。
-
LinkedList: 基于双向链表实现。每个元素都有一个指向前一个元素和后一个元素的引用。
-
Vector: 与 ArrayList 类似,也是基于动态数组实现,但它是线程同步的。
-
-
性能特点:
-
ArrayList: 对于随机访问(如 get(int index) 和 set(int index, E element))非常高效,因为可以通过索引直接访问。但是插入和删除操作(尤其是中间位置的操作)效率较低,因为需要移动大量的元素。
-
LinkedList: 插入和删除操作非常快,因为它只需要改变前后节点的引用即可。然而,随机访问效率较低,因为需要从头开始遍历链表直到找到目标节点。
-
Vector: 性能特征类似于 ArrayList,但由于同步机制的存在,多线程环境下的性能较低。
-
-
线程安全性:
-
ArrayList 和 LinkedList: 都不是线程安全的。如果多个线程同时访问或修改这些列表,则需要外部同步机制。
-
Vector: 是线程安全的,它的许多方法都是同步的,可以直接在多线程环境中使用而不需要额外的同步。
-
-
初始化容量和增长策略:
-
ArrayList: 默认初始容量为10,每次扩容通常增加50%。
-
LinkedList: 没有固定的容量限制,因为它是基于链表实现的。
-
Vector: 默认初始容量为10,每次扩容通常增加100%。可以通过构造函数指定初始容量和增量。
-
-
其他特性:
-
Vector 还包含了一些额外的方法,例如 addElement(), insertElementAt(), removeElement(), removeElementAt(), 这些方法是为了向后兼容早期的 Vector API 设计。
-
选择哪个类取决于具体的应用场景。如果需要频繁地进行插入和删除操作,或者经常需要处理大量数据,LinkedList 可能更适合。如果需要快速随机访问,并且插入删除操作较少,那么 ArrayList 更合适。而 Vector 则适用于需要线程安全的场景。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Java ArrayList和LinkedList
ArrayList ArrayList是Java中最常用的数据结构之一,它是一个动态数组的实现,允许你在程序中存储和管理一个可变大小的对象列表,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 基本概念 Arra…...
![](https://i-blog.csdnimg.cn/direct/e4ca91b2e2364a96aced94c374f8729b.png)
STM32F030行列式按键扫描
1)行扫说明,行列式按键扫描时: 行输出:行逐一输出高电平,其他的为低,既循环只输出一个高电平; 列读入:所有列通过下拉电阻100K后,都变为低电平,逐一读入&…...
![](https://img-blog.csdnimg.cn/img_convert/96d7659b6144b5a2b28362560cb9c110.png)
FPGA 综合笔记
仿真时阻塞赋值和非阻塞赋值 Use of Non-Blocking Assignment in Testbench : Verilog Use of Non-Blocking Assignment in Testbench : Verilog - Stack Overflow non-blocking assignment does not work as expected in Verilog non-blocking assignment does not work a…...
![](https://www.ngui.cc/images/no-images.jpg)
Android MVVM框架详解与应用
在Android开发中,随着应用复杂度的增加,如何有效地组织和管理代码成为了一个重要的问题。MVVM(Model-View-ViewModel)架构模式因其清晰的结构和高效的开发效率,逐渐成为Android开发者们青睐的架构模式之一。本文将详细…...
![](https://img-blog.csdnimg.cn/img_convert/d8e36333344240414609f606155ba0a3.png)
浅析KHD-厨帽检测算法从源码到实际应用的方案
厨帽检测算法,作为计算机视觉技术在食品安全领域的一项重要应用,其实际应用过程涉及多个方面。 厨帽检测算法主要基于深度学习技术,特别是卷积神经网络(CNN)和目标检测框架(如YOLO、Faster RCNN等ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
ESXi里的FreeBSD装bhyve Ubuntu子系统,外网不通,子系统里无法ping通外面(使用NAT解决)
ESXi里的FreeBSD装bhyve Ubuntu子系统,子系统里无法ping通外面,除了宿主机,其它ip都ping不通。(另一台FreeBSD物理机同样的bhyve ubuntu子系统,网络就是通的,但是TrinityCore服务lag延时很大) …...
![](https://www.ngui.cc/images/no-images.jpg)
Connectionist Logic Systems and Hybrid Systems by Translation
Connectionist Logic Systems Definition: Connectionist Logic Systems (CLS) are computational models that combine elements of connectionism (neural networks) with symbolic logic. These systems aim to leverage the strengths of both paradigms—connectionism’…...
![](https://img-blog.csdnimg.cn/img_convert/7105da96754ef40f444ba46cab973ca4.jpeg)
盘点数据摆渡的8种常用方式 最推荐哪一种?
跨网数据摆渡是很多企业面临的一种传输场景,因为大部分企业为了保护核心数据,都会做不同级别的网络隔离,所以数据摆渡会涉及不同网络之间的数据传输和整合。这种情况下,数据需要从一个组织或地理位置传输到另一个组织或地理位置&a…...
![](https://i-blog.csdnimg.cn/direct/26705f1cd73043c887bd06b6ea04e07d.png#pic_center)
仿照ContentLoadingProgressBar 的特点在Android项目中自定义Loading对话框
ContentLoadingProgressBar 是 Android 中的一个控件,继承自 ProgressBar。它在 ProgressBar 的基础上添加了一些特殊功能,主要用于在加载内容时显示进度。它的一些主要特点如下: 自动隐藏和显示:ContentLoadingProgressBar 会在…...
![](https://i-blog.csdnimg.cn/direct/8de0026d4a02456da076b406aa6758af.png#pic_center)
基于数据复杂度的数据库选型
数据模型的选择对于 IT 系统的开发至关重要,它不仅决定了数据存储和处理的方式,影响系统的性能、扩展性以及维护性等。本质上来说,不同的数据模型反映了我们对业务问题的不同思考和抽象程度。 今天我们从不同数据模型对于复杂数据和关系的支…...
![](https://i-blog.csdnimg.cn/direct/7443dc7c3862454f909404fd31f0f3b5.png)
QT基础知识5
思维导图 client.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this))//给客户端实例化分配空间 {ui->setupUi(this);//初始化界面ui->msgEdit-&…...
![](https://i-blog.csdnimg.cn/direct/bc264f044a5c4de8b3ee488f47c793d6.png)
C++中vector存放内置数据类型
#include<iostream> using namespace std; #include<vector> #include<algorithm>//迭代器先理解为指针 void MyPrint(int val) {cout << val << endl; } void test01() {vector<int> v;v.push_back(1);v.push_back(2);vector<int>:…...
![](https://www.ngui.cc/images/no-images.jpg)
shell编程:安装部署前常见环境检查
脚本任务 监测主机是否联通正常 检查安装操作系统版本是否和需求一致 检查CPU是否满足规格要求 检查内存是否满足规格要求 检查数据磁盘是否满足规格要求 检查操作系统分区目录大小是否满足需求 检查集群主机时间是否一致 0.配置文件准备及脚本变量初始化 编写config.i…...
![](https://i-blog.csdnimg.cn/direct/437e38dbd5e143ae8ddb55633cb97801.png#pic_center)
思特科技:国家宝藏数字体验馆展现东方美学 让“文物活起来”
01 思特科技为“国家宝藏数字体验展”提供“数字技术”支持,带来国宝的数字化演绎。以《国家宝藏》顶级IP为基础,打造的全新沉浸文化项目“国宝数字体验展“,借由文物的视角、站在历史的星河中,探寻时间长河中不变的智慧…...
![](https://i-blog.csdnimg.cn/direct/c6e9f67f5b544777806af5f1817f742b.png)
ES6笔记总结(Xmind格式):第二天
Xmind鸟瞰图: 简单文字总结: ES6知识总结 Proxy(代理): 1.作用:实现数据的私有化处理 2.target 目标对象 handler处理函数 3.处理函数中有两个方法:get,set 4.读取数据会触发g…...
![](https://i-blog.csdnimg.cn/direct/1acf9c541efa4566b8b370a5f1b4fcaa.png)
Kotlin 流flow、ShareFlow、StateFlow、Channel的解释与使用
一、介绍 随着Android接入kotlin开发,Android之前好多模式也渐渐被kotlin替代。开发模式也在做渐进的转型,从MVC到MVP在到MVVP以及现在的MVI等。 流IO在java中和kotlin中使用率都是比较高的,场景很多。如Java的IO和NIO,再到我们现…...
![](https://img-blog.csdnimg.cn/img_convert/2d130e588380e083aec940d7003bf320.png)
【个人学习】JVM(7):方法区概述、方法区内部结构、垃圾回收等
方法区 栈、堆、方法区的交互关系 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及会话管理。 栈、堆、方法区的交互关系 下面涉及了对象的访问定位 Person 类的 .class 信息存放在方法区中person 变量存放…...
![](https://www.ngui.cc/images/no-images.jpg)
@Scheduled 定时任务自定义
简介 Scheduled 定时任务自定义可以通过SchedulingConfigurer实现。 SchedulingConfigurer 是 Spring Framework 中的一个接口,用于配置定时任务。当你需要对定时任务进行更高级别的定制时,这个接口就显得非常有用。 可以通过SchedulingConfigurer 接口…...
![](https://www.ngui.cc/images/no-images.jpg)
一种新颖的面试方式
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…...
![](https://i-blog.csdnimg.cn/direct/85c79589059f482c81c92c8bab11deaf.gif)
【Linux】生产消费模型实践 --- 基于信号量的环形队列
你送出去的每颗糖都去了该去的地方, 其实地球是圆的, 你做的好事终会回到你身上。 --- 何炅 --- 基于信号量的环形队列 1 信号量2 框架构建3 代码实现4 测试运行 1 信号量 信号量本质是一个计数器,可以在初始化时对设置资源数量…...
![](https://www.ngui.cc/images/no-images.jpg)
Science Robotics 与蜜蜂群互动的蜂窝型机器人系统
蜜蜂,如黄蜂,蚂蚁和其他社会昆虫,建立大型自组织群体,通常被解释为自我调节的“超有机体”。这些超生物是生态系统的重要稳定剂,因此被认为是“关键物种”。例如,蜜蜂群落通过觅食授粉服务的生态效应对陆地…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue 计算属性:优雅地处理数据逻辑
在 Vue.js 中,计算属性(Computed Properties)是一种非常实用的功能,它允许我们根据组件的响应式依赖进行缓存和派生状态。计算属性可以让我们以声明式的方式编写复杂的逻辑,而不必担心性能问题。 什么是计算属性&…...
![](https://www.ngui.cc/images/no-images.jpg)
C++中`union`
文章目录 C中的union什么是union?定义union示例一输出结果: 示例二修正后的代码解释输出结果结论 union的特性匿名union示例 union和struct的区别1. 内存布局2. 同时访问3. 用途 union和class的区别1. 数据成员2. 功能性3. 适用场景 在C编程中࿰…...
![](https://i-blog.csdnimg.cn/direct/661e42e64cd6404285e91748e5a5113f.png)
Linux——网络(1)
一、IPC(进程间通信方式) IPC:Inter Process Communication 共享内存(最高效的进程间通信方式) 虚拟地址 mmu(memory management unit ) 共享内存: 1.是一块,内核预留的空间 2.最高效的…...
![](https://i-blog.csdnimg.cn/direct/db163546c47448039bd7aa9c79652aaf.png)
【五】阿伟开始学Kafka
阿伟开始学Kafka 概述 人生若只如初见,阿伟心里回想起了第一次和Kafka见面的场景,记忆虽然已经有些模糊,但是感觉初次见面是美好的。积累了一些实战经验之后,阿伟感觉不能再是面对百度开发了,于是决心系统的学习一下Ka…...
![](https://www.ngui.cc/images/no-images.jpg)
Java—Arrays api
public static String toString(数组) //把数组拼接成一个字符串 public static int binarySearch(数组,查找的元素) //二分查找法查找元素 public static int[] copyOf(原数组,新数组长度) //拷贝数组 public st…...
![](https://www.ngui.cc/images/no-images.jpg)
Java - 基数排序算法介绍、应用场景和示例代码
概述 基数排序(Radix Sort)是一种非比较型整数排序算法,适用于整数或固定长度的字符串排序。它的基本思想是将待排序的元素分为多个关键字进行排序,通常从最低位(最低有效位,Least Significant Digit, LSD…...
![](https://www.ngui.cc/images/no-images.jpg)
Django 后端架构开发:文件云存储,从本地存储到腾讯COS桶集成
⭐ Django 后端架构开发:文件云存储,从本地存储到腾讯COS桶集成 目录 ☁️ 文件云存储 - 项目使用云存储💻 文件云存储 - 项目中使用本地存储📝 文件云存储 - 概述和创建项目🌐 腾讯COS桶 - 概述📚 腾讯CO…...
![](https://www.ngui.cc/images/no-images.jpg)
【系统分析师】-综合知识-计算机网络与信息安全
1、要对消息明文进行加密传送,当前通常使用的加密算法是 报文认证算法:数字摘要 RSA 非对称加密,一般不用于明文 MD5 数字摘要 SHA-1 数字摘要,160位的消息摘要 HMAC 以一个密钥和一个消息为输入,生成一个消息摘要作…...
![](https://i-blog.csdnimg.cn/direct/bc73463f22dd4865ad03dc450758d2f3.png)
C++ | Leetcode C++题解之第363题矩形区域不超过K的最大数值和
题目: 题解: class Solution { public:int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {int ans INT_MIN;int m matrix.size(), n matrix[0].size();for (int i 0; i < m; i) { // 枚举上边界vector<int> sum(…...
![](/images/no-images.jpg)
专业做物业网站的公司/aso具体优化
https://iperf.fr/Iperf 是一个网络性能测试工具。Iperf可以测试最大TCP和UDP带宽性能。Iperf具有多种参数和UDP特性,可以根据需要调整。Iperf可以报告带宽,延迟抖动和数据包丢失...转载于:https://blog.51cto.com/chenshengang/1519294...
![](https://img-blog.csdnimg.cn/20190304195154473.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3k2NDkwMTQwODE=,size_16,color_FFFFFF,t_70)
新疆生产建设兵团第二中学网站/seo门户 site
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…...
![](https://img-blog.csdnimg.cn/img_convert/bea8cc99aeb7991556e674c6cde8902f.png)
休闲零食网站建设 中企动力/杭州百度seo
为什么要远程连接Linux系统??在实际的工作场景中,虚拟机界面或物理服务器本地的窗口都是很少能够接触到的,因为服务器装完系统后,都要拉到IDC机房托管,如果是购买了云主机,更碰不到服务器本地显…...
![](/images/no-images.jpg)
网站开发毕业答辩问题/市场营销策略包括哪些策略
从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的。 今天讲一讲优先队列(priority_queue),实际上,它的本质就是一个hea…...
![](https://img-blog.csdnimg.cn/20181228093753142.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RpYW50YW5nXzE5ODY=,size_16,color_FFFFFF,t_70)
注册安全工程师报名入口官网/网络优化的流程
一、什么是微服务 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小…...
![](https://www.oschina.net/img/hot3.png)
经济与政府网站建设/寻找客户资源的网站
2019独角兽企业重金招聘Python工程师标准>>> 1.指定目录打jar包 (单模块打包) <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.1.0</version><configurat…...