ArrayList和顺序表

目录

线性表

顺序表

实现顺序表:

1,添加元素的时候我们要判断是否需要扩容

2,写异常

3,数组清空

ArrayList:

ArrayList的构造方法:

ArrayList的add方法:

ArrayList的subList

知识点补充:数据结构中常见的接口关系图

ArrayList的打印

二维数组:


线性表

就是n个相同类型的数据有序排列;常见的有:顺序表,链表。栈,队列等

顺序表

实现顺序表:

为了更好的掌握ArrayList我们先来定义一个顺序表和接口,用顺序表这个类去实现接口,并重写接口中的所有方法;大家先来自己思考实现。顺序表最基础的两个属性就是数组和有效数组元素的大小

所需要实现的方法:

 // 新增元素,默认在数组最后新增public void add(int data);// 在 pos 位置新增元素public void add(int pos, int data);// 判定是否包含某个元素public boolean contains(int toFind);// 查找某个元素对应的位置public int indexOf(int toFind);// 获取 pos 位置的元素public int get(int pos);// 给 pos 位置的元素设为 valuepublic void set(int pos, int value);//删除第一次出现的关键字keypublic void remove(int toRemove);// 获取顺序表长度public int size();// 清空顺序表public void clear() ;// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的public void display() ;

重写方法的代码:(由于代码较长,博主觉得不适合全部放在这里,因为后面学习二叉树等时候代码会更长,但出于详细,才放这里,后面可能不放了(可以看gitee),所以路过的小伙伴可以给博主提建议(放还是不放))

import java.util.Arrays;public class MyArray implements IExcese{public int[] array = {};public int size = 0;public static final int INIT_SIZE = 5;@Override//要判断给出的下标是否合理所以我们要来抛出异常public void add(int data) {array = capitalArray();array[size] = data;size++;}@Override//注意增加的元素不能隔空增加,比如3没有添加元素就直接在4下标添加,add可以理解为插入public void add(int pos, int data) {array = capitalArray();if(pos<size && pos>=0) {int mark = data;for(int i = size - 1;i>pos;i--) {array[i] = array[i - 1];}array[pos] = data;size++;}else {throw new DataOverException("数组下标不符合规范");}}@Overridepublic boolean contains(int toFind) {for(int i = 0; i<size;i++) {if(array[i] == toFind) {System.out.println("下标位置为:" + i);return true;}return false;}return false;}@Overridepublic int indexOf(int toFind) {for (int i = 0; i < size; i++) {if (array[i] == toFind) {return i;}}return -1;}@Overridepublic int get(int pos) {if(pos<0 ||pos>=size) {throw new DataOverException("下表不合理");}else{return array[pos];}}@Overridepublic void set(int pos, int value) {if(pos<0 ||pos>=size) {throw new DataOverException("下表不合理");}else{array[pos]  = value;}}@Overridepublic void remove(int toRemove) {int mark = 0;int i;for(i =0;i<size;i++) {if(array[i] == toRemove) {mark = 1;}}if(mark ==1) {for (int j = i; j < size-1; j++) {array[i] = array[i+1];}size--;}else{System.out.println("没有该元素");}}@Overridepublic int size() {return size;}@Overridepublic void clear() {for (int i =0 ;i<size;i++) {array[i] = null;}size = 0;}@Overridepublic void display() {for(int i = 0;i < size; i++) {System.out.println(array[i]);}}@Overridepublic String toString() {return "MyArray{" +"array=" + Arrays.toString(array) +", size=" + size +'}';}private int[] capitalArray() {if (size == 0 ) {return new int[INIT_SIZE];}else if(size == array.length) {int newSize = size + 5;//扩容数组,返回一个新数组array = Arrays.copyOf(array,newSize);return array;} else {return array;}}
}

大部分代码都比较为简单,我们挑几个来说就行;

1,添加元素的时候我们要判断是否需要扩容

扩容需要的方法Arrays.copyOf(),填两个参数,原数组和需要扩容元素的个数,返回的是原数组类型;

同时在指定位置添加的时候,要将元素后移;还要判断数组下标是否合理,不能小于0也不能大于等于size;

2,写异常

当下标不符合要求的时候我们可以写异常来抛出

3,数组清空

防止资源浪费我们要清空数组,由于数组是引用类型,所以我们清空的时候要将数组赋值为null

ArrayList:

ArrayList就类似数组,但为什么还有创建这个类,是因为当我们需要知道并运用这个数组的有效存储元素时,数组是无法满足的(比如数组整体有五个元素的大小,但实际上只存储了三个元素),而且ArrayList当中有很多方法可以使用;

同时ArrayList是泛型类,意味着你可以定义任意类型的数组

ArrayList的方法:

ArrayList方法的使用就和咱们实现的顺序表差不多,要想更加了解这个类当我们就要看其源码(最开始看源码是一件比较痛苦的事,但是我们必须要学会去了解以及深刨,而且上面顺序表的实现也很重要为了更好理解源码)

ArrayList的构造方法:

ArrayList有三个构造方法

1,带一个参数:

2 不带参数

这些字段均是ArrayList的属性

不带参数的时候创建一个空数组;此时没有给数组分配空间(使用add会分配);

3 参数为数组:

我们来解释一下这个参数是什么意思:
c是变量名,Collection要求传入的参数必须是Collection类型或者其子类,<? extends E>中?是通配符的意思,意思是传入的参数还必须是E或者E的子类,而E又指的是,泛型中传入的类型;

