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

手写ArrayList和LinkedList

项目仓库:https://gitee.com/bossDuy/hand-tear-collection-series
基于b站up生生大佬:https://www.bilibili.com/video/BV1Kp5tzGEc5/?spm_id_from=333.788.videopod.sections&vd_source=4cda4baec795c32b16ddd661bb9ce865

LinkedList

package com.yb0os1.List;import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Objects;public class MyLinkedList<E> implements List<E> {private int size;private Node<E> tail;//尾节点private Node<E> head;//头节点@Override//尾插法public void add(E element) {Node<E> node = new Node<>(tail, element, null);//尾插法if (tail != null) tail.next = node;else head = node;tail = node;++size;}@Override//对应的下标插入元素public void add(E element, int index) {//先判断index是否合法if (index < 0 || index > size) {throw new IndexOutOfBoundsException("index:" + index + "size:" + size);}//尾插if (size == index) {add(element);return;}//中间插入 先找到在那个位置插入Node<E> indexNode = findNode(index);Node<E> newNode = new Node<>(indexNode.prev, element, indexNode);if (indexNode.prev == null) {//代表indexNode是头节点head = newNode;} else {indexNode.prev.next = newNode;}indexNode.prev = newNode;++size;}private Node<E> findNode(int index) {Node<E> cur = head;while (index-- > 0) {cur = cur.next;}return cur;}@Overridepublic E remove(int index) {//先判断index是否合法if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("index:" + index + "size:" + size);}//找到要删除的节点Node<E> indexNode = findNode(index);if (indexNode.prev == null) {//头节点head = indexNode.next;} else{//非头节点indexNode.prev.next = indexNode.next;}if (indexNode.next == null) {//尾节点tail = indexNode.prev;} else {//非尾节点indexNode.next.prev = indexNode.prev;}indexNode.next = null;indexNode.prev = null;--size;return indexNode.value;}@Overridepublic boolean remove(E element) {Node<E> curNode = head;int index = 0;while (curNode != null) {if (Objects.equals(element, curNode.value)) {remove(index);return true;}++index;curNode = curNode.next;}return false;}@Overridepublic E set(E element, int index) {//先判断index是否合法if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("index:" + index + "size:" + size);}Node<E> indexNode = findNode(index);E oldValue = indexNode.value;indexNode.value = element;return oldValue;}@Overridepublic E get(int index) {//先判断index是否合法if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("index:" + index + "size:" + size);}Node<E> indexNode = findNode(index);return indexNode.value;}@Overridepublic int size() {return size;}/*** Returns an iterator over elements of type {@code T}.** @return an Iterator.*/@Overridepublic Iterator<E> iterator() {return new LinkedListIterator();}private class LinkedListIterator implements Iterator<E> {Node<E> curNode = head;@Overridepublic boolean hasNext() {return curNode!=null;}/*** Returns the next element in the iteration.** @return the next element in the iteration* @throws NoSuchElementException if the iteration has no more elements*/@Overridepublic E next() {if (curNode==null){throw new NoSuchElementException();}E value = curNode.value;curNode = curNode.next;return value;}}private class Node<E> {E value;Node<E> next;//后继Node<E> prev;//前驱public Node(E value) {this.value = value;}public Node(Node<E> prev, E value, Node<E> next) {this.value = value;this.next = next;this.prev = prev;}}
}

ArrayList

