数据结构(Java实现)-ArrayList与顺序表
什么是List
List是一个接口,继承自Collection。


List的使用
List是个接口,并不能直接用来实例化。
如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。
线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。
常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线
顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成
数据的增删查改

接口的实现
类的成员

打印顺序表


对上述功能进行测试


上述两个功能的测试













所有代码如下
PosOutBoundsException
public class PosOutBoundsException extends RuntimeException{public PosOutBoundsException() {}public PosOutBoundsException(String message) {super(message);}
}
SeqList
public class SeqList {private int[] elem;private int usedSize;记录当前顺序表当中 有多少个有效的数据private static final int DEFAULT_CAPACITY=2;public SeqList() {this.elem =new int[DEFAULT_CAPACITY];}//打印顺序表public void display(){for (int i = 0; i <this.usedSize; i++) {System.out.print(this.elem[i]+" ");}System.out.println();}//新增元素,默认在所有数据的结尾处添加public void add(int data){if(isFull()){resize();System.out.println("扩容成功,当前容量为"+this.elem.length);}this.elem[usedSize]=data;usedSize++;System.out.println("尾部添加元素成功");}public boolean isFull(){return usedSize== elem.length;//数组中元素的个数等于数组的长度}private void resize(){elem=Arrays.copyOf(elem,2*elem.length);//第二个参数为拷贝元素长度,如果超出原始数组的长度则补充默认值,如int型则补充0}//判断报中是否还有某个元素public boolean contain(int toFind){for (int i = 0; i <this.usedSize; i++) {if(elem[i]==toFind){return true;}}return false;}//查找某个元素对应的下标public int indexOf(int toFind){for (int i = 0; i <this.usedSize; i++) {if(elem[i]==toFind){return i;}}return -1;}//获取pos位置的数据public int get(int pos){if(!checkPos(pos)){throw new PosOutBoundsException("get 位置不合法");}return elem[pos];}private boolean checkPos(int pos){if(pos<0||pos>=usedSize){return false;}return true;}//获取顺序表的长度public int size(){return this.usedSize;}//给pos位置设置为value,为更新数据的意思public void set(int pos,int value){if(!checkPos(pos)){throw new PosOutBoundsException("set 位置不合法");}this.elem[pos]=value;}//在pos位置新增元素public void add(int pos,int data){if(pos<0||pos>this.usedSize){throw new PosOutBoundsException("add新增 位置不合法");}if(isFull()){resize();}//pos位置后的数据后移一位for (int i =this.usedSize-1; i>=pos; i--) {this.elem[i+1]=this.elem[i];}//存this.elem[pos]=data;this.usedSize++;}//删除第一次出现的数字keypublic void remove(int toRemove){if(isEmpty()){return;}int index=indexOf(toRemove);if(index==-1){return;//没有这个数字}for (int i =index; i <this.usedSize-1; i++) {this.elem[i]=this.elem[i+1];}this.usedSize--;}public boolean isEmpty(){return this.usedSize==0;}//清空顺序表public void clear(){this.usedSize=0;}
}
Test1.java
class Test35{public static void main(String[] args) {SeqList seqList=new SeqList();seqList.add(1);seqList.add(2);seqList.add(3);seqList.add(4);seqList.add(5);seqList.display();System.out.println(seqList.contain(5));System.out.println(seqList.indexOf(3));System.out.println(seqList.indexOf(7));
/* System.out.println(seqList.size());try{seqList.set(15,9);} catch (PosOutBoundsException e) {e.printStackTrace();System.out.println("我捕获到了一个异常");}*/seqList.display();seqList.add(4,890);seqList.display();seqList.remove(890);seqList.display();}
}
ArrayList简介
ArrayList是以泛型方式实现的,使用时必须要先实例化
ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

也可以使用如下创建一个对象





ArrayList的构造

ArrayList常见操作



subList方法,会改变原来对象中0位置处的数据,截取拿到的是地址

ArrayList的遍历
ArrayList 可以使用3种方式遍历:for循环+下标、foreach、使用迭代器

ArrayList的扩容机制
按照1.5倍方式扩容
如果用户需要扩容大小 超过 原空间1.5倍,按照用户所需大小扩容
ArrayList的具体使用
简单的洗牌算法











运行结果如下

