数据结构(ArrayList)

news2024/9/24 15:26:47

文章目录

  • 一、线性表
  • 二、顺序表
    • 2.1 ArrayList
      • (1)概念
      • (2)ArrayList 的构造
      • (3)ArrayList 的方法
      • (4) ArrayList的遍历
      • (5)ArrayList的优缺点
    • 2.2 链表

一、线性表

  • 概念:是n个具有相同特性的数据元素的有限序列,是一种数据结构
  • 常见的线性表:顺序表、链表、栈、队列…
  • 特点
    • 线性表在逻辑上是线性结构,也就说是连续的一条直线。
    • 在物理结构上(内存上)并不一定是连续的
    • 线性表在物理上存储时,通常以数组和链式结构的形式存储。

二、顺序表

逻辑上是连续的,物理上也是连续的,从底层来讲,顺序表就是数组,而代码上的核心操作,就是通过方法去操作数组

接口的实现

public class SqlList {
    private int[] elem = new int[DEFAULT_CAPACITY];
    private int useSize;
    private static final int DEFAULT_CAPACITY = 5;


    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display(){
        for (int i = 0; i < this.useSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }

    // 新增元素,默认在数据最后新增
    public void add(int data){
        if (isFull()){
            elem = Arrays.copyOf(elem, 2 * elem.length);
        }else{
            elem[useSize] = data;
            useSize++;
        }
    }
    public boolean isFull(){
        if (this.useSize == elem.length){
            return true;
        }else{
            return false;
        }
    }


    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < this.useSize; i++) {
            if (this.elem[i] == toFind){
                return true;
            }
        }
        return false;
    }

    // 查找某个元素对应的下标
    public int indexOf(int toFind) {
        for (int i = 0; i < this.useSize; i++) {
            if (this.elem[i] == toFind){
                return i;
            }
        }
        return -1;
    }

    // 获取 pos 位置的元素
    public int get(int pos) {
        if (!checkPos(pos)){
            throw new PosException("pos不在合法范围中");
        }
        return this.elem[pos];
    }

    private boolean checkPos(int pos){
        if (pos <= useSize && pos > 0){
            return true;
        }else{
            return false;
        }
    }

    // 获取顺序表长度
    public int size() {
        return useSize;
    }

    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        if (!checkPos(pos)){
            throw new PosException("pos不在合法范围中");
        }
        elem[pos] = value;
    }

    // 给 pos 位置的元素设为 value
    public void add(int pos, int value) {
        if (pos < 0 || pos > useSize){
            throw new PosException("add 中下标的位置不对");
        }

        if(isFull()) {
            elem = Arrays.copyOf(elem,2*elem.length);
        }

        for (int i = useSize; i > pos ; i--) {
            elem[i + 1] = elem[i];
        }

        this.elem[pos] = value;
        this.useSize++;

    }


    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        if (isEmpty()){
            return;
        }

        int index = indexOf(toRemove);
        if(index == -1) {
            return;//没有你要删除的数字
        }

        for (int i = index; i < useSize-1; i++) {
            this.elem[i] = this.elem[i+1];
        }

        this.useSize--;
        //elem[us] = null;     如果是引用类型,需要手动置空
    }
    public boolean isEmpty() {
        return useSize == 0;
    }
    // 清空顺序表
    public void clear() {
        //这是引用类型的做法
        /*for (int i = 0; i < useSize; i++) {
            this.elem[i] = null;
        }*/

        useSize = 0;
    }

}

2.1 ArrayList

(1)概念

在集合框架中,ArrayList是一个普通的类,实现了List接口
在这里插入图片描述

  • ArrayList是以泛型方式实现的,使用时必须要先实例化
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList1 = new ArrayList<>();
        
        List<Integer> arrayList2 = new ArrayList<>();//顺序表
        //不能调用子类自己的方法
    }
}
  • 接口功能
    • ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
    • ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
    • ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
  • 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
  • ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

(2)ArrayList 的构造

方法解释
ArrayList()无参构造
ArrayList(int initialCapacity)指定顺序表初始容量
ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList
  • ArrayList()
    在这里插入图片描述
    在这里插入图片描述

  • ArrayList(int initialCapacity)
    在这里插入图片描述

  • ArrayList(Collection<? extends E> c)
    在这里插入图片描述

(3)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

(4) ArrayList的遍历

四种方法:直接打印、for循环+下标、foreach、使用迭代器

