news 2026/10/26 10:24:07

《Java数据结构》第一讲:顺序表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《Java数据结构》第一讲:顺序表

一、顺序表(ArrayList)

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。

1. List

1.1 List的定义

List 是一个接口

2. 顺序表的结构

1.1 顺序表是一个类,实现了 List 接口

1.2 java系统中实现了顺序表的构造,如若需要使用提供的方法,可以直接调用系统的方法。

3. 自定义一个顺序表

publicclassSeqList{privateint[]data;// 构建一个数组,存储元素publicintsize=0;// 表示数组的有效长度// 构造方法publicSeqList(){data=newint[1024];}// 在尾部添加元素: 时间复杂度为 O(1)publicvoidadd(intvalue){//1. 判断数组容量是否够if(size>=data.length){realloc();//对数组扩容}data[size]=value;size++;}publicvoidrealloc(){//1.创建一个新的变量int[]newData=newint[data.length*2];for(inti=0;i<size;i++){newData[i]=data[i];}data=newData;}// 中间位置添加元素: 时间复杂度为 O(N)publicvoidadd(intindex,intvalue){//1. 判断数组容量是否够if(size>=data.length){realloc();}//2. 把要添加的位置元素依次往后挪一格for(inti=size-1;i>=index;i--){data[i+1]=data[i];}//3. 直接在该位置上添加新元素data[index]=value;size++;}// 判断元素是否存在: 时间复杂度为 O(N)publicbooleancontains(intvalue){for(inti=0;i<size;i++){if(data[i]==value){returntrue;}}returnfalse;}// 找到元素在顺序表的位置: 时间复杂度为 O(N)publicintindexOf(intvalue){for(inti=0;i<size;i++){if(data[i]==value){returni;}}return-1;}// 按照位置删除元素: 时间复杂度为 O(N)publicvoidremove(intindex){//1. 判断 index 是否合法if(index<0||index>=size){thrownewRuntimeException("索引越界");}//2. 将该位置之后的元素都往前挪一格for(inti=index;i<size-1;i++){data[i]=data[i+1];}size--;}// 按照值删除元素:时间复杂度为 O(N)publicvoidremoveByValue(intvalue){//1.遍历数组,找到该值的下标位置intindex=indexOf(value);//2. 如果不存在,直接返回if(index==-1){return;}//3. 调用上面的 根据位置删除元素 的方法remove(index);}//get方法: 时间复杂度为 O(1)publicintget(intindex){if(index<0||index>=size){thrownewRuntimeException("索引越界");}returndata[index];}// set 方法: 时间复杂度为 O(1)publicintset(intindex,intvalue){returndata[index]=value;}

4. ArrayList 的使用方式

(1) ArrayList是以泛型方式实现的,使用时必须先实例化
ArrayList<E>list=newArrayList<>();
(2)ArrayList 实现了 Clonable 接口,表明 ArrayList 是可以 clone(浅拷贝) 的
importjava.util.ArrayList;classUser{Stringname;publicUser(Stringname){this.name=name;}}publicclassDemo{publicstaticvoidmain(String[]args){ArrayList<User>list1=newArrayList<>();list1.add(newUser("张三"));list1.add(newUser("李四"));ArrayList<User>list2=(ArrayList<User>)list1.clone();System.out.println(list1==list2);//false 原因是:ArrayList 的 clone 是浅拷贝System.out.println(list1.get(0)==list2.get(0));//true 原因是: 元素引用时同一个list1.get(0).name="改名了";System.out.println(list2.get(0).name);// 改名了}}
(3)ArrayList 底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

5. ArrayList的应用场景

5.1 构造一副牌

importjava.util.ArrayList;importjava.util.List;importjava.util.Random;classCard{privateStringrank;//点数privateStringsuit;//花色publicStringgetRank(){returnrank;}publicvoidsetRank(Stringrank){this.rank=rank;}publicStringgetSuit(){returnsuit;}publicvoidsetSuit(Stringsuit){this.suit=suit;}@OverridepublicStringtoString(){returnsuit+rank;}}publicclassCardDemo{privatestaticList<Card>buyCards(){List<Card>cards=newArrayList<>();String[]suits={"♠️","♥️","♣️","♦️"};for(inti=0;i<suits.length;i++){for(intj=2;j<=10;j++){Cardcard=newCard();card.setSuit(suits[i]);card.setRank(j+"");cards.add(card);}CardcardJ=newCard();cardJ.setSuit(suits[i]);cardJ.setRank("J");CardcardQ=newCard();cardQ.setSuit(suits[i]);cardQ.setRank("Q");CardcardK=newCard();cardK.setSuit(suits[i]);cardK.setRank("K");CardcardA=newCard();cardA.setSuit(suits[i]);cardA.setRank("A");cards.add(cardJ);cards.add(cardQ);cards.add(cardK);cards.add(cardA);}returncards;}// 洗牌privatestaticvoidshuffle(List<Card>cards){Randomrandom=newRandom();for(inti=cards.size()-1;i>0;i--){intr=random.nextInt(i);Cardtemp=cards.get(r);cards.set(r,cards.get(i));cards.set(i,temp);}}publicstaticvoidmain(String[]args){List<Card>cards=buyCards();//System.out.println(cards);shuffle(cards);//System.out.println(cards);// 发牌List<Card>player1=newArrayList<>();List<Card>player2=newArrayList<>();List<Card>player3=newArrayList<>();List<List<Card>>players=newArrayList<>();players.add(player1);players.add(player2);players.add(player3);for(inti=0;i<5;i++){for(intj=0;j<players.size();j++){Cardcard=cards.remove(0);players.get(j).add(card);}}for(inti=0;i<players.size();i++){System.out.println("玩家"+(i+1)+""+":"+players.get(i));}}}

5.2 杨辉三角

importjava.util.ArrayList;importjava.util.List;publicclassyangHUi{publicList<List<Integer>>generate(intnumRows){List<List<Integer>>ret=newArrayList<>();for(introwIndex=0;rowIndex<numRows;rowIndex++){List<Integer>row=newArrayList<>();for(intcolIndex=0;colIndex<rowIndex+1;colIndex++){if(colIndex==0||colIndex==rowIndex){row.add(1);}else{List<Integer>prevRow=ret.get(rowIndex-1);intvalue1=prevRow.get(colIndex-1);intvalue2=prevRow.get(colIndex);row.add(value1+value2);}}ret.add(row);}returnret;}publicstaticvoidmain(String[]args){yangHUi y=newyangHUi();List<List<Integer>>ret=y.generate(5);System.out.println(ret);}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 10:23:44

Java 项目实战: 交友项目 - 圈子功能实现:总结

概述 圈子这一章把「发一条动态」背后的一整套存储设计摊开了&#xff1a;MongoDB 存详情、时间线表做收件箱、Redis 存推荐列表&#xff0c;三套存储各管一段。这里做全章复盘&#xff0c;知识地图、五个可复用的架构套路、十二个实测踩过的坑、自检清单和四个动手练习&#…

作者头像 李华
网站建设 2026/10/26 10:23:08

初识C语言——C语言常见概念

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、在VS2022上写代码1.创建项目2.运行程序二、main函数三、printf和库函数四、关键字五、字符和ASCII编码1.需要掌握的&#xff1a;2.打印一个字符的方法&#xff1…

作者头像 李华
网站建设 2026/10/26 10:22:50

SKILL全详解:从SKILL.md到scripts与references的Agent能力拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/26 10:22:33

给园区系统接问数平台,我们复盘了 6 个真实坑

园区日常跑着一套智慧园区系统&#xff0c;招商、合同、账单、工单都在上面发生&#xff0c;数据自然沉淀下来。后来我们接了数智安全问数平台&#xff0c;让它用大白话问这些已经存在的经营数据&#xff0c;返回结论、图表、明细和来源。这两套东西分工清楚。智慧园区系统管业…

作者头像 李华
网站建设 2026/10/26 10:21:39

Jev 决策模型

摘要 Jev 是 TypeSafe AI 于 2026 年 9 月发布的首个「System One 模型」。它刻意不做大语言模型&#xff08;LLM&#xff09;做的事——不生成自然语言文本&#xff0c;而是接收一份程序状态和若干预定义的问题&#xff0c;返回带校准概率的类型化决策&#xff0c;让软件可以…

作者头像 李华
网站建设 2026/10/26 10:20:16

2026年广东安全员A证考试题库+答案+解析

2026年安全员ABC证考试精准题库⬆️⬆️⬆️ 点击上方卡片立即获取⬆️⬆️⬆️ 考点练习题型练习易错题模拟考错题集收藏夹2026年广东建筑安全员A证考试真题题库 题库来源&#xff1a;安教安全员通关宝1.&#xff08;单选&#xff09;根据《建筑起重机械安全监督管理规定》&am…

作者头像 李华