顺序表ArrayList

news2024/11/19 20:16:18

在这里插入图片描述

作者简介: zoro-1,目前大二,正在学习Java,数据结构等
作者主页: zoro-1的主页
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

顺序表

  • 概念
  • Arraylist
    • 构造方法
    • 相关方法
    • 遍历操作
  • 自定义Arraylist
    • 接口
    • 实现类

概念

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

Arraylist

构造方法

ArrayList是Java编程语言中的一个类,用于实现可动态调整大小的数组。ArrayList提供了多种构造方法,可以根据需要选择不同的构造方法。

以下是常用的ArrayList构造方法:

  1. ArrayList():创建一个空的ArrayList,初始容量为10。

  2. ArrayList(int initialCapacity):创建一个指定初始容量的ArrayList。

  3. ArrayList(Collection<? extends E> c):创建一个包含指定元素的ArrayList。该ArrayList根据指定集合的迭代器顺序包含集合的所有元素。

示例:

//创建一个空的ArrayList
ArrayList<String> list1 = new ArrayList<String>();

//创建一个指定初始容量的ArrayList
ArrayList<Integer> list2 = new ArrayList<Integer>(20);

//创建一个包含指定元素的ArrayList
ArrayList<String> list3 = new ArrayList<String>(Arrays.asList("Apple", "Banana", "Orange"));

注意:ArrayList是泛型类,可以指定任意类型作为其元素类型。以上示例中,list1和list2元素类型为String和Integer,list3元素类型为String。

相关方法

ArrayList 是 Java 中常用的一种集合类型,具有动态的添加元素、随机访问、删除元素等基本功能,具体方法如下:

  1. add(E e):在 List 的末尾添加一个元素。
  2. add(int index, E element):在指定的索引位置插入一个元素。
  3. remove(int index):根据索引删除一个元素。
  4. remove(Object o):删除第一个包含指定元素的元素。
  5. clear():清空 List 中的所有元素。
  6. get(int index):返回指定索引位置的元素。
  7. set(int index, E element):用指定元素替换指定位置的元素。
  8. isEmpty():如果 List 不包含任何元素,则返回 true。
  9. size():返回 List 中元素的个数。
  10. contains(Object o):如果 List 包含指定的元素,则返回 true。
  11. indexOf(Object o):返回第一个匹配元素的索引位置,如果没有找到则返回 -1。
  12. subList(int fromIndex, int toIndex):返回 List 中从 fromIndex 开始到 toIndex - 1 结束(不包括 toIndex 位置)的一个子列表。

除此之外,ArrayList 还实现了 Iterable、Collection 和 List 接口,因此可以使用这些接口中定义的方法。例如,可以使用 Collections 类的 sort(List list) 方法对 ArrayList 中的元素进行排序。ArrayList 是 Java 中常用的一种集合类型,具有动态的添加元素、随机访问、删除元素等基本功能,具体方法如下:

遍历操作

  1. 增强for循环遍历
ArrayList<String> list = new ArrayList<>();
// 添加元素
for(String element : list){
    System.out.println(element); // 输出元素
}
  1. 迭代器遍历
ArrayList<String> list = new ArrayList<>();
// 添加元素
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
    String element = iterator.next();
    System.out.println(element); // 输出元素
}
  1. lambda表达式遍历(Java 8及以后版本)
ArrayList<String> list = new ArrayList<>();
// 添加元素
list.forEach(element -> System.out.println(element)); // 输出元素
```1. 增强for循环遍历
```java
ArrayList<String> list = new ArrayList<>();
// 添加元素
for(String element : list){
    System.out.println(element); // 输出元素
}
  1. 迭代器遍历
ArrayList<String> list = new ArrayList<>();
// 添加元素
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
    String element = iterator.next();
    System.out.println(element); // 输出元素
}
  1. lambda表达式遍历(Java 8及以后版本)
ArrayList<String> list = new ArrayList<>();
// 添加元素
list.forEach(element -> System.out.println(element)); // 输出元素