public static void main3(String[] args) {
    ArrayList<String> arrayList = new ArrayList<>();
    arrayList.add("abc");
    arrayList.add("def");
    arrayList.add("ghtb");
    arrayList.add("ppppppp");
    arrayList.add("000000000000");
    System.out.println(arrayList);   //因为父类中重写了toString方法,所以可以直接打印
    System.out.println("=====");
    
    for (int i = 0; i < arrayList.size(); i++) {
        System.out.print(arrayList.get(i)+" ");
    }
    System.out.println();
    
    System.out.println("=====");
    for(String x : arrayList) {
        System.out.print(x+" ");
    }
    System.out.println();
    
    System.out.println("=====");
    Iterator<String> it = arrayList.listIterator();
    while (it.hasNext()) {
        System.out.print(it.next()+" ");
    }
    System.out.println();
}

(5)ArrayList的优缺点

  • 优点

    • 根据指定下标去查找元素,效率非常高,时间复杂度为O(1)
    • 更新元素也很快:可以更新指定下标的元素
  • 缺点

    • 每次插入数据,都需要移动元素,极端情况下,如果插入到0下标,那么元素复杂度为O(n)
    • 每次删除数据,都需要移动元素,极端情况下,如果插入到0下标,那么元素复杂度为O(n)
    • 当满了之后,进行1.5倍扩容,然后只放了一个元素,可能会浪费空间

    总结
    ArrayList 适用于经常进行查找元素或者更新元素的场景下

2.2 链表

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

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

相关文章

symmetric funtion and antisymmetric function(对称性函数和反对称性函数)

symmetric funtion and antisymmetric functionantisymmetric functionsymmetric funtion附录今天看资料的时候遇到了一个说法&#xff0c;文中提及&#xff0c;f(x)f\left(x\right)f(x) 是一个 antisymmetric function&#xff0c;看到这个说法有点儿懵&#xff0c;这里特来记…

上海亚商投顾:沪指逼近3400点 CPO概念股再度爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪沪指今日震荡反弹&#xff0c;午后逼近3400点关口&#xff0c;创业板指则小幅调整。CPO概念股再度爆发&#xff0c;…

[oeasy]python00134_[趣味拓展]python起源_历史_Guido人生_ABC编程语言_Tanenbaum

python 历史 回忆上次内容 颜文字是kaomoji 把字符变成一种图画的方法一层叠一层很多好玩儿的kaomoji是一层层堆叠起来的meme 虚拟的表情也在真实世界有巨大影响 一步步地影响 字符编码就是这样一步步发展过来的python也是 一步步 发展到今天的 python究竟是 怎么发展的呢&…

异常(throwable)

异常 异常分类 &#xff08;1&#xff09;Throwable类 所有的异常类型都是它的子类&#xff0c;它派生两个子类Error、Exception。 &#xff08;2&#xff09;Error类 表示仅靠程序本身无法恢复的严重错误&#xff08;内存溢出动态链接失败、虚拟机错误&#xff09;&#…

分布式定时任务

本文引用了谷粒商城的课程 定时任务 定时任务是我们系统里面经常要用到的一些功能。如每天的支付订单要与支付宝进行对账操作、每个月定期进行财务汇总、在服务空闲时定时统计当天所有信息数据等。 定时任务有个非常流行的框架Quartz和Java原生API的Timer类。Spring框架也可以…

【面试题】20个常见的前端算法题,你全都会吗?

现在面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂基本必考 今天给大家带来20个常见的前端算法题&#xff0c;重要的地方已添加注释&#xff0c;如有不正确的地方&#xff0c;欢迎多多指正&#x1f495; 大厂面试题分享 面试题库 前后端面试题库 &#xff08;…

Spring 6 正式“抛弃”feign

近期&#xff0c;Spring 6 的第一个 GA 版本发布了&#xff0c;其中带来了一个新的特性——HTTP Interface。这个新特性&#xff0c;可以让开发者将 HTTP 服务&#xff0c;定义成一个包含特定注解标记的方法的 Java 接口&#xff0c;然后通过对接口方法的调用&#xff0c;完成 …

Simulink仿真封装中的参数个对话框设置

目录 参数和对话框窗格 初始化窗格 文档窗格 为了更加直观和清晰的分析仿真&#xff0c;会将多个元件实现的一个功能封装在一起&#xff0c;通过参数对话框窗格&#xff0c;可以使用参数、显示和动作选项板中的对话框控制设计封装对话框。如图所示&#xff1a; 参数和对话框…

刘二大人《Pytorch深度学习实践》第六讲逻辑斯蒂回归

