ArrayList和顺序表(下)

news2024/10/24 4:38:35

1. Java本身提供的ArrayList

        在ArrayList和顺序表(上)那一节里面,我们自己实现了ArrayList的底层大部分代码,在这个基础上,我们就可以开始来了解Java本身提供的ArrayList.

        1.1 ArrayList的三种构造方法

        

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

        我们先来介绍第一和第三个        

        第一个构造方法,如果我们不设置任何参数,这里会直接给我们一个空的Object数组,里面没有大小.

        第二个构造方法,我们指定的容量是合法的,我们就产生一个指定容量大小的数组,

        第三个构造方法,我们必须要理解  Collection<? extends E > c 这个是什么意思

我们来举个例子

所以我们就晓得第二个构造方法的主要用法了:

1. 该集合类必须实现Collection接口

2. 在第一个<>设置的类型必须是第二个<>的子类或者它自己

这样就能实现直接把另一个实例的内容作为我新的实例的内容.

          我们来看代码:

public static void main(String[] args) {
        //ArrayList第二个构造方法 ,要求必须实现Collection,并且放进去的东西是子类(这个搞清楚是谁的子类)
        ArrayList<Integer> list = new ArrayList<>();//TODO 虽然没有分配内存
        list.add(1);//TODO 结论1.但是第一次Add的时候会分配大小为10的内存
        list.add(2);//TODO 结论2.如果超过了,就会1.5倍自动扩容
        list.add(3);//添加元素
        list.add(0,99);
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
        System.out.println();
        //相当于直接把一组数据放进来了
        ArrayList<Number> list2 = new ArrayList<>(list);//Integer是Number的子类,因此可以放进来
        LinkedList<Integer> list1 = new LinkedList<>();
        list1.add(1);
        list1.add(2);
        list1.add(4);
        ArrayList<Number> list3 = new ArrayList<>(list1);//Integer是Number的子类,因此可以放进来
        list3.add(1123);
        list3.add(1124);
        System.out.println(list3);
        System.out.println(list1);
}

        我们主要要主要这个        

        我们可以来看看源码(了解即可)

        结论:

1. 我们在创建ArrayList实例的时候,不设置参数,我们调用的是无参构造方法,里面是一个空的数组,没有分配内存.

2. 当第一次add的时候,我们才会分配大小为10的内存

3. 如果add方法检测出size大小等于数组大小,就会进行1.5倍的扩容

        1.2 ArrayList方法的介绍

       

方法解释
boolean add(E e)在最后一个有效数据后面插入e
void add(int index,E e)把插入到index位置
void 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 e)把下标index位置元素设置为e
E clear() 清空
boolean contains(Object o)判断o是否在线性表里面
int indexOf(Object o)返回第一个o所在的下标
int lastIndexOf(Object o)返回最后一个o的下标
List<E> subList(int fromIndex,int toIndex)截取部分list

我们来使用一下这些方法

   

public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<>();
    ArrayList<Number> list1 = new ArrayList<>();
    list.add(1);//TODO add的使用
    list.add(2);
    list.add(3);
    list.add(10);
    list.add(9);
    list.add(90);
    list.add(90);
    list.add(2,54);
    list1.addAll(list);
    //我们是可以直接通过list打印,因为它实现的一个接口重写了toString方法
    System.out.println("list:"+list);
    System.out.println("list1:"+list1);
    System.out.println("=============");
    list.remove(1);//TODO remove的使用
    list.remove(new Integer(3));
    System.out.println("list:"+list);
    System.out.println("==========");
    System.out.println(list.get(2));//TODO get的使用
    list.set(3,190);//TODO get的使用
    System.out.println("list:"+list);
    System.out.println("==========");
    System.out.println(list.contains(1));//TODO contains的使用
    System.out.println(list.indexOf(90));//TODO indexOf的使用
    System.out.println(list.lastIndexOf(90));//TODO lastIndexOf的使用
    System.out.println(list);
    list.clear();
    System.out.println(list);
}
list:[1, 2, 54, 3, 10, 9, 90, 90]
list1:[1, 2, 54, 3, 10, 9, 90, 90]
=============
list:[1, 54, 10, 9, 90, 90]
==========
10
list:[1, 54, 10, 190, 90, 90]
==========
true
4
5
[1, 54, 10, 190, 90, 90]
[]

