【数据结构-JAVA】ArrayList

news2025/1/12 18:50:00

目录

1. 线性表

2. 顺序表(ArrayList)

    2.1 什么是顺序表?

    2.2 顺序表的使用

        2.2.1 ArrayList 的构造方法

        2.2.2 ArrayList 的常规操作

        2.2.3 ArrayList 的遍历

    2.3 顺序表的优缺点

3. 练习题

    3.1 练习1 一道面试题

    3.2 练习2 杨辉三角形

    3.3 练习3 洗牌算法

    3.4 List<Integer> 还是 ArrayList<Integer> ?


1. 线性表

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

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

2. 顺序表(ArrayList)

2.1 什么是顺序表?

我们知道,要对数组进行增删查改等操作,就需要用到一些方法,把这些方法跟数组抽象成一个类,就成了顺序表(ArrayList)。那么顺序表可以有以下定义:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

2.2 顺序表的使用

2.2.1 ArrayList 的构造方法

方法解释
ArrayList()无参构造 
ArrayList(Collection<? extends E> c) 利用其他 Collection 构建 ArrayList
ArrayList(int initialCapacity)指定顺序表初始容量

 1. 无参的构造方法:

可以看到,依旧未给 elementData 这个数组分配空间。

2. 指定顺序表初始容量:

 3. 利用其他 Collection 构建 ArrayList :

?是通配符,具体内容待后面文章讲解。

ArrayList(Collection<? extends E> c) 的意思是:传入的类一定是实现了 Collection 这个接口的,并且其泛型的参数类型是 E (E 是 ArrayList 泛型参数类型)或是 E 的子类。

    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(666);
        list.add(888);
        list.add(999);

        ArrayList<Number> arrayList = new ArrayList<>(list);
        arrayList.add(101);

        System.out.println(arrayList);
    }

通过上图可知,LinkedList 类是实现 Collection 接口的,并且代码中,其泛型接收的参数类型是 Integer ,而 ArrayList 的泛型接收的参数类型是 Number,我们知道 Integer 是 Number 的子类。

2.2.2 ArrayList 的常规操作

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<E> subList(int fromIndex, int toIndex) 截取部分 list
import java.util.ArrayList;
import java.util.List;

public class Text {
    public static void main(String[] args) {

        List<String> arrayList = new ArrayList<>();
        //尾插:
        arrayList.add("trees");
        arrayList.add("the sun");
        //指定位置插入元素:
        arrayList.add(1,"flowers");
        //尾插 List 类型 list 对象中的元素:
        List<String> list = new ArrayList<>();
        list.add("blue sky");
        list.add("birds");
        list.add("grass");
        arrayList.addAll(list);
        System.out.println(arrayList);
        //获取某下标的元素:
        System.out.println(arrayList.get(0));
        //将某下标的元素设置成输入元素:
        arrayList.set(0,"forests");
        System.out.println(arrayList);
        //删除指定下标的元素:
        arrayList.remove(2);
        System.out.println(arrayList);
        //删除首个输入的元素:
        arrayList.remove("blue sky");
        System.out.println(arrayList);
        //判断某元素是否在 arraylist 中:
        System.out.println(arrayList.contains("grass"));
        //返回首个输入元素的下标:
        System.out.println(arrayList.indexOf("birds"));
    }
}

2.2.3 ArrayList 的遍历

ArrayList 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器,前两种是遍历 ArrayList 的最常用的方法。

1. for循环+下标

public class Text {
    public static void main(String[] args) {
        List<Character> arrayList = new ArrayList<>();
        arrayList.add('S');
        arrayList.add('O');
        arrayList.add('S');
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i)+" ");
        }
    }
}

2. foreach

    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<>();
        arrayList.add("Romeo");
        arrayList.add(" and ");
        arrayList.add("Juliet");
        for(String x:arrayList){
            System.out.print(x);
        }
    }

3. 使用迭代器

    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList<>();
        arrayList.add(100);
        arrayList.add(101);
        arrayList.add(102);
        arrayList.add(103);
        ListIterator<Integer> iterator = arrayList.listIterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next()+" ");
        }
    }

2.3 顺序表的优缺点

顺序表的优点:

1. 当下标给定时,查找速度非常快,时间复杂度为 O(1),ArrayList 更适合于给定下标查找元素。

顺序表的缺点:

1. ArrayList底层使用连续的空间,任意位置插入或删除元素时,需要将该位置后序元素整体往前或者往后搬移,故时间复杂度为O(N),基于此,顺序表不适合频繁对数据进行插入和删除。

2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。

3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继 续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

3. 练习题

3.1 练习1 一道面试题

要求删除 S1 中出现在 S2 的字符,使 S1 :wl t th prgraing wrld!

S1 :"welcome to the progamming world!"

S2 : "come"

import java.util.ArrayList;
import java.util.List;

public class Text {
    public static void main(String[] args) {
        List<Character> list = new ArrayList<>();
        String s1 = "welcome to the programming world!";
        String s2 = "come";
        for (int i = 0; i < s1.length(); i++) {
            char ch = s1.charAt(i);
            if(!s2.contains(ch+"")){
                list.add(ch);
            }
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
    }
}

3.2 练习2 杨辉三角形