package com.yb0os1.List;import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Objects;public class MyArrayList<E> implements List<E> {private Object[] table;//默认private final static int DEFAULT_CAPACITY = 10;//默认容量private int size;//实际的大小public MyArrayList() {this.table = new Object[DEFAULT_CAPACITY];}public MyArrayList(int initialCapacity) {if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: " +initialCapacity);this.table = new Object[initialCapacity];}//插入一个元素,在size的位置插入元素 也就是尾端插入元素@Overridepublic void add(E element) {//先判断size是否等于容量,等于的话需要先扩容,不等于才可以插入if (size >= table.length) {resize();}table[size++] = element;}//在对应的index插入元素@Overridepublic void add(E element, int index) {//先判断index是否合法if (index < 0 || index > size) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}//判断是否需要扩容后if (table.length == size) {resize();}//插入逻辑,也就是在0~size的位置插入元素了 需要后移System.arraycopy(table, index, table, index + 1, size - index);table[index] = element;size++;}//删除对应下标位置的元素@Overridepublic E remove(int index) {System.out.println( "remove(int index)");//先判断index是否合法if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}E oldElement = (E) table[index];System.arraycopy(table, index + 1, table, index, size - index - 1);table[--size] = null;return oldElement;}@Overridepublic boolean remove(Object element) {System.out.println( "remove(Object element)");for (int i = 0; i < size; i++) {if (Objects.equals(element, table[i])) {remove(i);return true;}}return false;}//修改下标为index位置的元素为element@Overridepublic E set(E element, int index) {//先判断index是否合法if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}E oldElement = (E) table[index];table[index] = element;return oldElement;}@Overridepublic E get(int index) {//先判断index是否合法if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);}return (E) table[index];}@Overridepublic int size() {return this.size;}//数组扩容的逻辑private void resize() {//1.5倍扩容Object[] newTable = new Object[table.length + (table.length >> 1)];System.out.println("扩容了,原数组大小" + table.length + ",现在数组大小" + newTable.length);// 从内存的角度把一个数组元素的引用装到另外一个数组上System.arraycopy(table, 0, newTable, 0, table.length);this.table = newTable;}/*** Returns an iterator over elements of type {@code T}.** @return an Iterator.*/@Overridepublic Iterator<E> iterator() {return new ArrayIterator();}private class ArrayIterator implements Iterator<E> {int cursor = 0;//判断是否有下一个元素@Overridepublic boolean hasNext() {return cursor != size;}@Overridepublic E next() {if (!hasNext())throw new NoSuchElementException();return (E) table[cursor++];}}
}

相关文章:

手写ArrayList和LinkedList

项目仓库&#xff1a;https://gitee.com/bossDuy/hand-tear-collection-series 基于b站up生生大佬&#xff1a;https://www.bilibili.com/video/BV1Kp5tzGEc5/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 LinkedList package com…...

Android bindservice绑定服务,bindServiceAsUser补充

Android bindservice绑定服务&#xff0c;并同步返回service对象的两个方法-CSDN博客 补充反射并调用bindServiceAsUser的方法&#xff1a; private boolean initService2(final Context context){if(deviceServicenull){latch new CountDownLatch(1);HandlerThread handler…...

[蓝桥杯]交换次数

交换次数 题目描述 IT 产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯&#xff08;简称 BAT &#xff09;在某海滩进行招聘活动。 招聘部门一字排开。由于是自由抢占席位&#xff0c;三大公司的席位随机交错在一起&#xff0c;形如&#xff1a;BABTATT&#xff0c;这使…...

95套HTML高端大数据可视化大屏源码分享

概述​​ 在大数据时代&#xff0c;数据可视化已成为各行各业的重要需求。这里精心整理了95套高端HTML大数据可视化大屏源码&#xff0c;这些资源采用现代化设计风格&#xff0c;可帮助开发者快速构建专业的数据展示界面。 ​​主要内容​​ ​​1. 设计风格与特点​​ 采用…...

系统架构设计综合知识与案例分析

system-architect 软考高级-系统架构设计师-综合知识与案例分析&#xff1a;软件工程、网络工程、结构化分析方法、面向对象分析方法、软件质量数量、传统数据库、分布式数据库、系统架构等。 —— 2025 年 3 月 20 日 甲辰年二月二十一 春分 目录 system-architect1、计算机基…...

scale up 不能优化 TCP 聚合性能

scale up 作为一种系统扩展优化的方法&#xff0c;旨在提高系统组件的执行效率&#xff0c;比如替换更高性能的硬件或算法。是否可以此为依据优化 TCP 呢&#xff0c;例如通过多条路径聚合带宽实现吞吐优化(对&#xff0c;还是那个 MPTCP)&#xff0c;答案是否定的。 因为 TCP…...

Python-matplotlib库之核心对象

matplotlib库之核心对象 FigureFigure作用Figure常用属性Figure常用方法Figure对象的创建隐式创建&#xff08;通过 pyplot&#xff09;显式创建使用subplots()一次性创建 Figure 和 Axes Axes&#xff08;绘图区&#xff09;Axes创建方式Axes基本绘图功能Axes绘图的常用参数Ax…...

Linux 脚本文件编辑(vim)

1. 用户级配置文件&#xff08;~/.bashrc&#xff09; vim ~/.bashrc # 编辑 source ~/.bashrc # 让编辑生效 ~/.bashrc 文件是 Bash Shell 的配置文件&#xff0c;用于定义用户登录时的环境变量、别名、函数等设置。当你修改了 ~/.bashrc 文件后&#xff0c;通常需要重新…...

