java 数据结构ArrayList类

news2024/11/29 4:49:42

目录

什么是List

线性表

顺序表

ArrayList类

ArrayList无参方法

ArrayList有参方法

?通配符

ArrayList 的remove方法

ArrayList 的subList方法

Iterator:迭代器

使用ArrayList完成杨辉三角


什么是List

在集合框架中,List是一个接口,继承自Collection

注意:List是个接口,并不能直接用来实例化

Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:

List中提供好了的方法,具体如下:


线性表

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

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

顺序表

其实是一个动态扩容的数组

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

接口的实现:

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() { }
}


ArrayList类

在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:

说明

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

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

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

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

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

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


ArrayList无参方法

无参一开始的时候没有分配内存,当调用add方法的时候才分配内存,因为底层代码进行扩容等一系列操作

    public static void main2(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(0, 99);

        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i) + " ");
        }
        System.out.println();
        System.out.println(list);

结论:

第一次Add的是会分配大小为10的内存

对于ArrayList来说,都是以1.5倍进行扩容


ArrayList有参方法

简单点说把一整个集合的一组内容拿过来填充到link里

    public static void main3(String[] args) {
        LinkedList<Integer> link = new LinkedList<>();
        link.add(1);
        link.add(2);
        link.add(3);

        ArrayList<Number> list2 = new ArrayList<>(link);
        list2.add(21);
        list2.add(22);
        System.out.println(list2);

下面通配符中解释了有参方法的传递以及注意的点

?通配符

?就是你传入的变量的指定的泛型类型就是图中list的Integer

E就是图中的list12的泛型类型Number

c就是List

只要实现了Collection接口的都能传,还有传入的类型得是list12 Number的子类或者本身


ArrayList 的remove方法

在使用 remove(Object o) 方法从列表中移除特定对象时,需要传递一个与要移除的对象逻辑上相等的新对象作为参数。这是因为 remove(Object o) 方法会根据对象的相等性来确定要移除的元素

    public static void main5(String[] args) {
        LinkedList<Integer> link = new LinkedList<>();
        link.add(1);
        link.add(2);
        link.add(3);

        ArrayList<Number> list2 = new ArrayList<>(link);
        list2.add(21);
        list2.add(22);
        System.out.println(list2);

        list2.remove(2);
        list2.remove(new Integer(2));
        System.out.println(list2);

    }


ArrayList 的subList方法

    public static void main7(String[] args) {
        LinkedList<Integer> link = new LinkedList<>();
        link.add(1);
        link.add(2);
        link.add(3);

        //不会产生新的对象
        List<Integer> link1 = link.subList(1, 3);
        System.out.println(link1);
        link1.set(0, 99);
        System.out.println(link1);
        System.out.println(link);
    }

如图所示subList方法不是创建一个新的arraylist对象,subList 返回的对象实际上是原始列表的一个引用,它指向原始列表中指定范围的元素,简单说就是把那一段的地址给到了list1


Iterator:迭代器

public static void main11(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

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

使用ArrayList完成杨辉三角

public class Test {
    //杨辉三角
    public static List<List<Integer>> generate(int numRows) {

        List<List<Integer>> ret = new ArrayList<>();//二维数组

        List<Integer> list = new ArrayList<>();//第一行
        list.add(1);
        ret.add(list);//把第一行数据存进二维数组里

        //从第二行开始
        for (int i = 1; i < numRows; i++) {
            List<Integer> curRow = new ArrayList<>();//当前行
            curRow.add(1);//第一个下标设置为1

            List<Integer> preRow = ret.get(i - 1);//上一行

            //下标从一开始,因为已经设置了第一个下标了
            for (int j = 1; j < i; j++) {
                int val = preRow.get(j) + preRow.get(j - 1);
                curRow.add(val);//存进当前行
            }
            curRow.add(1);//当前行循环结束后,最后一个下标设置为1
            ret.add(curRow);//然后把当前添加到ret二维数组里
        }
        return ret;
    }

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

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

相关文章

FileZilla Server 1.8.1内网搭建

配置环境服务器服务器下载服务器配置服务器配置 Server - ConfigureServer Listeners - Port 协议设置 Protocols settingsFTP and FTP over TLS(FTPS) Rights management(权利管理)Users(用户) 客户端建立连接 配置环境 服务器处于局域网内: 客户端 < -访问- > 公网 &l…

猫头虎分享已解决Bug || Invariant Violation in React: Element Type is Invalid ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

HarmonyOS鸿蒙学习基础篇 - 自定义组件(一)

前言 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为系统组件&#xff0c;由开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑与UI分离&#…

987. 二叉树的垂序遍历 - 力扣(LeetCode)

题目描述 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言&#xff0c;其左右子结点分别位于 (row 1, col - 1) 和 (row 1, col 1) 。树的根结点位于 (0, 0) 。 二叉树的 垂序遍历 从最左边的列开始直到…

代码随想录算法训练营第46天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

文章目录 198.打家劫舍思路代码 213.打家劫舍II思路代码 337.打家劫舍III思路代码 198.打家劫舍 题目链接&#xff1a;198.打家劫舍 文章讲解&#xff1a;代码随想录|198.打家劫舍 思路 1.dp[i]:从0打劫到i所获得的最高金额 2.是否打劫第i个决定了dp[i]&#xff1a;如果打劫则…

Unity类银河恶魔城学习记录7-4 P70 Improving sword‘s behaviour源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Colle…

浅谈Linux环境

冯诺依曼体系结构&#xff1a; 绝大多数的计算机都遵守冯诺依曼体系结构 在冯诺依曼体系结构下各个硬件相互配合处理数据并反馈结果给用户 其中控制器和运算器统称为中央处理器&#xff08;CPU&#xff09;&#xff0c;是计算机硬件中最核心的部分&#xff0c;像人类的大脑操控…

【记录】记一次关于前端单元测试的全英文问卷调查( Survey: Automatically Generated Test Suites for JavaScript)

文章目录 OPENING STATEMENTBackgroundTask background: Fix the failing test casesBefore the task: Task: Fix the failing test casesTask: Executable DocumentationBefore the task: Bonus Opportunity: One more taskTask: Test Cases ClusteringRewardThank You! 原地址…

RocketMQ与Kafka架构深度对比

在分布式系统中&#xff0c;消息中间件扮演着至关重要的角色&#xff0c;它们负责在系统组件之间传递消息&#xff0c;实现解耦、异步通信和流量削峰等功能。RocketMQ与Kafka作为两款流行的消息中间件&#xff0c;各自拥有独特的架构设计和功能特性。本文将深入对比分析RocketM…

【机器学习300问】22、什么是超参数优化?常见超参数优化方法有哪些?

在之前的文章中&#xff0c;我主要介绍了学习率 η和正则化强度 λ 这两个超参数。这篇文章中我就主要拿这两个超参数来进行举例说明。如果想在开始阅读本文之前了解这两个超参数的有关内容可以参考我之前的文章&#xff0c;文章链接为你放在了这里&#xff1a; 【机器学习300…

算法沉淀——哈希算法(leetcode真题剖析)

算法沉淀——哈希算法 01.两数之和02.判定是否互为字符重排03.存在重复元素04.存在重复元素 II05.字母异位词分组 哈希算法&#xff08;Hash Algorithm&#xff09;是一种将任意长度的输入&#xff08;也称为消息&#xff09;映射为固定长度的输出的算法。这个输出通常称为哈希…

2024.2.8

1. 现有文件test.c\test1.c\main.c,编写Makkefile Makefile&#xff1a; CCgcc EXEa.out OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -oall:$(EXE)$(EXE):$(OBJS)$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^.PHONY:cleanclean:rm $(OBJS) $(EXE) 2. C编程实现&#x…

HarmonyOS鸿蒙学习基础篇 - Column/Row 组件

前言 Row和Column组件是线性布局容器&#xff0c;用于按照垂直或水平方向排列子组件。Row表示沿水平方向布局的容器&#xff0c;而Column表示沿垂直方向布局的容器。这些容器具有许多属性和方法&#xff0c;可以方便地管理子组件的位置、大小、间距和对齐方式。例如&#xff0c…

netstat命令

netstat 是一个计算机网络命令行工具&#xff0c;用于显示网络连接、路由表和网络接口等网络相关信息。netstat 命令可以在各种操作系统上使用&#xff0c;包括 Windows、Linux 和 macOS 等。 在使用 netstat 命令时&#xff0c;可以提供不同的选项来显示不同类型的网络信息。…

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示 1 纹理 规则和不规则的 2 纹理的用处 从纹理中恢复形状 3 分割与合成 4 分析纹理进行分类 通过识别纹理分析物理性质 如何区分纹理 5 寻找有效的纹理分类方法 发现模式、描述区域内模式 A对应图2 B对应图…

Linux命令行全景指南:从入门到实践,掌握命令行的力量

目录 知识梳理思维导图&#xff1a; linux命令入门 为什么要学Linux命令 什么是终端 什么是命令 关于Linux命令的语法 tab键补全 关于命令提示符 特殊目录 常见重要目录 /opt /home /root /etc /var/log/ man命令 shutdown命令 history命令 which命令 bash…

单链表的介绍

一.单链表的概念及结构 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 结构&#xff1a;根据个人理解&#xff0c;链表的结构就像火车厢一样&#xff0c;一节一节连在一起的&#x…

ClickHouse--07--SQL DDL 操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SQL DDL 操作1 创建库2 查看数据库3 删除库4 创建表5 查看表6 查看表的定义7 查看表的字段8 删除表9 修改表9.1 添加列9.2 删除列9.3 清空列9.4 给列修改注释9.5 修…

深入解析Elasticsearch的内部数据结构和机制:行存储、列存储与倒排索引之倒排索引(三)

当我们谈论Elasticsearch&#xff08;简称ES&#xff09;时&#xff0c;我们经常会提到它的高效搜索能力。而这背后的核心技术之一就是倒排索引。那么&#xff0c;什么是倒排索引&#xff0c;以及它是如何在Elasticsearch中工作的呢&#xff1f; 深入解析Elasticsearch的内部数…

机器学习系列——(二十一)神经网络

引言 在当今数字化时代&#xff0c;机器学习技术正日益成为各行各业的核心。而在机器学习领域中&#xff0c;神经网络是一种备受瞩目的模型&#xff0c;因其出色的性能和广泛的应用而备受关注。本文将深入介绍神经网络&#xff0c;探讨其原理、结构以及应用。 一、简介 神经网…