DataStructure01|ArrayList和顺序表

news2025/1/13 17:29:21

ArrayList与顺序表

1.线性表

​ 线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…

​ 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

在这里插入图片描述
在这里插入图片描述

2.顺序表

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

2.1接口的实现

public class SeqList {
private int[] array;
private int size; 
    // 默认构造方法 
SeqList(){ } 
    // 将顺序表的底层容量设置为initcapacity 
SeqList(int initcapacity){ }
    // 新增元素,默认在数组最后新增
public void add(int data) { } 
    // 在 pos 位置新增元素
public void add(int pos, int data) { }
    // 判定是否包含某个元素
public boolean contains(int toFind) { return true; }
    // 查找某个元素对应的位置
public int indexOf(int toFind) { return -1; } 
    // 获取 pos 位置的元素
public int get(int pos) { return -1; }
    // 给 pos 位置的元素设为 value
public void set(int pos, int value) { } 
    //删除第一次出现的关键字key
public void remove(int toRemove) { } 
    // 获取顺序表长度
public int size() { return 0; }
    // 清空顺序表
public void clear() { } 
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public void display() { } }

3.ArrayList的简介

ArrayList实现了List接口,具体框架图如下:

img

  1. ArrayList是以泛型方式实现的,使用时必须要先实例化

  2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问

  3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的

  4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的

  5. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者 CopyOnWriteArrayList

  6. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

4.ArrayList使用

4.1ArrayList的构造

方法解释
ArrayList()无参构造
ArrayList(Collection<? extends E> c)利用其他 Collection 构建 ArrayList
ArrayList(int initialCapacity)指定顺序表初始容量
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中的元素一致 
    通过集合list2快速构造出包含传入元素所有元素的新集合list2
    ArrayList<Integer> list3 = new ArrayList<>(list2); 
    // 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难 
    List list4 = new ArrayList(); 
    list4.add("111");
    list4.add(100); }

4.2ArrayList常见操作

ArrayList虽然提供的方法比较多,但是常用方法如下所示,需要用到其他方法时,自行查看ArrayList的帮助文档。

方法解释
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 subList(int fromIndex, int toIndex)截取部分list(左闭右开)
public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("大法官");
        list.add("大黄");
        list.add("小明");
        list.add("小芳");
        System.out.println(list);

        //获取list中有效元素个数
        System.out.println(list.size());

        //获取和设置index位置上的元素,注意index必须介于[0,size)之间
        System.out.println(list.get(0));
        list.set(0, "大话西游");//这个是在0位置修改元素
        System.out.println(list.get(0));

        // 在list的index位置插入指定元素,index及后续的元素统一往后搬移一个位置
        list.add(0, "添加元素");
        System.out.println(list);
        // 删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置
        list.remove("小芳");
        System.out.println(list);
        //删除list中index位置上的元素,注意index不要超过list中有效元素个数,否则会抛出下标越界异常
        list.remove(list.size() - 1);
        System.out.println(list);
    }

4.3ArrayList的遍历

ArrayList 可以使用三种方式遍历:==for循环+下标(常用)、foreach(常用)、==使用迭代器

  public static void main(String[] args) {
        //ArrayList的遍历
        List<Integer> list = new ArrayList<>();
        list.add(111);
        list.add(222);
        list.add(333);
        list.add(444);
        list.add(555);
        // 使用下标+for遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }

        System.out.println();
        // 借助foreach遍历
        for (Integer x : list) {
            System.out.print(x+" ");

        }
        System.out.println();
        //迭代
        Iterator<Integer> it = list.listIterator();
        while (it.hasNext()){
            System.out.println(it.next()+" ");
        }
        System.out.println();
    }

4.4ArrayList的扩容机制

ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。以下是ArrayList源码中扩容方式:

  1. 检测是否真正需要扩容,如果是调用grow就是准备扩容

  2. 预估需要扩容的大小

    • 初步预估按照1.5倍大小扩容
    • 如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容
    • 真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
  3. 使用copyOf进行扩容

6.ArrayList具体使用

简单的洗牌算法

Test类

//ArrayList之扑克牌
public class Test {

    public static void main(String[] args) {
        Game game = new Game();
        List<Poker> pokers = game.buyPoker();
        System.out.println(pokers);
        //洗牌
        game.shuffle(pokers);
        System.out.println("洗牌:");
        System.out.println(pokers);
        //揭牌
        System.out.println("揭牌");
        List<List<Poker>> hand = game.game(pokers);
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第" + (i + 1) + "个人的牌:" + hand.get(i));
        }
        System.out.println("剩下的牌");
        System.out.println(pokers);
    }
}

Poker类

public class Poker {
    private String suit;//花色
    private int rank;//数字

    public Poker(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;
    }

    @Override
    public String toString() {
        return "{" + suit + " " + rank + "}";
    }
}

