Java中ArrayList与顺序表的定义与实现方法
作者:即将秃头的菜鸟 发布时间:2022-06-08 03:27:12
1、线性表
定义
线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
常见的线性表:顺序表、链表、栈、队列...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
特征
集合中必存在唯一的一个“第一元素”。
集合中必存在唯一的一个 “最后元素” 。
除最后一个元素之外,均有唯一的后继(后件)。
除第一个元素之外,均有唯一的前驱(前件)。
2、顺序表
定义
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
实现
首先我们需要创建一个数组来存放数据。
备注:因为我为了方便就先创建的整形数组,为了能更好的适应各种类型,大家可以创建泛型的数组,我这里就没写了。
接下来就是对顺序表的各种操作。例如:基本的CURD,打印顺序表,获取顺序表长度,清空顺序表等等。
打印数组
因为是数组,所以直接遍历数组打印就好了
新增元素
增加元素的时候需要考虑到数组是否满状态的问题,所以我们需要判断,要死数组空间已满,我们还需要进行扩容。另外,我们还需要判断在这个pos位置是否合法。
判断空间是否已满方法
这里我们简化代码为:
如果要扩容的话,在扩容完成之后,因为顺序表是连续的结构,所以在pos位置新增元素的话,那么pos位置之后的元素就要依次往后挪。这样才能把元素新增进去。
注意:在扩容之后我们需要更改CAPACITY和usedSize的大小。
判断是否包含某个元素
在这我们需要考虑到此时数组是否为空的情况。
之后还是直接遍历数组的操作。
查找元素
在这里也需要一次判空操作。
获取pos位置的元素
这里可能会出现数组为空的情况和pos不合法的情况,所以需要判断。
我这里是手动抛出的异常,没有另外写了。
更改pos位置的值
删除操作
删除某个位置上的元素,这里是直接从这个元素开始,让其后面的元素覆盖掉他前一个元素,以达到删除的目的。
获取顺序表长度
清空顺序表
后面这几个操作比较简单就不多叙述了。
3、ArrayList
简介:
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:
[说明]
ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问。
ArrayList实现了Cloneable接口,表明ArrayList是可以clone的。
ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。
和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList。
ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。
使用
public static void main(String[] args) {
// ArrayList创建,推荐写法
// 构造一个空的列表
List<Integer> list1 = new ArrayList<>();
// 构造一个具有10个容量的列表
List<Integer> list2 = new ArrayList<>(10);
list2.add(1);
list2.add(2);
list2.add(3);
// list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素
// list3构造好之后,与list中的元素一致
ArrayList<Integer> list3 = new ArrayList<>(list2);
// 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难
List list4 = new ArrayList();
list4.add("111");
list4.add(100);
}
一些常见方法
方法 | 解释 |
boolean add(E e) | 尾插e |
void add(int index, E element) | 将 e 插入到 index 位置 |
boolean addAll(Collection<? extends E> c) | 将集合 c 中的元素 尾插到该集合中 |
E remove(int index) | 删除 index 位置元素并返回 |
boolean remove(Object o) | 删除遇到的第一个 o |
E get(int index) | 获取下标 index 位置元素 |
E set(int index, E element) | 将下标 index 位置元素设置为 element |
void clear() | 清空顺序表 |
boolean contains(Object o) | 判断 o 是否在线性表中 |
int indexOf(Object o) | 返回第一个 o 所在下标 |
int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
List< E > subList(int fromIndex, int toIndex) | 截取部分 list |
ArrayList的遍历
循环遍历
foreach遍历
迭代器
System.out.println("======迭代器1=========");
ElementObservableListDecorator<Object> list;
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("======迭代器2=========");
ListIterator<String> it2 = list.listIterator();
while (it2.hasNext()) {
System.out.println(it2.next());
}
顺序表和数组的区别:
上面说,顺序表的底层可以理解为一个数组,但是相比于数组,更加的高级。
顺序表可以自己扩容;
顺序表严格区分数组容量和元素的个数。
所以数组其实就是一种不完备的顺序表。
顺序表中的注意点:
我们需要区分顺序表中的两个概念:容量(capacity)和元素个数(size)。
容量可以理解为数组的大小(长度),元素个数是size中记录的有效元素个数。
顺序表中,数据的存储是需要连续的,不可以元素和元素之间存在“空隙”,当进行插入、删除等操作时,操作完成后,也要保证顺序表的连续。
来源:https://blog.csdn.net/qq_52592775/article/details/125608435


猜你喜欢
- 主要介绍Android中如何使用rotate实现图片不停旋转的效果。Android 平台提供了两类动画,一类是 Tween 动画,即通过对场
- 前言之前做的几个微信小程序项目,大部分客户都有要在微信小程序前端提现的需求。提现功能的实现,自然使用企业付款接口,不过这个功能开通比较麻烦,
- 命令模式命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳
- 自定义类:using System;using System.Collections.Generic;using System.Linq;u
- 简介前提条件:确保本机已经安装 VS Code。确保本机已安装 SSH client, 并且确保远程主机已安装 SSH server。VSC
- 前言 前几天有在微博上推荐过一个博客,看他文章时发现了这个属性。有些属性不常用,但需要的时候非常有用,于是做了个例子,正好项目用到
- android开发中有时候碰到切换语言的需求,这时候需要通过代码动态改变当前运行语言。package com.example.android
- 方法一:Hashtable ht = new Hashtable();  
- ActivityManager.RunningAppProcessInfo类与获取正在运行的应用程序每一个应用程序都会运行在它独立的进程里,
- 使用字典存储事件实例accessor-declarations 的一种用法是公开很多事件但不为每个事件分配字段,而是使用字典来存储这些事件实
- 作者:精致码农出处:http://cnblogs.com/willick联系:liam.wang@live.com最近工作中遇到一个这样的需
- 前言此节假日为严格按照国家要求的双休和法定节假日并且包含节假日的补班信息,大家可根据自己的需求自定义处理哦。以下为Maven配置,是程序用到
- Maven的安装安装Maven之前要确保已经安装好了jdk,并且配置好了环境变量JAVA_HOME。具体安装步骤如下:1. 从ap
- 1 安装 Unity安装Unity Hub安装 Unity 推荐使用 Unity Hub 管理程序(官方管理程序)。Unity Hub 是一
- 利用redis进行springSession的存储:存储:// 在session中保存用户信息 H
- JAVA枚举,比你想象中还要有用!我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值。在编译时确定类型可以具有什么值的能力是一种强
- 1.前言在java当中,若是进行比较,大家可能第一时间想到,==或是!=,这种数学上的比较符>、接下来,我就分别介绍并演示
- 我们使用Spring整合Quartz开发,本实例采用数据库模式的demo。xml文件配置如下:<?xml version="
- BeanPostProcessor 的接口定义,可以实现提供自己的实例化逻辑,依赖解析逻辑等,也可以以后在Spring容器实例化完毕,配置和
- ByteArrayInputStream介绍ByteArrayInputStream 是字节数组输入流。它继承于 InputStream。I