我们需要注意的几个地方

addAll()里面我们放的是一个Number类型或者其子类的对象

remove里面,如果我们是想移除一个数,而不是移除下标的数,我们里面的参数就是引用类型的对象

list.remove(new Integer(3));

还有一个方法

List<E> subList(int fromIndex,int toIndex)

public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    List<Integer> list1 = list.subList(0,2);
    System.out.println("list1" + list1);
    System.out.println("list" + list);
    System.out.println("====");
    list1.add(123);
    list1.set(0,99);
    System.out.println("list1" + list1);
    System.out.println("list" + list);
}
list1[1, 2]
list[1, 2, 3, 4]
====
list1[99, 2, 123]
list[99, 2, 123, 3, 4]

        我们可以得到一下几个结论:

        1. subList的参数设置是[第一个参数,第二个参数)

        2. subList的返回值是一个List类型的

        3. 我们subList方法并不会产生一个新的对象,而是直接把list的地址传给了list2,因此我们操作list2的时候list也会发生改变 

         1.3 ArrayList的遍历

        ArrayList可以通过四种方式来进行遍历,直接打印对象名字,for循环,foreach,使用迭代器

        1> 我们直接通过打印对象名

                

        2> 我们通过for循环来打印

        3> 我们通过foreach来打印       

        4> 我们通过迭代器进行打印

         使用迭代器来遍历集合类,我们只需要实现Iterable接口即可

由下图可知,ArrayList是实现了Iterable接口的

        

因为迭代器写法我们比较陌生,我们再来看看它的形式

Iterator<引用数据类型> 对象名 = 实现了Iteratable接口的对象.Iterator();

whie(对象名.hasNext()) {
                System.out.print(it.next()+" ");

}      

2. 练习题

        2.1 杨辉三角

        题目:

        我们在写这个题目之前先了解一下List的二维数组的写法

解题步骤

1. 我们先处理第一行的数据,第一行就是1,我们直接把一维数组的第一行数据设置为1,然后把第一行放到二维数组里面

2. 从第2行开始我们开始计算每个list中的数据

        我们先准备当前行的数据,就需要一个List类型的一维数组,然后我们放入每一行的第一个元素,就是1,然后我们构造每一行中间的数据,我们需要获得上一行的数据,我们通过ret.get(i-1)获得上一行,然后构造下一行的中间数据,通过preRow.get(j-1),preRow.get(j)来获得上一行元素的前一个,和上一行的正上方一个,然后把他们相加就是本行数据的值,然后我们把它加入到当前行里面去.

3. 把1加入到当前行的最后一个位置

4. 把当前行加入到ret二维数组里面去

        整体代码

class YangHuiTriangle {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret = new ArrayList<>();
        List<Integer> list = new ArrayList<>();
        //TODO 1.先处理第一行的数据
        list.add(1);//每一行代表一个list,第一行放的元素是1
        ret.add(list);//把第一行放入二维数组
        //TODO 2.从第2行开始计算每个list中的数据
        for (int i = 1 ; i < numRows ;i++) {
            //TODO 3.先准备当前行数据
            List<Integer> curRow = new ArrayList<>();
            //TODO 4.当前行的第一个数据
            curRow.add(1);
            //TODO 5.准备当前行的中间元素:上一行的前一个,上一行的正上方一个
            //找到前一行
            List<Integer> preRow = ret.get(i - 1);
            //构造下一行
            for (int j = 1 ; j < i ; j++) {
                //通过get方法来获取顺序表里面的值
                int val = preRow.get(j)+preRow.get(j-1);
                //然后放进当前行里面
                curRow.add(val);
            }
            //TODO 6.准备当前行的最后一个数据
            curRow.add(1);
            //TODO 7.当前行放进ret二维数组里面
            ret.add(curRow);
        }
        return ret;
    }
}

        2.2 简单的洗牌算法

        主要的步骤

        1. 生成一副扑克牌

        2. 洗牌

        3. 发牌