学习BI---基本操作---数据集操作

什么是数据集&#xff0c; 数据集&#xff08;Dataset&#xff09;​​ 是指从原始数据源&#xff08;如数据库、Excel、API等&#xff09;提取并经过标准化处理后的数据集合&#xff0c;通常以二维表形式存储&#xff0c;用于支撑报表、仪表盘等可视化分析。 数据集在QuickB…...

初学大模型部署以及案例应用(windows+wsl+dify+mysql+Ollama+Xinference)

大模型部署以及案例应用&#xff08;windowswsldifymysqlOllamaXinference&#xff09; 1.wsl 安装①安装wsl②测试以及更新③安装Ubuntu系统查看系统以及版本安装Ubuntu系统进入Ubuntu系统 2、docker安装①下载安装包②安装③docker配置 3、安装dify①下载dify②安装③生成.en…...

AI Agent企业级生产应用全解析

在企业级应用中&#xff0c;AI Agent 的核心是将其从一个对话模型转变为一个自主决策和执行的自动化工作流引擎。这需要一个精密的 “Agent 执行框架”&#xff08;Agent Orchestration Framework&#xff09; 来协调 LLM 的推理、外部工具的调用、记忆管理和自我反思。 AI Ag…...

RocketMQ 学习

消息队列 参考官方文档&#xff1a;https://rocketmq.apache.org/zh/docs/ 基本概念 主题&#xff08;Topic&#xff09;&#xff1a;是消息传输和消息存储的顶级容器&#xff0c;不是实际的消息容器&#xff0c;而是一个逻辑上的概念&#xff0c;用于区分不同业务消息的标识&…...

【前端】html2pdf实现用前端下载pdf

npm安装完后&#xff0c;编写代码。 <template><div id"pdf-content">需要被捕获为pdf的内容</div> </template><script> import html2pdf from html2pdf.js;export default {methods: {downloadPdf() {const element document.getE…...

Redis部署架构详解:原理、场景与最佳实践

Redis部署架构详解&#xff1a;原理、场景与最佳实践 Redis作为一种高性能的内存数据库&#xff0c;在现代应用架构中扮演着至关重要的角色。随着业务规模的扩大和系统复杂度的提升&#xff0c;选择合适的Redis部署架构变得尤为重要。本文将详细介绍Redis的各种部署架构模式&a…...

前端开发知识体系全景指南

文章目录 前言前端开发者知识体系清单一、JavaScript基础变量和类型原型和原型链作用域和闭包执行机制语法和API 二、HTML和CSSHTMLCSS手写 三、计算机基础编译原理网络协议设计模式 四、数据结构和算法JavaScript编码能力手动实现前端轮子数据结构算法 五、运行环境浏览器API浏…...

C++哈希表:unordered系列容器详解

本节目标 1.unordered系列关联式容器 2.底层结构 3.模拟实现 4.哈希的应用 5.海量数据处理面试题 unordered系列关联式容器 在c98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可以达到logN&#xff0c;即最差的情况下需要比较红…...

vue-13(延迟加载路由)

用于性能优化的延迟加载路由 延迟加载路由是优化 Vue.js 应用程序性能的关键技术&#xff0c;尤其是那些具有大量路由的应用程序。通过仅在实际需要时加载路由组件&#xff0c;您可以显著减少应用程序的初始加载时间&#xff0c;从而获得更好的用户体验。这对于网络连接速度较…...

pom.xml 文件中配置你项目中的外部 jar 包打包方式

使用 system 作用域&#xff08;不推荐&#xff0c;但简单直接&#xff09; <dependency><groupId>com.test</groupId> <!-- 可自定义&#xff0c;建议与项目相关 --><artifactId>open-sdk</artifactId> <!-- 可自定义&#xff0c;建议…...

WordPress通过简码插入bilibili视频

发布于&#xff1a;Eucalyptus-Blog 一、前言 B站是国内非常受欢迎的视频分享平台&#xff0c;上面不仅内容丰富&#xff0c;而且很多视频制作精良、趣味十足。很多人&#xff0c;比如我&#xff0c;就喜欢将B站的视频通过 iframe 嵌入到自己的网页中&#xff0c;但这段代码又…...

ZLG ZCANPro,ECU刷新,bug分享