我们通过代码来更好地理解一下:其中<>中传入的类型就代表E,()中传入的数组就代表?;ArrayList是Collection的子类,所以arrayList满足第一个条件,arrayList中的元素均是String类型的,所以当传入参数的元素类型是String或者其子类的时候就可以编译成功;而第三行的E是Integer类型,String不是Integer的子类因此编译失败

ArrayList的add方法:

这是add的源码,其中调用的字段都在上张图有显示所以可以对照来看;

整个代码的思路是:

1 是否初始化,如果没有那么返回一个大小为10的数组;

2 如果初始化那么判断数组是否需要扩容,如果不需要那么返回原数组;如果需要那么进行扩容,在最后一步中判断是否扩容后数组元素是否超过了int的最大值,如果没有,那么扩容成功

3 每次扩容的时候会扩大1,5倍,x>>1,x这个值向右移1相当于除以2;

ArrayList的subList

传入两个参数,第一个是数组的起始下标,第二个是终点下标(左闭右开),相当于字符串的截取。但与字符串不同的是,字符串的改变是产生新的对象,但是subList截取后的数组和原数组指向的是同一个对象,因此改变其中一个数组的值另一个数组也会改变。

subList的返回类型是List,List是ArrayList的实现接口;

知识点补充:数据结构中常见的接口关系图

ArrayList的打印

1 重写toString后可以通过sout传入对象打印

2用for打印;

3用foreach这里包装类类型可以用基础类型接收,因为会自动拆包

4 迭代器,这里有个印象就行

二维数组:

ArrayList<ArrayList<Integer>>or<List<List<Integer>>>是二维数组,ArrayList的每个元素都是ArrayList<Integer>类型;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/228003.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark---SparkCore(三)

一、Spark广播变量和累加器 1、广播变量 1&#xff09;、广播变量理解图 2&#xff09;、广播变量使用 val conf new SparkConf() conf.setMaster("local").setAppName("brocast") val sc new SparkContext(conf) val broadCast sc.broadcast(list) …

js相同字符串截取拼接

原数据 const list [999-1234567801,999-1234567802,999-1234567803, ]; const list1 [999-1234567899,999-1234567900,999-1234567901, ];期望数据 999-1234567801/2/3 //list 999-1234567899/900/901 //list1处理代码 // 连续号码处理 export const formatNumber (tick…

ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 概述 前述博客讲解了 Web 编程的基本知识&#xff0c;包括 HTML、CSS、JavaScript 三个部分&#xff0c;从这节开始&#xff0c;我们进入实战部分&#xff0c;在实际项目中进一步学习 ESP32-Web 编程。 GPIO &#xff08…

【沁恒蓝牙mesh】CH58x 将RTC时钟切换为LSE外部低速时钟

本文主要记录了【沁恒蓝牙mesh】CH58x 如何将RTC时钟切换为外部时钟 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xff1a;欢迎访问我的 Ethernet_Comm 博客主页&#x1f525;&#x1f389;…

UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)

文章目录 1.实现目标2.实现过程2.1 数据与预处理2.2 GeoJson解析2.3 Mesh构建与属性存储2.4 核心代码2.5 材质2.6 蓝图应用测试3.参考资料1.实现目标 在之前的文章中,基于GeoJson数据加载,实现了绘制单面功能,但只支持单个要素Feature。本文这里实现对Geojson内所有面要素的…

基于可微分渲染器的相机位置优化【PyTorch3D】

在这个教程中&#xff0c;我们将使用可微渲染学习给定参考图像的相机的 [x, y, z] 位置。 我们将首先使用相机的起始位置初始化渲染器。 然后&#xff0c;我们将使用它来生成图像&#xff0c;使用参考图像计算损失&#xff0c;最后通过整个管道进行反向传播以更新相机的位置。…

【TC3xx芯片】TC3xx芯片的Clock System功能详解

目录 前言 正文 1.时钟源 1.1 有源晶振和无源晶振 1.1.1 无源晶振 1.1.2 有源晶振 1.1.3 有源晶振和无源晶振的区别 1.1 振荡器电路&#xff08;OSC&#xff09; 1.1.1外部输入时钟模式 1.1.2 外部晶体 / 陶瓷谐振器模式 1.1.3 OSC控制寄存器 1.1.4 配置OSC 1.1.5…

Java高级技术(单元测试)

一&#xff0c;概括 二&#xff0c;junit 三&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;实验类 package com.bilibili;public class Name {public static void main(String name) {if (name null){System.out.println("0");return;}System.out.print…

Flink-执行拓扑图与作业调度

算子与作业提交 一、Flink执行模式1.流执行模式2.批执行模式 二、Flink拓扑图1.基本概念2.拓扑图生成过程 三、拓扑生成和优化1.应用程序2.逻辑视图3.算子链4.Task Slots 四、作业调度1.调度2.拓扑图数据结构3.Job状态转化4.Task状态转化 总结参考链接 一、Flink执行模式 Flin…

基于SSM的社区团购系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

微服务实战系列之Cache

前言 欢迎来到Cache&#xff08;缓存&#xff09;的世界&#xff01; 自从世界第一台计算机诞生之日起&#xff0c;人们对效率的渴望逐步增强。从CPU到存储&#xff0c;从芯片到内存&#xff0c;一批又一批的先驱以一种孜孜不倦的“工匠”精神&#xff0c;为计算机运行效率的提…

分子骨架跃迁工具-DiffHopp 评测

一、文章背景介绍 DiffHopp模型发表在ICML 2023 Workshop on Computational Biology&#xff08;简称&#xff1a;2023 ICML-WCB&#xff09;上的文章。第一作者是剑桥计算机系的Jos Torge。 DiffHopp是一个专门针对骨架跃迁任务而训练的E3等变条件扩散模型。此外&#xff0c;…