DataStructure01|ArrayList和顺序表

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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握Python的X篇_4_开发工具ipython与vscode的安装使用

本篇将会介绍两个工具的安装及使用来提高Python的编程效率。 ipython&#xff1a;比python更好用的交互式开发环境vscode&#xff1a;本身是文本编辑器&#xff0c;通过安装相关的插件vscode可以作为python集中开发环境使用 掌握Python的X篇_4_开发工具ipython与vscode的安装使…

ChatGPT/GPT-4 或将从根本上改变软件工程

文章目录 一、前言二、主要内容 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 编程也可能是最容易被 AI 技术取代的工作之一&#xff0c;软件的构建方式将产生根本性的转变。 今年以来&#xff0c;相信大家都听说过 ChatGPT、New Bing 和…

Java try-catch块

Java的try块用于封装可能会抛出异常的代码。它必须在方法内部使用。 如果在try块中的特定语句处发生异常&#xff0c;后续的代码块将不会执行。因此&#xff0c;建议不要在try块中放置不会抛出异常的代码。 Java的try块必须后跟catch块或finally块。 Java try-catch语法 try…

chatgpt赋能python:Python绘制车辆轨迹图

Python绘制车辆轨迹图 在现代交通中&#xff0c;车辆轨迹图是一个广泛应用的技术&#xff0c;它可以被用于道路交通管理&#xff0c;行车安全评估等领域。Python是一种强大的编程语言&#xff0c;它提供了许多绘制数据可视化图表的库。本文将介绍如何使用Python和Matplotlib库…

Git的使用方法

文章目录 Git简介Git用法上传到gitee上 Git简介 简单来说&#xff0c;Git就像一个日志一样&#xff0c;可以帮你记录你对文本文件的修改&#xff0c;但他的功能又强于日志&#xff0c;不仅可以记录&#xff0c;还可以帮你存储那些你对文本文件的修改&#xff0c;当你想要找回之…

ArcGis系列-坐标系转换

Arcgis的工程项目可以添加各种类型的空间资源&#xff0c;比如数据库空间表、shp文件&#xff0c;每张空间表的坐标系可能都会有差异&#xff0c;把他们放到一个工程里时可以统一设置坐标系。 本文将介绍ArcGis三个需要坐标转换的场景&#xff1a; Arcgis Pro设置项目坐标GP分…

论文笔记--GPT-4 Technical Report

论文笔记--GPT-4 Technical Report 1. 报告简介2. 报告概括3 报告重点内容3.1 Predictable Scaling3.2 Capabilities3.3 limitations3.3 Risks & mitigations 4. 报告总结5. 报告传送门6. References 1. 报告简介 标题&#xff1a;GPT-4 Technical Report作者&#xff1a;…

【ABAP】数据类型(四)「类型组TYPE-POOL」

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较…

Mac安装chromedriver

一、chromedriver下载 1、打开chrome浏览器输入&#xff1a;chrome://settings/help 查看当前chrome版本     2、下载对应的chromedriver版本 下载地址&#xff1a;http://chromedriver.storage.googleapis.com/index.html 选择mac系统的chromedriver 直接解压该文件 3、…

SpringBoot使用MockMVC单元测试Controller

前言&#xff1a; 在SpringBoot应用程序中&#xff0c;Controller是接受客户端请求并返回响应数据的核心组件。为了保证Controller的正确性和稳定性&#xff0c;我们可以使用MockMVC框架进行单元测试。MockMVC是Spring框架提供的一个HTTP客户端&#xff0c;用于模拟HTTP请求和响…

华为云“企业快成长大数据与微服务技术创新论坛”成功举办

6月16日&#xff0c;由华为云、msup、厦门火炬大学堂、厦门市行业软件协会联合主办的“企业快成长大数据与微服务技术创新论坛”在厦门成功举办。本次活动汇聚了华为云、珍爱网等知名企业的CTO和技术专家&#xff0c;通过技术案例解析了大数据平台构建、微服务演进等内容&#…

Golang笔记:使用json包处理JSON数据

文章目录 目的Decoding&#xff08;解析数据&#xff09;Encoding&#xff08;创建数据&#xff09;总结 目的 JSON 是一种非常流行的数据交换格式&#xff0c;是JavaScript中原生支持的一种数据&#xff0c;因为其简单方便&#xff0c;所以也经常用在不同程序、不同语言间数据…

【FPGA入门】第七篇、FPGA实现VGA接口驱动

目录 第一部分、实验结果 1、横的三色彩条效果 2、竖的三色彩条效果 第二部分、VGA驱动基本知识 1、VGA分辨率问题 2、VGA驱动波形 2.1、工业标准的时序波形图 2.2、比上面那张图更容易理解的图 2.3、每个区域对应的时间 2.4、不同分辨率的表格 3、VGA扫描范…

【Vue全家桶高仿小米商城】——(四)项目基础架构

第四章&#xff1a;项目基础架构 此章节全力讲解前端基本项目架构&#xff0c;通过此章节可搭建一个通用性的前端架构&#xff0c;内容涵盖跨域方案、路由封装、错误拦截等。 文章目录 第四章&#xff1a;项目基础架构一、前端跨域解决什么是前端跨域&#xff1f;怎么解决前端…

项目调研丨多区块并行处理公链 Transformers 研究报告

目录 一、项目简介 二、项目愿景 三、特色和优势 &#xff08;1&#xff09;速度 &#xff08;2&#xff09;安全 &#xff08;3&#xff09;可扩展性 &#xff08;4&#xff09;高度定制 &#xff08;5&#xff09;不可篡改 &#xff08;6&#xff09;所有数据公开透…

自然语言处理从入门到应用——动态词向量预训练:双向语言模型

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 对于给定的一段输入文本 w 1 w 2 ⋯ w n w_1w_2\cdots w_n w1​w2​⋯wn​&#xff0c;双向语言模型从前向&#xff08;从左到右&#xff09;和后向&#xff08;从右到左&#xff09;两个方向同时建立语言模型。这样做…

论文阅读 - SegFormer

文章目录 1 概述2 模型说明2.1 总体结构2.2 Hierarchical Transformer Encoder2.3 Lightweight All-MLP Decoder 3 SegFormer和SETR的比较参考资料 1 概述 图像分割任务和图像分类任务是非常相关的&#xff0c;前者是像素级别的分类&#xff0c;后者是图像级别的分类。基于分类…

ARM、ARM架构、ARM架构芯片

ARM是一种基于精简指令集&#xff08;RISC&#xff09;的处理器架构&#xff0c;它由英国的ARM公司设计和授权。 ARM芯片具有低功耗、高性能、高集成度等特点&#xff0c;广泛应用于嵌入式系统、移动设备、物联网、服务器等领域。本文将介绍ARM的各类芯片&#xff0c;包括其特…

卷积神经网络中池化层的详细介绍

卷积神经网络自2012年&#xff0c;到2023年经历了翻天覆地的变化。最早的卷积神经网络由卷积层、池化层和全连接层所构成。其中卷积层用于提取图像的特征&#xff0c;池化层削减特征数量&#xff0c;全连接层用于对特征进行非线性组合并预测类别。然而在transformer横行的年代&…

基于卡尔曼滤波进行四旋翼动力学建模(SimulinkMatlab)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…