我们规定3个人来抓牌,每个人轮流抓5张(一共抓了15张牌

        我们先构造出Card这个类,一个牌时由花色和数字组成的,我们在这个类里面设置这俩个属性,

并且提供相应的构造方法.又因为是private 修饰的,我们需要为这俩个属性设置set和get方法,并且我们重写了toString方法.

public class Card {
    private String suit;//花色
    private int rank;//数字

    public Card(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;
    }
    //打印牌,需要toString方法

    @Override
    public String toString() {
        return suit+": " + rank+" ";
    }
}

 然后我们写一个cardDemo类来对Card进行构造



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

public class  CardDemo {
    //四种花色
    private final String[] suits = {"♥","♠","♦","♣"};
    
    //买牌
    public List<Card> buyCard() {
        List<Card> cardList = new ArrayList<>();
        //TODO 1.生成牌
        for (int i = 0; i < 4; i++) {//花色
            for (int j = 1; j <= 13; j++) {//数字
                Card card = new Card(suits[i],j);//每一张花色产生13个数字
                cardList.add(card);//把创建出来的每一张牌都放进去
            }
        }
        return cardList;
    }
    //TODO 2.洗牌
    public List<Card> shuffle(List<Card> cardList) {
        Random random = new Random();
        //我们从最后面开始,第50张和前面49张进行随机交,然后第49张和前面48张进行交换
        for (int i = cardList.size() - 1; i > 0 ; i--) {
            int index = random.nextInt(i);
            // 我们把 index 和 i 进行交换
            swap(cardList,i,index);
        }
        return cardList;
    }
    private void swap(List<Card> cardList,int a,int b) {
        Card stm = cardList.get(a);
        cardList.set(a,cardList.get(b));
        cardList.set(b,stm);
    }
    //TODO 3.发牌,三个人,每人轮流揭牌5张
    public void getCard(List<Card> cardList) {
        //每个人相当于一个一维的Card数组
        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();
        List<Card> hand3 = new ArrayList<>();
        List<List<Card>> hands = new ArrayList<>();
        hands.add(hand1);
        hands.add(hand2);
        hands.add(hand3);
        //3个人轮流抓五张
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Card card = cardList.remove(0);//去除每一张摸走的牌
                hands.get(j).add(card);//发给每个人
            }
            System.out.println("第一个人的牌: ");
            System.out.println(hand1);
            System.out.println("第二个人的牌: ");
            System.out.println(hand2);
            System.out.println("第三个人的牌: ");
            System.out.println(hand3);
            System.out.println("剩下的牌: ");
            System.out.println(cardList);
        }

    }
}

我们分段进行解析这个代码:

1. 生成牌

        我们需要四种花色              

        每个花色有13张牌因此俩层循环嵌套,然后用Card来创建每一张牌,并且把每一张card放进cardList里面去

2. 洗牌

        我们从最后面开始,假设是第50张牌,我们就让它和前面49张牌随机一张进行交换

3. 发牌

        我们每一个人相当于一个Card数组,因此List<Card> hand1 = new ArratList<>();然后我们再生成一个二维数组hands,然后3个人轮流抓五张牌,每次抓一张牌就要把cardList的牌数减少一张(0),表示我们从最上面开始抓

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

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

相关文章

‌ComfyUI 高级实战:实现华为手机的AI消除功能

