(java实现)顺序表-ArrayList
什么是顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。
在使用顺序表存储数据前,会先申请一段连续的内存空间(即数组),然后把数组依次存入内存,中间没有一点空隙。

基本操作
每个数据结构都有集合对数据处理的方法,这能让我们更方便的使用保存在数据结构中的数据。顺序表的基本操作有:增(add),删(remove),改(set),查(find),插(insert)等。
在这里我们只详细讲解remove 和 insert 操作,其他实现可看下面的源码。
顺序表删除元素
从顺序表中删除指定元素,实现起来非常简单,只需找到目标元素,并将其后续所有元素整体前移 1 个位置即可。
后续元素整体前移一个位置,会直接将目标元素删除,可间接实现删除元素的目的。
例如:从顺序表{1,2,3,4,5}中删除元素3的过程如下

时间复杂度分析:从顺序表中删除元素,最好的情况是删除的元素刚好是最后一个元素,这时候不需要移动元素,只需要把顺序表的size-1即可,时间复杂度是O(1)。最坏的情况是删除的元素刚好是第一个元素,这个时候就需要后面的元素全部向前移动一位,同时size-1,时间复杂度是O(N)。我们分析时间复杂度的原则是分析最坏情况,这样才有意义。因此删除操作的时间复杂度为O(N)。
顺序表插入元素
向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况:
- 插入到顺序表的表头;
- 在表的中间位置插入元素;
- 尾随顺序表中已有元素,作为顺序表中的最后一个元素;
虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,即:通过遍历,找到数据元素要插入的位置,然后做如下两步工作:
- 将要插入位置元素以及后续的元素整体向后移动一个位置;
- 将元素放到腾出来的位置上;
例如,在 {1,2,3,4,5} 的第 3 个位置上插入元素 6,实现过程如下:



时间复杂度分析同删除元素一样,均为O(N).
顺序表的优劣和应用情形
优势
- 因为数据在数组中按顺序存储,可以通过数组下标直接访问,因此顺序表查找定位元素很快
劣势
- 插入和删除元素需要大量的操作
- 因为数组在声明时需要确定长度,因此顺序表的长度是确定的。若需要扩大顺序表长度,有需要大量的操作,不够灵活。(将该数组copy到另外一个数组)
- 由于数据大小的不可测性,有时会浪费掉大量的空间
应用情形
- 总而言之,顺序表适用于那些不需要对数据进行大量改动的结构
源码实现(java)
public class MyArrayList<AnyType> {
public int AMOUNT=10;//初始长度
public static int index;//表位置
AnyType[] myList;
public MyArrayList(){
initList();
}
//初始化顺序表
public void initList(){
myList=(AnyType[])new Object[AMOUNT];
index=0;
}
//判断顺序表是否为空
public boolean listEmpty(){
if(index==0){
return true;
}
return true;
}
//清空顺序表
public boolean clearList(){
myList=null;
index=0;
return true;
}
//返回i位置的元素
public AnyType get(int i){
if(i<0||i>=index){
throw new ArrayIndexOutOfBoundsException();
}
return myList[i];
}
//在i位置加入元素,即插入操作,这里我没有用insert命名
public void add(int i,AnyType a){
if(i<0||i>index){
throw new ArrayIndexOutOfBoundsException();
}
if (i==index){
largeList();
}
for(int k=index;k>i;k--){
myList[k]=myList[k-1];
}
myList[i]=a;
index++;
}
//在结尾增添元素a
public void add(AnyType a){
add(index,a);
}
//为i位置元素重新赋值
public AnyType set(AnyType a,int i){
if(i<0||i>=index){
throw new ArrayIndexOutOfBoundsException();
}
AnyType old=myList[i];
myList[i]=a;
return old;
}
//打印遍历顺序表
public void print(){
String s="[";
for(int i=0;i<index;i++){
s=s+myList[i];
s=s+" ,";
}
System.out.println(s);
}
//查找a元素是否在表中,返回位置,没有返回0
public int locateElem(AnyType a){
for(int i=0;i<index;i++){
if(a==myList[i]){
return i+1;
}
}
return 0;
}
//返回表长
public int length(){
return index;
}
//删除i位置元素
public AnyType delete(int i){
if(i<0||i>=index){
throw new ArrayIndexOutOfBoundsException();
}
AnyType old=myList[i];
for(int k=i;k<index;k++){
myList[k]=myList[k+1];
}
index--;
return old;
}
//扩大表的最大长度
public void largeList(){
AnyType[] newList=(AnyType[])new Object[2*length()+1];
for(int i=0;i<index;i++){
newList[i]=myList[i];
}
myList=newList;
}
}
(java实现)顺序表-ArrayList的更多相关文章
- java实现顺序表、链表、栈 (x)->{持续更新}
1.java实现节点 /** * 节点 * @luminous-xin * @param <T> */ public class Node<T> { T data; Node& ...
- 数据结构之线性顺序表ArrayList(Java实现)
一.ListMe接口: import java.util.ArrayList; //实现线性表(顺序表和链表)的接口://提供add get isEmpty size 功能public interfa ...
- Java数据结构-线性表之顺序表ArrayList
线性表的顺序存储结构.也称为顺序表.指用一段连续的存储单元依次存储线性表中的数据元素. 依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表. package com ...
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- Java实现顺序表
利用顺序存储结构表示的顺序表称为顺序表. 它用一组连续的地址存储单元一次存放线性表中的数据元素. 顺序表的实现是数据结构中最简单的一种. 由于代码中已经有详细注释,代码外不再阐述. 下次再陈上关于顺序 ...
- 三 模拟实现顺序表ArrayList
/** * 顺序表,重点是数组动态扩容,插入 * 底层采用数组,长度可以动态变化,此处采用增长一倍 * java.util.ArrayList每次增长50% * int newCapacity = ...
- 数据结构——Java实现顺序表
一.分析 什么是顺序表?顺序表是指用一组地址连续的存储单元依次存储各个元素,使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表.一个标准的顺序表需要实现以下基本操作: 1.初始化顺序表 ...
- Java数据结构——顺序表
一个线性表是由n(n≥0)个数据元素所构成的有限序列. 线性表逻辑地表示为:(a0,a1,…,an-1).其中,n为线性表的长度,n=0时为空表.i为ai在线性表中的位序号. 存储结构:1.顺序存储, ...
- Java算法 -- 顺序表
顺序表结构定义:就是按照顺序存储方式存储的线性表 1.定义一个顺序表的基本数据: static final int MAXLEN = 100; Class Student{ private Strin ...
随机推荐
- 区间K大数
区间K大数 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m, ...
- Python之变量、常量以及注释
Python之变量.常量以及注释 一.什么是变量 变量,是用于在内存中存放程序数据的容器,怎么理解呢? 计算机的最核心的功能j就是"计算",计算需要数据源,数据源存在在内存里,比如 ...
- 计时器(CocosCreator)
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 在游戏中,经常会涉及到计时的功能,主要是倒计时.倒计时通常用在某项活动距离结束的剩余时间以及距离开始某项活动开始的时 ...
- svn checkout 单个文件
$ svn co --depth=empty file:///usr/local/svn/calc calc_new $ cd calc_new $ svn up readme.txt 其中,calc ...
- 多线程编程学习六(Java 中的阻塞队列).
介绍 阻塞队列(BlockingQueue)是指当队列满时,队列会阻塞插入元素的线程,直到队列不满:当队列空时,队列会阻塞获得元素的线程,直到队列变非空.阻塞队列就是生产者用来存放元素.消费者用来获取 ...
- NLP(二十三)使用LSTM进行语言建模以预测最优词
N元模型 预测要输入的连续词,比如 如果抽取两个连续的词汇,则称之为二元模型 准备工作 数据集使用 Alice in Wonderland 将初始数据提取N-grams import nltk imp ...
- python编写排列组合,密码生产功能
python编写排列组合 python在编写排列组合是会用到 itertools 模块 排列 import itertools mylist = list(itertools.permutation ...
- hdu 1028 Ignatius and the Princess III 母函数
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- 在javascript中的浏览器兼容问题以及兼容浏览器汇总(默认事件,阻止冒泡,事件监听。。。)以及解决方式详解
在javascript中常见的浏览器兼容问题,以及解决方式. 在前端工作当中我们遵循这样的原则:渐进增强和优雅降级 渐进增强(progressive enhancement): 针对低版本浏览器进 ...
- Mysql InnoDB引擎下 事务的隔离级别
mysql InnoDB 引擎下事物学习 建表user CREATE TABLE `user` ( `uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT, ...