Game类

public class Game {
    private static final String[] suits = {"♥", "♣", "♠", "♦"};


    public List<Poker> buyPoker() {
        List<Poker> pokers = new ArrayList<>();
        //4个花色,各13张牌
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <= 13; j++) {
                Poker poker = new Poker(suits[i], j);//一张牌
                pokers.add(poker);
            }
        }
        return pokers;
    }

    //洗牌(打乱牌)
    public void shuffle(List<Poker> pokers) {
        for (int i = pokers.size() - 1; i > 0; i--) {
            Random random = new Random();
            int index = random.nextInt(i);
            swap(pokers, i, index);
        }
    }

    private void swap(List<Poker> pokers, int i, int j) {
        Poker tmp = pokers.get(i);
        pokers.set(i, pokers.get(j));
        pokers.set(j, tmp);
    }

    //揭牌 三个人轮流抓五张牌,每次抓一张牌
    //每次删除一张牌(面上的第一张牌
    public List<List<Poker>> game(List<Poker> pokers) {
        List<List<Poker>> hand = new ArrayList<>();
        List<Poker> hand1 = new ArrayList<>();
        List<Poker> hand2 = new ArrayList<>();
        List<Poker> hand3 = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);

//最外层循环,控制轮数
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Poker removePoker = pokers.remove(0);
                hand.get(j).add(removePoker);
            }
        }
        return hand;
    }
}

    hand.add(hand2);
    hand.add(hand3);

//最外层循环,控制轮数
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
Poker removePoker = pokers.remove(0);
hand.get(j).add(removePoker);
}
}
return hand;
}
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/993b6cabdb6749e5a4f891ade14bbe10.png)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产品设计.从用户体验五要素出发,谈如何设计产品

用户调研--产品定位---产品方案---视觉设计 作者 | 渐渐见减减简https://www.zcool.com.cn/article/ZMTEyNDA2NA.html 用户体验五要素是一种产品分析与设计的方法论&#xff0c;帮助我们以正确方式从0到1设计一款产品。 1 战略层 企业做一个产品前&#xff0c;都要明确几个问题…

多目标樽海鞘算法MATLAB实战(附源码)

今天给大家分享多目标樽海鞘算法&#xff0c;主要从算法原理和代码实战展开。需要了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦&#xff0c;下一期分享的内容就是你想了解的内容。 一、算法原理 上一篇分享的SSA算法能够驱动salps向食物来源靠近&…

【Flutter】包管理(6)Flutter 状态管理 Provider 深入使用指南

文章目录 一、 前言二、 ProxyProvider 的使用三、 处理异步数据四、 性能优化五、 版本信息六、 总结一、 前言 在我们的上一篇文章中,我们介绍了 Flutter 中 Provider 包的基本使用。 在这篇文章中,我们将深入探讨 Provider 的高级使用方法,包括如何使用 ProxyProvider,…

Green板 和Red板和Nv EVM板比较

001 电源开关、 复位、烧写按钮 G&#xff1a;绿板 K3: Reset press RN K1: Brush RECOVERY button K2: Start button Power ON R: 红板 K3: POWER_KEY K2: FORCE_RECOVERY K1: RESET_KEY 002 USB设计 烧写连接器 G: 绿板 J6&#xff1a;TYPE C 烧写连接器 USB0_DP …

streamlit——搭建作业、文件上传网站(代码编写、服务器部署)

使用streamlit搭建简单的作业提交网站 文章目录 使用streamlit搭建简单的作业提交网站一、引言二、streamlit代码三、搭建到服务器中1、放行安全组2、将代码放到服务器中3、配置依赖4、运行代码 一、引言 由于我平时需要收集各种类型的作业文件。但传统的微信收文件方式很让我…

PyQt5中文手册

PyQt5中文手册 一、介绍 本教程的目的是带领你入门PyQt5。教程内所有代码都在Linux上测试通过。PyQt4 教程是PyQt4的教程&#xff0c;PyQt4是一个Python&#xff08;同时支持2和3&#xff09;版的Qt库。 关于 PyQt5 PyQt5 是Digia的一套Qt5应用框架与python的结合&#xff…

实训五:数据库安全控制 - 授权及回收权限

授权及回收权限 第1关&#xff1a;授权任务描述相关知识MySql系统库中的权限表访问控制的两个阶段&#xff1a;授予的权限等级&#xff1a;MySQL 权限类型grant 语句的基本语法格式revoke 语句的基本语法格式查看权限限制权限 编程要求测试说明参考代码 第2关&#xff1a;授权-…

论文悦读(5)——NVM文件系统之CtFS(FAST‘22)文件系统