大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 不知道大家是否还记得华为 Pura 70的「AI消除」事件&#xff0c;当时使用 华为Pura 70 系列手机的智能消除功能时&#xff0c;该功能可以被用来消除照片中女性胸口处的衣物&#xff0c;这一功能曾引发广泛的关注和伦…

OpenAI Canvas最新发布,编程和写作迎来全新史诗级加强!

文章目录 零、前言一、GPT-40 with canvas操作指导写作领域加强建议编辑调整长度阅读水平添加最后的润色添加表情 编程领域加强选中代码问问题添加评论&#xff08;添加注释&#xff09;添加日志转换语言代码审查 二、感受 零、前言 最新消息&#xff0c;国庆期间OpenAI有大动…

使用管理员删除垃圾文件

1、先设置为管理员权限 2、执行删除文件命令 使用&#xff1a;del /f /s /q “文件夹位置”例如&#xff1a;del /f /s /q "C:\Program Files (x86)\my_code\.git"

2024深圳秋季糖酒会参会攻略!建议收藏

10月29日-31日&#xff0c;第111届全国糖酒商品交易会将在深圳国际会展中心&#xff08;宝安&#xff09;举办。本届糖酒会将邀请来自超四十个国家和地区的超4200家行业厂商和20万国内外专业观众到会交易交流&#xff0c;为食品酒类行业搭建一个集展示、交易、交流、合作于一体…

IP- guard产品版本升级指引详解

一、IP-guard服务器升级步骤 1、下载升级包(IPgUpgrade版本号.zip) 到IP-guard服务器 2、解压升级包,右键以管理员身份运行 (1)“升级包”解压 (2)右键以管理员身份运行“升级包” ࿰

报表工具如何助力企业报表开发?如何选择最适合的报表工具?一篇文章统统解答!

在当今瞬息万变的商业格局中&#xff0c;企业信息化建设已成为驱动业务飞跃与增强核心竞争力的核心引擎。然而&#xff0c;伴随业务数据的井喷式增长&#xff0c;企业在数据治理与价值挖掘方面遭遇了前所未有的挑战。数据孤岛、处理流程冗长、对业务动态调整反应迟缓&#xff0…

Leetcode 分割等和子集

这段代码的目的是解决 LeetCode 416 问题&#xff1a;分割等和子集&#xff0c;即判断一个只包含正整数的数组&#xff0c;是否能够将其分割成两个子集&#xff0c;使得这两个子集的元素和相等。 算法思想&#xff08;动态规划 - 背包问题&#xff09; 该问题本质上是一个经典…

Facebook减肥产品广告投放攻略

有不少刚开始投放facebook广告的小伙伴会感到疑惑&#xff0c;为什么别人的减肥产品跑的风生水起&#xff0c;销量羡煞旁人&#xff0c;自己的广告要不就是被拒要不就是没有流量&#xff0c;甚至还可能被封号&#xff0c;如果你也有这样的困扰&#xff0c;那一定要看完这篇文章…

组合式API有什么好处

什么是组合式API&#xff1f; 组合式 API (Composition API) 是一系列 API &#xff08;响应式API、生命周期钩子、依赖注入&#xff09;的集合。它不是函数式编程&#xff0c;组合式 API 是以 Vue 中数据可变的、细粒度的响应性系统为基础的&#xff0c;而函数式编程通常强调…

使用Python进行Web开发的15个框架指南

引言 在Python Web开发领域&#xff0c;有许多不同类型的框架可供选择&#xff0c;从轻量级到全功能型&#xff0c;再到专注于异步处理的框架。本文将介绍多个Python Web框架&#xff0c;帮助开发者根据具体需求选择合适的工具。 1.Flask&#xff1a;轻量级Web框架 Flask是一…

【C语言】深入理解指针(三)(下)