全部代码
Card
public class Card {//结合成为一张牌private String suit;//花色private int rank;//大小public Card(String suit, int rank) {//构造方法this.suit = suit;this.rank = rank;}//设置和获得一张牌的花色和大小public String getSuit() {return suit;}public void setSuit(String suit) {this.suit = suit;}public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}@Overridepublic String toString() {return "【" +suit +", " + rank +'】';}
}
Test
public class Test {//设置花色,用于初始化所有牌private static final String[] SUITS={"♥","♠","♣","♦"};//初始化所有牌public static List<Card> buyCard(){List<Card> cards =new ArrayList<>();for (int i = 0; i <SUITS.length ; i++) {for (int j = 1; j <=13; j++) {Card card=new Card(SUITS[i],j );cards.add(card);}}return cards;}//洗牌 从最后一张牌开始到倒数第二张牌,随机的与前面的某一张牌交换public static void shuffle(List<Card> cards){Random random =new Random();//new了一个用于产生随机数的对象for (int i =cards.size()-1; i>0 ; i--) {int j=random.nextInt(i);//产生[0,i)之间的随机数Card temp=cards.get(i);cards.set(i,cards.get(j));cards.set(j,temp);}}public static void main(String[] args) {List<Card> cards =buyCard();System.out.println(cards);shuffle(cards);System.out.println(cards);//3个人,每个人轮流揭5张牌//每个人最后会得到5张牌,我们用hand1,hand2,hand3来存储每个人的5张牌//怎么用来表示每个人呢,这里我们用hand表示,在hand顺序表中,每个元素都是一个人//而每个人都有一个顺序表hand1(2,或者3)List<Card> hand1=new ArrayList<>();List<Card> hand2=new ArrayList<>();List<Card> hand3=new ArrayList<>();List<List<Card>> hand=new ArrayList<>();//将hand1,hand2,hand3添加到hand顺序表中hand.add(hand1);hand.add(hand2);hand.add(hand3);//发牌for (int i = 0; i <5; i++) {for (int j = 0; j <3; j++) {//拿走最上面的一张牌Card card=cards.remove(0);hand.get(j).add(card);}}System.out.println("第1个人得到的牌");System.out.println(hand1);System.out.println("第2个人得到的牌");System.out.println(hand2);System.out.println("第3个人得到的牌");System.out.println(hand3);System.out.println("剩余的牌");System.out.println(cards);}}



利用ArraryList构造出杨辉三角(采用直角三角形的样式)

同3个人玩扑克牌一样,这里我们也构造出一个二维的顺序表
用ret来存储所有的行,list用来存储每一行的元素

运行结果如下

ArrayList的问题及思考

相关文章:
数据结构(Java实现)-ArrayList与顺序表
什么是List List是一个接口,继承自Collection。 List的使用 List是个接口,并不能直接用来实例化。 如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。 线性表 线性表(lin…...
性能优化维度
CPU 首先检查 cpu,cpu 使用率要提升而不是降低。其次CPU 空闲并不一定是没事做,也有可能是锁或者外部资源瓶颈。常用top、vmstat命令查看信息。 vmstat 命令: top: 命令 IO iostat 命令: Memory free 命令: 温馨提示:…...
【C++】map的奇葩用法:和函数结合
2023年8月26日,周六下午 今天才发现map居然还能这样用... #include <iostream> #include <map> #include <functional>void printOne() {std::cout << "已经打印出1" << std::endl; }void printTwo() {std::cout <<…...
关于JVM的参数类型
JVM参数类型,主要是可以分为三类。分别是: 标准参数 例如: -help-server-client-version-showversion-cp-classpath 等等,这类参数的特点是在jdk各版本里基本不会变的,相对稳定。 X参数 X参数也就是非标准化参数&am…...
HTTP协议中的Content-Type及其常见类型
什么是Content-Type? Content-Type是HTTP协议中的一个头部字段,用于指示请求或响应中所传输的实体的媒体类型。 为什么使用Content-Type? 使用Content-Type可以告知接收方如何解析和处理传输的数据,确保数据能够正确地被解析和…...
android Junit4编写自测用例
10多年的android开发经验,一直以来呢,也没有使用过android自带的测试代码编写。说来也惭愧。今天也花了点时间稍微研究了下。还挺简单。接下来就简单的说一下。 新建工程 直接默认新建一个工程,就会有两个目录androidTest和test(unitTest)两…...
arcgis:画一幅自己城市的shp地图
首先打开ArcGis10.6,点击带黄底的小加号,添加底图。 可以选择中国地图彩色版,然后双击,转动鼠标滑轮找到属于自己的城市。 点击-目录,在新建的文件夹里右击-新建-shapefile。 格式选择折线,先把主要河流道路…...
采购油封时要考虑的因素
对于依赖机械和设备的行业来说,油封的选择是一个关键的决定,以确保平稳运行并防止流体泄漏。由于有多种选择,了解购买油封时要考虑的关键因素对于确保适合特定应用至关重要。让我们深入研究一下在此选择过程中发挥关键作用的考虑因素。 1、运…...
【无标题】科目一笔记
载人超过核定人数 校车/公路客运汽车/旅游客运汽车 未达到20%,-6超过20%以上,-12 七座以上载客汽车 1. 超过20%以上未达到50%,-6 2. 超过50%以上未达到100%,-9 其他载客汽车 1. 超过20%以上未达到50%,-3 2. 超过50…...
java八股文面试[数据结构]——HashMap和HashTable区别
HashMap源码中的重要常量 DEFAULT_INITIAL_CAPACITY: HashMap的默认容量,16 MAXIMUM_CAPACITY: HashMap的最大支持容量,2^30 TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树。 UNTREEIFY_THRESHOLD…...
乐趣无限:10款基于Pygame的经典游戏合集
引言 游戏开发一直是许多程序员和游戏爱好者追求的梦想。而Pygame作为一款功能强大的游戏开发库,为我们提供了实现各种有趣游戏的工具和接口。在本文中,我将向大家介绍10款基于Pygame的经典游戏合集,从简单的猜数字到刺激的飞机…...
php检测数组是否存在某个键,和是否存在某个变量
一、array_key_exists() array_key_exists() 是一个 PHP 内置的函数,用于判断数组中是否存在指定的键。该函数接收两个参数,第一个是键名,第二个是数组。 $arr array(name > Jack, age > 20, country > China);if (array_key_exi…...
c++中的const与constexpt的区别
c中的const与constexpr的区别 const const 是一种修饰符,用于声明一个只读的常量。它可以用于变量、函数参数和函数返回类型。声明为 const 的变量的值在初始化后就不能再改变。 适用场景: const 适用于声明运行时常量,在编译时无法确定值…...
android系统启动流程之SystemServer运行过程
SystemServer进程的启动流程:直接看代码: SystemServer是Java中的一个进程,执行入口是SystemServer.java.main(); SystemServer.java.main();-->new SystemServer().run();-->createSystemContext();//创建系统上下文:虽然SystemServe…...
Leetcode 1812。判断国际象棋棋盘中一个格子的颜色
国际棋盘问题: 给你一个坐标 coordinates ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。 如果所给格子的颜色是白色,请你返回 true,如果是黑色,请返回 false 。 给定坐标…...
9个python自动化脚本,PPT批量生成缩略图、添加图片、重命名
引言 最近一番在整理资料,之前买的PPT资源很大很多,但归类并不好,于是一番准备把这些PPT资源重新整理一下。统计了下,这些PPT资源大概有2000多个,一共30多G,一个一个手动整理这个投入产出比也太低了。 作为…...
计算机竞赛 基于大数据的社交平台数据爬虫舆情分析可视化系统
文章目录 0 前言1 课题背景2 实现效果**实现功能****可视化统计****web模块界面展示**3 LDA模型 4 情感分析方法**预处理**特征提取特征选择分类器选择实验 5 部分核心代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于大数据…...
基于Java的旅游信息推荐系统设计与实现,springboot+vue,MySQL数据库,前后端分离,完美运行,有三万字论文。
基于Java的旅游信息推荐系统设计与实现,springbootvue,MySQL数据库,前后端分离,完美运行,有三万字论文。 前台主要功能:登录注册、旅游新闻、景区信息、美食信息、旅游线路、现在留言、收藏、预定旅游线路…...
合宙Air724UG LuatOS-Air LVGL API控件--曲线 (Arc)
曲线 (Arc) 曲线控件,也可以称为弧。因为 Arc 本身就是弧,弧形的意思。根据控件的样子也能推测出它的使用场景,一般用在加载器(就是等待界面转的圈圈)或者数值显示,数值调节这些场景。曲线控件分了两个部分,前景和背…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