 根据分析可知,杨辉三角每一行的值可以使用二维数组来存放,并且有 [i][j] = [i-1][j-1] + [i-1][j] 的规律:

 因此,可以写出以下代码:

    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> row = new ArrayList<>();
        row.add(1);
        list.add(row);

        for (int i = 1; i < numRows; i++) {
            List<Integer> prerow = list.get(i-1);
            List<Integer> currow = new ArrayList<>();
            //每一行的第一个 1
            currow.add(1);
            //中间部分的值
            for (int j = 1; j < prerow.size(); j++) {
                currow.add(prerow.get(j) + prerow.get(j-1));
            }
            //最后一行的 1
            currow.add(1);
            list.add(currow);
        }
        return list;
    }

 3.3 练习3 洗牌算法

每一张牌抽象成一个类:

public class Poker {
    private String suit ;
    private int number;

    public Poker(String suit, int number) {
        this.suit = suit;
        this.number = number;
    }

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

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

一副扑克牌的制作,洗牌,分牌这些操作放在 Game 这个类中: 

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

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

    public List<Poker> buyPokers(){
        List<Poker> pokers = new ArrayList<>();
        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);
        }
    }

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

    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++) {
                hand.get(j).add(pokers.remove(0));
            }
        }
        return hand;
    }
}

在 Text 类调用 Game 类: 

public class Text {
    public static void main(String[] args) {
        Game game = new Game();
        //得到一副除去大小王的牌:
        List<Poker> pokers = game.buyPokers();
        System.out.println(pokers);
        //洗牌:
        game.shuffle(pokers);
        System.out.println(pokers);

        //三人轮流抽五张牌:
        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(pokers);
    }
}

输出:

3.4 List<Integer> 还是 ArrayList<Integer> ?

List<Integer> pokers = new ArrayList<>(); 

用接口对象接收,好处是发生了向上转型以及可以接收所有实现这个接口的对象,但坏处也很明显,那就是只能使用 List 类里的属性和方法。

 ArrayList<Integer> pokers = new ArrayList<>(); 

该种写法,当前类的方法都能调用。

 两种写法其实都行,根据具体的需要来决定用哪一种。

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

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

相关文章

第十四届蓝桥杯集训——switch——配套用法示例

第十四届蓝桥杯集训——switch——配套用法示例 示例题目&#xff1a; 计算某年某月某日有多少天&#xff1f; 输入三个变量&#xff0c;变量year代表年份&#xff0c;变量month代表月份&#xff0c;变量day代表当月的天数。 取值范围&#xff1a;1853>year<2050;0>…

高比例风电电力系统储能运行及配置分析(Matlab实现)

目录 0 概述 1 案例及分析及分析 2 Matlab实现 3 结论 运行结果 目录 0 概述 1 案例及分析及分析 2 Matlab实现 3 结论 0 概述 高比例风电电力系统储能运行及配置分析 1 案例及分析及分析 针对附件2所示的十五天负荷功率&#xff08;最大值1200MW&#xff09;、风电功…

基于java+springmvc+mybatis+vue+mysql的数据学院教务管理系统

项目介绍 管理员后台管理页面&#xff1a; 功能&#xff1a;首页、个人中心、学生管理、教师管理、专业管理、班级管理、课程信息管理、选课信息管理、课程成绩管理、学生申请管理、学生咨询管理、咨询回复管理、课程作业管理 学生后台管理页面功能&#xff1a;首页、注册、登…

RocketMQ的TAG过滤和SQL过滤机制

写作目的 项目中各个中台都使用同一个DB。而DB下会使用中间件监听binlog转换成MQ消息&#xff0c;而下游的各个中台去MQ去拿自己感兴趣的消息。 TAG 如果使用TAG去获取自己感兴趣的消息&#xff0c;那么对于一条学生表变更binlog&#xff0c;最少要插入三条消息&#xff0c;比…

微服务框架 SpringCloud微服务架构 多级缓存 47 Lua 语法入门 47.1 初识Lua

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存47 Lua 语法入门47.1 初识Lua47.1.1 初识Lua47.1.2 HelloWorld47 Lua 语法入门 47.1 初识Lua 47.1.1…

《纳瓦尔宝典》笔记三——做自己真正感兴趣的事情

你合上书本&#xff0c;留在你脑子里的才真正是你的智慧 目录 一、开始让你兴致盎然&#xff0c;后来又让你觉得索然无味了吗 二、在“成为自己”这件事“上&#xff0c;没有人比你做得好 三、专长无法被教授&#xff0c;但可以被学习 四、上学能带来什么 五、尽量做不需…

【大数据技术Hadoop+Spark】HBase分布式数据库架构、特点、数据存储方式、寻址机制详解(图文解释)

一、HBase简介 HBase起源于2006年Google发表的BigTable论文。HBase是一个高可靠性、高性能、面向列、可伸缩的分布式数据库&#xff0c;利用HBase可在廉价PC服务器上搭建起大规模结构化存储集群。HBase的目标是存储并处理大型的数据&#xff0c;更具体来说是仅需使用普通的硬件…