本篇文章将讲解以下知识&#xff1a; 1、二维数组传参的本质 2、函数指针变量 3、函数指针数组 1、二维数组传参的本质 有了数组指针的理解&#xff0c;我们就能弄清楚二维数组传参的本质了 例如&#xff1a; 在一维数组中&#xff0c;数组名是数字首元素的地址。但有两个例外…

【进阶OpenCV】 (10)--光流估计--->描绘运动物体轨迹

文章目录 光流估计一、基本原理二、计算步骤三、实现步骤1. 处理第一帧2. 寻找特征点3. 创建全零掩膜4. 流光估计函数介绍5. 主循环处理视频的每一帧5.1 流光估计5.2 绘制轨迹5.3 生成最终图像5.4 更新旧灰度图和旧特征点 6. 释放资源 总结 光流估计 光流估计是计算机视觉中的…

操作系统——磁盘管理

目录 前言基础实例1.1读取磁盘数据计算时间1.2磁盘调度算法1.3单双缓冲区1.4磁盘基础知识 前言 本文简述操作系统中有关磁盘的相关知识点&#xff0c;作为软件设计师考试资料复习 基础 磁盘管理是指对计算机中的磁盘进行有效地管理和使用的过程。磁盘管理包括以下方面&#…

软件测试工程师面试整理 —— 操作系统与网络基础!

在软件测试中&#xff0c;了解操作系统和网络基础知识对于有效地进行测试工作至关重要。无论是在配置测试环境、调试网络问题&#xff0c;还是在进行性能测试和安全测试时&#xff0c;这些知识都是不可或缺的。 1. 操作系统基础 操作系统&#xff08;Operating System, OS&am…

【Redis】网络模型(day10)

在本篇文章中&#xff0c;主要是对五种网络模型进行一个简单的介绍&#xff0c;然后对Redis4.0和6.0的网络模型进行一个概述。 用户空间和内核空间 在Linux系统上&#xff0c;分为用户空间、内核空间和硬件设备。硬件设备主要包括CPU、内存、网卡等物体&#xff0c;内核应用去…

垃圾回收器和垃圾回收机制(简单介绍,用于回忆总结)

文章目录 垃圾回收机制1. 分代收集2. 标记复制3. 标记清除4. 标记压缩&#xff08;整理&#xff09; 垃圾回收器1. Serial / Serial Old2. Parallel Scavenge3. ParNew收集器4. CMS收集器5. G1收集器 参考链接 垃圾回收机制 1. 分代收集 分代收集&#xff08;Generational Co…

吉时利KEITHLEY 2657A源表keithley2651A数字源表

Keithley 2657A 源表是一款高电压、高功率、低电流源测量单元 (SMU) 仪器&#xff0c;可提供前所未有的功率、精度、速度、灵活性和易用性&#xff0c;以提高研发、生产测试和可靠性环境中的生产力。 Keithley 2657A SourceMeter 仪器专门设计用于表征和测试高压电子器件和功率…

【隐私计算篇】一种批量匿踪查询友好算法PIRANA的原理分析

1. 背景分析 前段时间开展了批量匿踪查询算法迭代优化的工作&#xff0c;取得了一些进展。不得不说&#xff0c;甲方爸爸永远会提出非常有挑战性的目标&#xff0c;push你去想各种解决方案。在实际的算法研发落地上&#xff0c;我们会结合算法本身的机制改进以及工程优化这两方…

力扣hot100--二叉树

目录 二叉树 1. 94. 二叉树的中序遍历 2. 98. 验证二叉搜索树 3. 101. 对称二叉树 二叉树 1. 94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示…

[ComfyUI]最好用的图像提示词反推工具发布 2.0 版本啦!更好用了!

图像提示词反推工具我也介绍了好一些了&#xff0c;但是架不住技术一直在迭代啊&#xff01;过一段时间就出一个新的&#xff0c;或者是升级版&#xff0c;所以我们的分享也不能停&#xff01; 前段时间 joy_caption 蛮火的&#xff0c;不过后来也陆陆续续出了一些比较好用的反…