文章目录线性回归和逻辑斯蒂回归的区别课上代码交叉熵函数的理解线性回归和逻辑斯蒂回归的区别 线性回归一般用于预测连续值变量&#xff0c;如房价预测问题。 线性回归的一般表达式为&#xff1a; 代价函数为MSE&#xff08;均方误差&#xff09;&#xff1a; 其中权重thet…

Linux Shell 实现一键部署二进制Rabbitmq

rabbitmq 前言 RabbitMQ是实现了高级消息队列协议&#xff08;AMQP&#xff09;的开源消息代理软件&#xff08;亦称面向消息的中间件&#xff09;。RabbitMQ服务器是用Erlang语言编写的&#xff0c;而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代…

openai的whisper语音识别介绍

openAI发布了chatgpt&#xff0c;光环一时无两。但是openAI不止有这一个项目&#xff0c;它的其他项目也非常值得我们去研究学习。 今天说说这个whisper项目 https://github.com/openai/whisper ta是关于语音识别的。它提出了一种通过大规模的弱监督来实现的语音识别的方法。…

C++之深入解析STL unordered_map的底层实现原理

C STL 标准库中&#xff0c;不仅是 unordered_map 容器&#xff0c;所有无序容器的底层实现都采用的是哈希表存储结构。更准确地说&#xff0c;是用“链地址法”&#xff08;又称“开链法”&#xff09;解决数据存储位置发生冲突的哈希表&#xff0c;整个存储结构如下所示&…

JVM 垃圾收集器详解

一、垃圾收集器 如果说收集算法是内存回收的方法论&#xff0c;那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定&#xff0c;因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别&#xff0c;不同的虚…

基于遗传算法的中药药对挖掘系统的设计与实现

用数据挖掘技术研究了中药方剂配伍的规律。主要工作&#xff1a;分析了关联规则存在的问题&#xff0c;引入双向关联规则的概念&#xff1b;介绍了遗传算法的基本原理&#xff0c;研究了遗传算法在数据挖掘中的应用&#xff1b;将方剂库转换为位图矩阵&#xff0c;大大提高搜索…

Mac重启清理缓存会怎么样 mac清理缓存怎么清理

众所周知&#xff0c;Mac电脑有着流畅的操作系统&#xff0c;因此&#xff0c;很多用户都会选择使用Mac电脑办公。随着日常使用&#xff0c;系统缓存数据越来越大&#xff0c;某些Mac电脑&#xff08;尤其是小内存版本的Mac电脑&#xff09;可能会出现“系统”占存储空间比例较…

初始单片机.md

1.如何将HEX文件烧录到单片机 STC-ISP STC-ISP是一款单片机下载编程烧录软件&#xff0c;是针对STC系列单片机而设计的&#xff0c;可下载STC89系列、12C2052系列和12C5410等系列的STC单片机&#xff0c;使用简便。 思路&#xff1a;将电脑磁盘上已存在的文件通过串口的方式下…

python中第三方库xlrd和xlwt的使用教程

excel文档名称为联系人.xls&#xff0c;内容如下&#xff1a; 一、xlrd模块用法 1.打开excel文件并获取所有sheet import xlrd# 打开Excel文件读取数据 data xlrd.open_workbook(联系人.xls)sheet_name data.sheet_names() # 获取所有sheet名称 print(sheet_name) # [银…

python依次运行多个代码遇到的同步与异步问题

1、要实现在一个Python代码运行完后紧接着运行另一个Python代码&#xff0c;可以使用Python的subprocess模块。该模块可以创建新进程并与之交互&#xff0c;可以用于在Python代码中启动新的程序或脚本。 下面是一个示例代码&#xff0c;用于在运行完code1.py后紧接着运行code2…

论文配色方案(收藏)

方案一&#xff1a;复古 系列色——十六进制颜色码&#xff1a; 0780cf - 765005 - fa6d1d - 0e2c82 - b6b51f - da1f18 - 701866 - f47a75 - 009db2 - 024b51 - 0780cf - 765005 系列色——RGB颜色值&#xff1a; &#xff08;7,128,207&#xff09;-&#xff08;118,80,5&…

【记录】优化油猴插件【BD网盘播放器】

收获最重要前言优化代码收获1.禁止浏览器弹窗2.定时器3.设置属性-隐藏元素4.鼠标悬停和移开事件5.添加元素6.div里均匀分布7.获取元素属性值8.监听播放器状态9.jQuery 选择器前言 有钱的可以支持一下原作者&#xff0c;没钱就要多学习 优化 1.1 视频刚开始未播放时&#xff…