文章目录 摘要 📋问题的起因bug分享 ✨思考&反思 🤔摘要 📋 ZCANPro想必大家都不陌生,买ZLG的CAN卡,必须要用的上位机软件。在汽车行业中,有ECU软件升级的需求,通常都通过UDS协议实现程序的更新,满足UDS升级的上位机要么自己开发,要么用CANoe或者VFlash,最近…...

黑马k8s(十七)

一&#xff1a;高级存储 1.高级存储-pv和pvc介绍 2.高级存储-pv 3.高级存储-pvc 最后一个改成5gi pvc3是没有来绑定成功的 pv3没有绑定 删除pod、和pvc&#xff0c;观察状态&#xff1a; 4.高级存储-pc和pvc的生命周期 二&#xff1a;配置存储 1.配置存储-ConfigMap 2.配…...

掌握HttpClient技术:从基础到实战(Apache)

目录 前言 一、Apache HttpClient简介 二、HttpClient基础使用 1. 添加依赖 2. 创建HttpClient实例 3. 发送GET请求 4. 发送POST请求 三、HttpClient高级配置与实战案例 1. 连接池优化 2. 超时与重试配置 3. 文件上传&#xff08;Multipart&#xff09; 总结 前言 …...

KEYSIGHT N9320B是德科技N9320B频谱分析仪

KEYSIGHT N9320B是德科技N9320B频谱分析仪 附加功能&#xff1a; 频率范围&#xff1a;9 kHz 至 3 GHz 分辨率带宽&#xff1a;10 Hz 至 1 MHz DANL&#xff1a;-130 dBm&#xff0c;-148 dBm&#xff0c;带可选前置放大器 整体幅度精度&#xff1a;<1.5 dB 最小非零扫…...

EXSI通过笔记本wifi上外网配置

我有一台服务器安装了EXSI&#xff0c;服务器IP地址配置的是192.168.137.2&#xff0c;在EXSI中创建了一个linux虚拟机&#xff0c;ip地址是192.168.137.22。现在我有一个windows笔记本&#xff0c;使用家庭的wife上外网&#xff0c;wife给自动分配了一个192.168.0.106地址&…...

Java异常处理的全面指南

Java异常处理的全面指南 一、Java异常的基础概念1.1 什么是异常1.2 异常类的层次结构 二、Java异常的处理方式2.1 try-catch块2.2 throws关键字2.3 throw关键字 三、自定义异常3.1 自定义受检异常3.2 自定义非受检异常 四、Java异常处理的最佳实践4.1 捕获合适粒度的异常4.2 避…...

sql知识梳理(超全,超详细,自用)

目录 通识 查询的基本语法 数据库&#xff08;database&#xff09;操作 表&#xff08;table&#xff09;的操作 表中列的操作 索引操作 表中行的操作 insert into语句 update语句 删除语句 select语句 表与表之间的关系 连接查询 子查询 视图 数据备份与还原 …...

[ Qt ] | QPushButton常见用法

目录 绑定键盘快捷键 前面已经说了很多用法了&#xff0c;下面主要说说绑定键盘&#xff0c;设置Icon图片。 绑定键盘快捷键 实现四个按钮&#xff0c;可以使用wsad来控制另一个按钮的上下左右的移动。 #include "widget.h" #include "ui_widget.h"Wid…...

WEB3——为什么做NFT铸造平台?

相必之前看过我的入门项目推荐关于简易NFT铸造平台的文章。会有一些疑惑 WEB3—— 简易NFT铸造平台&#xff08;ERC-721&#xff09;-入门项目推荐-CSDN博客 WEB3&#xff0c;我直接在https://nft.storage网站里上传图片不行吗&#xff0c;必须用合约铸造NFT&#xff1f; 我做…...

电脑驱动程序更新工具, 3DP Chip 中文绿色版,一键更新驱动!

介绍 3DP Chip 是一款免费的驱动程序更新工具&#xff0c;可以帮助用户快速、方便地识别和更新计算机硬件驱动程序。 驱动程序更新工具下载 https://pan.quark.cn/s/98895d47f57c 软件截图 软件特点 简单易用&#xff1a;用户界面简洁明了&#xff0c;操作方便&#xff0c;…...

【机器学习基础】机器学习入门核心:数学基础与Python科学计算库

机器学习入门核心&#xff1a;数学基础与Python科学计算库 一、核心数学基础回顾1. 函数与导数2. Taylor公式3. 概率论基础4. 统计量5. 重要定理6. 最大似然估计&#xff08;MLE&#xff09;7. 线性代数 二、Python科学计算库精要1. NumPy&#xff1a;数值计算核心2. SciPy&…...