自定义Arraylist

接口

public interface IList {
    //新增元素,默认在数组最后新增
    public void add(int data);
    // 在 pos 位置新增元素
    public void add(int pos, int data);
    // 判定是否包含某个元素
    public boolean contains(int toFind) ;
    // 查找某个元素对应的位置
    public int indexOf(int toFind);
    // 获取 pos 位置的元素
    public int get(int pos);
    // 给 pos 位置的元素设为 value  更新
    public void set(int pos, int value);
    //删除第一次出现的关键字key
    public void remove(int toRemove) ;
    // 获取顺序表长度
    public int size();
    // 清空顺序表
    public void clear() ;
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display();

    boolean isFull();

实现类

import java.util.Arrays;

/**
 * @Author 12629
 * @Description:
 */
public class MyArrayList implements IList {


    public int[] elem ;
    public int usedSize;//0
    //顺序表的 默认大小
    public static final int DEFAULT_SIZE = 10;

    public MyArrayList() {
        this.elem = new int[DEFAULT_SIZE];
    }

    public MyArrayList(int capacity) {
        this.elem = new int[capacity];
    }

    /**
     * 遍历顺序表当中的元素
     */
    @Override
    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }


    @Override
    public void add(int data) {
        checkCapacity();

        this.elem[this.usedSize] = data;
        this.usedSize++;
    }

    @Override
    public boolean isFull() {
        /*if(usedSize == elem.length) {
            return true;
        }
        return false;*/

        return usedSize == elem.length;
    }

    @Override
    public void add(int pos, int data) {
        try {
            checkPosOnAdd(pos);
        }catch (PosIllegality e) {
            e.printStackTrace();
            return;
        }
        checkCapacity();
        //1、从最后一个有效的数据开始往后移动 //2、当i < pos 就结束
        for (int i = usedSize-1; i >= pos; i--) {
            elem[i+1] = elem[i];
        }
        //3、存放元素到pos 位置
        elem[pos] = data;
        //4、usedSize++;
        usedSize++;
    }
    /**
     * 检查pos的合法性
     */
    private void checkPosOnAdd(int pos) throws PosIllegality{
        if(pos < 0 || pos > usedSize) {
            System.out.println("不符合法!");
            throw new PosIllegality("插入元素下标异常: "+pos);
        }
    }

    private void checkCapacity() {
        if(isFull()) {
            //扩容
            elem = Arrays.copyOf(elem,elem.length*2);
        }
    }