CtFS&#xff08;FAST22&#xff09; 1. 背景&#xff08;Background&#xff09;1.1 NVM1.2 NVM文件系统1.3 快速索引方案 2. 观察与动机&#xff08;Observation & Motivation&#xff09;3. CtFS设计与实现&#xff08;Design & Implementation&#xff09;3.1 系统…

ASP.NET Dotnet 3.5实验室LIMS系统源码

LIMS系统功能包括&#xff1a;检测管理&#xff08;合同管理、样品管理、样品收发管理、工作任务分配、检测结果登记、复核及审核、留样管理等&#xff09;、报告管理&#xff08;报告编制、审核、签发、打印等&#xff09;、原始记录管理、仪器设备管理、消耗品管理、文件管理…

Oralce系列十九:Oralce的体系结构

Oralce的体系结构 1. 物理结构2. 内存结构2.1 SGA2.2 后台进程 3. 逻辑结构 1. 物理结构 Oracle数据库的物理结构由参数文件、控制文件、数据文件和日志文件组成&#xff0c;用于存储和管理数据库的数据和元数据&#xff0c;每个文件都扮演着不可或缺的角色。 参数文件用于配…

盘点那些VS Code上的常用插件

插件可以使代码开发过程变得更加轻松和高效 文章目录 前言中文版主题插件显示错误游戏插件连接数据库拼写检查插件前端智能提示刷算法题的插件美化注释的插件美化括号的插件自动补全路径和文件名在浏览器中打开 HTML 文件在 VS Code 里面使用 Postman同步 VS Code 配置的插件 前…

MFC第七天 单机版数据库增删改的方法和用户登录(密码修改)、权限管理功能的员工管理系统的应用 以及 CCombox类的属性和方法

文章目录 员工管理系统的应用对TCHAR类型简介&#xff1a;Unicode软件开发中的文字转换方式有三种 CComboBox控件属性和类库介绍CBS_组合框控件属性CComboBox常用方法 员工管理系统示例代码如下Employer_sql.hEmployer_sql.cppMainDlg.hMainDlg.cpp: 实现文件CLoginDlg.hCLogin…

入坑 TS(一)

1、TS 采用类型后置的语法 const str: string "我是字符串"; const num: number "我是数值"; const bool: boolean false;函数怎么写&#xff1f; // 有返回值 function sayHello(str: string): string {return str; } // 无返回值 function sayHello…

Java throws关键字

Java的throws关键字用于声明异常。它向程序员提供了可能发生异常的信息。 因此&#xff0c;最好为程序员提供异常处理代码&#xff0c;以便保持程序的正常流程。 异常处理主要用于处理已检查异常。如果出现任何未检查的异常&#xff0c;例如NullPointerException&#xff0c;则…

jjy-shareV2.0一键分享到微博,QQ空间,QQ好友,微信

介绍 jjy-shareV2.0一键分享到微博&#xff0c;QQ空间&#xff0c;QQ好友&#xff0c;微信 作者&#xff1a;极纪元-橙 作者博客&#xff1a;https://cplvfx.blog.csdn.net/ 码云Gitee&#xff1a;橙cplvfx极纪元 (cplvfx) - Gitee.com 项目地址&#xff1a;jjy-shareV2.…

登录认证(全集)--jwt,Filter,Interceptor详细说明

一、登录校验 问题&#xff1a;在未登录情况下&#xff0c;我们也可以直接访问部门管理、员工管理等功能。由于浏览器与web服务器中的数据交互是通过HTTP协议的&#xff0c;而HTTP协议是无状态的–即每个页面中的请求和响应都是独立的&#xff0c;没有状态存在。所以我们需要进…

WordPress网站的robots文件代码怎样写比较好

本文记载和介绍的是wordpress的robots.txt的在哪儿&#xff1f;以及如何修改robots文件来禁止搜索引擎爬取/ajax目录下的文章。以及如何优化WordPress网站的robots文件 wordpress设置robots文件的目录&#xff1a;/wp-includes/functions.php&#xff0c;然后搜索do_robotstxt…

【雕爷学编程】Arduino动手做(123)---Multi-function扩展板

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

随机数检测(一)

随机数检测&#xff08;一&#xff09;- 随机数自测试概述 1 概述2 产品形态划分和检测项目3 测试方式3.1 概述3.2 单比特频数检测方法3.3块内频数检测方法 1 概述 随机数发生器设计完成后&#xff0c;使用随机数发生器的产品需对其执行测试&#xff0c;防止应用过程中产生不合…

Redis的数据类型及对应的数据结构(二)

接上篇&#xff1a;Redis的数据类型及对应的数据结构&#xff08;一&#xff09;_鱼跃鹰飞的博客-CSDN博客 本篇主要讨论剩下的几种数据结构的应用场景 应用场景 集合的主要几个特性&#xff0c;无序、不可重复、支持并交差等操作。 因此 Set 类型比较适合用来数据去重和保…