如何去图片水印?三个方法让你学会图片去水印

上大学的时候&#xff0c;老师给我们每人布置了一个关于介绍“我的家乡”的作业。课后在做这个PPT的时候&#xff0c;我发现在网上找的图片素材都带着水印&#xff0c;十分影响PPT展示效果。于是&#xff0c;我就上网找了一些如何去图片水印的方法&#xff0c;对这些方法进行实…

[附源码]Nodejs计算机毕业设计基于的宿舍楼跳蚤市场管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

logrotate 详解

logrotate 程序是一个日志文件管理工具。用于分割日志文件&#xff0c;删除旧的日志文件&#xff0c;并创建新的日志文件&#xff0c;起到“转储”作用。可以节省磁盘空间。下面就对 logrotate 日志轮转操作做一梳理记录。 1、配置文件介绍 Linux系统默认安装logrotate工具&am…

PAT乙级 1084 外观数列 python

题目 思路&#xff1a; 需要注意的点&#xff1a; 只有相邻的字符相同&#xff0c;才统计这个字符出现的次数 利用before作为后一个字符是否与前一个字符相同 进行字符的重复次数统计标志 另&#xff1a; 我发现用下列形式最后一个测试点就会超时 resultresultstr(count) j改…

12.16

为什么使用promise 一.指定回调函数的方式更加灵活 1. 旧的: 必须在启动异步任务前指定 2. promise: 启动异步任务 > 返回promie对象 > 给promise对象绑定回调函 数(甚至可以在异步任务结束后指定/多个) 二. 支持链式调用, 可以解决回调地狱问题 1. 什么是回调地狱?…

90后世界五百强新青年,每年沪漂8个月,长住7天酒店,如何做到不焦虑不躺平?

疫情三年&#xff0c;使许多行业与从业者陷入胶着的困境。特别是身处互联网时代的我们&#xff0c;每天不断接收大量信息&#xff0c;情绪极易被干扰&#xff0c;陷入现实与幻想的拉扯之中。996、内卷、emo、躺平、摆烂等网络热词层出不穷&#xff0c;展现了Z时代青年迷茫、敏感…

MySQL --- 函数大全 6

目录 1.结果集的分区中的每一行分配一个连续的整数 ROW_NUMBER() 2.将字符串追加到指定的数量 RPAD() 3.删除尾随空格 RTRIM() 4.将秒转换为“hh&#xff1a;mm&#xff1a;ss”格式 SEC_TO_TIME() 5.返回指定时间或日期时间值的第二部分 …

预训练时候 Pytorch FrozenBatchNorm (BN)一些小心得

在预训练模型中 会发现 这样使用&#xff1a; # resnet model builder function def build_resnet(archresnet50, pretrainedTrue,freeze_backbone_batchnormTrue, freeze_layer1True,norm_layermisc_nn_ops.FrozenBatchNorm2d):# weightsif pretrained: #如果是预训练 权重是…

Blazorise NumericPicker、DragDrop和Datagrid组件

Blazorise NumericPicker、DragDrop和Datagrid组件 添加了在“BaseAfterRenderComponent”中实现延迟执行的功能。 NumericPicker&#xff1a;现在可以检查大数值。 改进了DragDrop组件。 数据网格&#xff1a;引入了“CancellationTokenSource”和相应的过滤器更改取消选项。 …

通信原理Simulink使用经验

目录 一、如何将Simulink模型文件导出为PDF ​二、如何将模型文件导出为高清位图 三、如何调整鼠标滚轮为上下移动 四、如何控制页面的位置 五、如何得到Scope示波器仿真波形的位图 六、如何修改Scope波形的视图 一、如何将Simulink模型文件导出为PDF 确认此处的打印就可…

2022软考高级架构设计师-经历分享

一.背景 软考全称为【计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试】&#xff0c;是由国家人力资源和社会保障部(原人事部)、工业和信息化部(原信息产业部)领导,全国计算机软件考试办公室负责实施和日常管理的对全国计算机与软件专业技术人员进行的职业资格、…

发烧友实测 | 用飞凌OKA40i-C开发板玩转FFmpeg

本篇试用报告由发烧友 zealsoft提供&#xff0c;感谢 zealsoft的支持。飞凌嵌入式会在电子发烧友和电路城论坛持续开展开发板有奖试用活动&#xff0c;更有京东E卡等着你&#xff01;欢迎大家的持续关注。1. FFmpeg的安装 FFmpeg是用来记录、转换数字音频、视频的开源软件&…

python作业大教学:制作员工管理系统

前言 大家早好、午好、晚好吖 ❤ ~ 环境使用: Python 3.8 Pycharm 功能需求 “”" 创建员工类&#xff1a;属性有&#xff1a;员工号&#xff0c;员工姓名&#xff0c;员工工资&#xff1b; 创建用户类&#xff1a;属性有&#xff1a;用户名&#xff0c;密码&#x…