    @Override
    public boolean contains(int toFind) {
        if(isEmpty()) {
            return false;
        }
        for (int i = 0; i < usedSize; i++) {
            //如果是查找引用数据类型 一定记住 重写方法
            if(elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    public boolean isEmpty() {
        return usedSize == 0;
    }

    @Override
    public int indexOf(int toFind) {
        if(isEmpty()) {
            return -1;
        }
        for (int i = 0; i < usedSize; i++) {
            //如果是查找引用数据类型 一定记住 重写方法
            if(elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public int get(int pos) throws MyArrayListEmpty{
        checkPosOnGetAndSet(pos);

        if(isEmpty()) {
            throw new MyArrayListEmpty("获取指定下标元素时" +
                    "顺序表为空!");
        }

        return elem[pos];
    }


    private void checkPosOnGetAndSet(int pos) throws PosIllegality{
        if(pos < 0 || pos >= usedSize) {
            System.out.println("不符合法!");
            throw new PosIllegality("获取指定下标的元素异常: "+pos);
        }
    }

    @Override
    public void set(int pos, int value) {
        checkPosOnGetAndSet(pos);

        elem[pos] = value;
    }

    @Override
    public void remove(int toRemove) {
        int index = indexOf(toRemove);
        if(index == -1) {
            System.out.println("没有这个数字!");
            return;
        }
        for(int i = index; i < usedSize-1;i++) {
            elem[i] = elem[i+1];
        }
        usedSize--;

    }

    @Override
    public int size() {
        return this.usedSize;
    }

    @Override
    public void clear() {
        this.usedSize = 0;
    }
}

今天的分享到这就结束了,记得三连哦,谢谢大家支持
在这里插入图片描述

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

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

相关文章

嵌入式实时操作系统的设计与开发(任意大小的内存管理)

任意大小的内存管理是根据用户需要为其分配内存&#xff0c;即用户需要多大内存就通过acoral_malloc2()为之分配多大内存&#xff0c;同时每块分配出去的内存前面都有一个控制块&#xff0c;控制块里记录了该块内存的大小。 同时未分配出去的内存也有一个控制块&#xff0c;寻…

守护进程深度分析

思考 代码中创建的会话&#xff0c;如何关联控制终端&#xff1f; 新会话关联控制终端的方法 会话首进程成功打开终端设备 (设备打开前处于空闲状态) 1、关闭标准输入输出和标准错误输出2、将 stdin 关联到终端设备&#xff1a;STDIN_FILENO > 03、将 stdout 关联到终端设…

FreeRTOS_队列

目录 1. 队列简介 1.1 数据存储 1.2 多任务访问 1.3 出队阻塞 1.4 入队阻塞 1.5 队列操作过程 1.5.1 创建队列 1.5.2 向队列发送第一个消息 1.5.3 向队列发送第二个消息 1.5.4 从队列中读取消息 2. 队列结构体 3. 队列创建 3.1 函数原型 3.1.1 函数 xQueueCreate…

网卡状态检测函数

内核中网卡的开启状态通过__LINK_STATE_START进行标识。网卡开启或关闭时&#xff0c;通过该标识会被置位。 内核专门提供了一个函数用于检测该标志位。函数定义如下&#xff1a; static inline bool netif_running(const struct net_device *dev) {return test_bit(__LINK_S…

YOLOv5源码中的参数超详细解析(1)— 项目目录结构及文件(包括源码+网络结构图)

前言:Hello大家好,我是小哥谈。作为初学者,为了后期能够熟练的使用YOLOv5进行模型的训练,首先必须做的就是了解YOLOv5项目目录结构中各文件以及参数的作用。本篇文章就向大家简单介绍一下每个文件的具体功能及作用,关于YOLOv5详细的代码解读后期会慢慢更新,欢迎大家收藏关…

YOLOv5改进实战 | GSConv + SlimNeck双剑合璧,进一步提升YOLO!

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

三十七、【进阶】SQL的explain

1、explain 2、基础使用 在使用explain关键字时&#xff0c;只需要在所执行语句前加上explain即可 mysql> explain select * from stu where id3; ---------------------------------------------------------------------------------------------------------- | id | s…

【MySQL】8.0新特性、窗口函数和公用表表达式

文章目录 1. 新增特性2. 移除旧特性2.1 优点2.2 缺点 3. 新特性1&#xff1a;窗口函数3.1 使用窗口函数前后对比3.2 窗口函数分类3.3 语法结构3.4 分类讲解3.4.1 序号函数3.4.1.1 ROW_NUMBER()函数3.4.1.2 RANK()函数3.4.1.3 DENSE_RANK()函数 3.4.2 分布函数3.4.2.1 PERCENT_R…

HiveServer2负载均衡

有多个HiveServer2服务时&#xff0c;可以借助Zookeeper服务实现访问HiveServer2的负载均衡&#xff0c;将HiveServer2的压力分担到多个节点上去。本文详细介绍HiveServer2负载均衡的配置及使用方法&#xff0c;请根据EMR集群&#xff08;普通集群和Kerberos集群&#xff09;的…

浏览器从输入url到渲染页面发生了什么?

浏览器从输入url到渲染页面发生了什么&#xff1f; 一、解析URL 首先浏览器做的第一步工作就是要对 URL 进行解析&#xff0c;浏览器会判断这个url的合法性 &#xff0c;以及是否有可用缓存&#xff08;如果有缓存即可以不用进行下一步的DNS域名解析&#xff09;&#xff0c;…

《代码随想录》刷题笔记——字符串篇【java实现】

反转字符串 https://leetcode.cn/problems/reverse-string/description/ 【双指针法&#xff1a;一前一后】 public void reverseString(char[] s) {for (int i 0; i < s.length / 2; i) {char temp s[i];s[i] s[s.length - 1 - i];s[s.length - 1 - i] temp;} }反转…

【软考中级】网络工程师:10.组网技术(理论篇)

交换机基础 交换机分类 > 根据交换方式分      - 存储转发式交换&#xff08;Store and Forward&#xff09;完整接收数据帧&#xff0c;缓存、验证、碎片过滤&#xff0c;然后转发。   优点&#xff1a;可以提供差错校验和非对称交换。   缺点&#xff1a;延迟大。…

【Qt控件之QTabWidget】介绍及使用

描述 QTabWidget类提供了一个带有选项卡的小部件堆栈。 选项卡小部件提供了一个选项卡栏&#xff08;参见QTabBar&#xff09;和一个“页面区域”&#xff0c;用于显示与每个选项卡相关联的页面。默认情况下&#xff0c;选项卡栏显示在页面区域的上方&#xff0c;但可以使用…

2023年拼多多双11百亿补贴新增单件立减玩法介绍

2023年拼多多双11百亿补贴新增单件立减玩法介绍 拼多多启动了11.11大促活动&#xff0c;主题为“天天11.11&#xff0c;天天真低价”。消费者享受多重优惠&#xff0c;包括满减、百亿补贴和单件立减等。百亿补贴新增玩法&#xff0c;有超过20000款品牌商品参与单件立减活动。 …

【内网穿透】五分钟搭建全球领先开源ERP:Odoo,并实现公网访问

目录 前言 1. 下载安装Odoo&#xff1a; 2. 实现公网访问Odoo本地系统&#xff1a; 3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着…

Vue3踩坑指南

vue.config.ts不起作用 关于项目 项目使用的还是vue-cli搭建的&#xff0c;底层还是webpack&#xff0c;没有使用新的vite搭建。 踩坑1&#xff1a;vue.config.ts不起作用 我本着既然是vue3 ts的项目&#xff0c;那么为了规范&#xff0c;项目中所有的js文件都得替换成ts文…

HanLP集成到Springboot及使用自定义词典

前言 HanLP集成到Springboot及使用自定义词典 文章目录 前言简介集成Springboot扩展使用自定义词典路径易错问题 简介 开源工具包&#xff0c;提供词法分析、句法分析、文本分析和情感分析等功能&#xff0c;具有功能完善、性能高效、架构清晰、语料时新、可自定义等特点。 官…

【小白专用 已验证】PHP连接SQLServer数据库

PHP是一门强大的服务器端脚本语言&#xff0c;而SQL Server是Microsoft开发的一款关系型数据库管理系统。为了在PHP中直接操纵SQL Server数据库&#xff0c;需要通过安装SQL Server扩展来实现。这篇文章将详细介绍如何在PHP中使用SQL Server扩展来操作数据库。 首先&#xff0…

那些你面试必须知道的webpack知识点

目录 1、webpack介绍和简单使用1.1 什么是webpack&#xff1f;1.2 安装webpack1.3 简单使用一下webpack 2、webpack的入口与输出2.1 入口(entry)2.2 输出(output) 3、入口多种配置方法3.1 多文件打包成一个文件3.2 多文件打包成多文件 4、loader的概念5、压缩打包HTML5.1 使用步…

DP基础相关笔记

基础 DP LIS LIS&#xff08;Longest Increasing Subsequence&#xff09;&#xff0c;顾名思义&#xff0c;就是最长上升子序列问题。 在这里我们要区分一下子串和子序列的区别&#xff0c;很简单&#xff0c;子串连续&#xff0c;子序列可以不连续。然而就在几小时之前本蒟…