List-顺序表--2

目录

1、ArrayList

2、ArrayList构造方法

3、ArrayList常见方法

4、ArrayList的遍历

5、ArrayList的扩容机制

6、ArrayList的具体使用

6.1、杨辉三角

6.2、简单的洗牌算法


1、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底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

2、ArrayList构造方法

底层代码分析:

1. 带一个参数的构造方法,初始化 ArrayList 时可以指定初始容量

2. 不带参数的构造方法,初始化时分配的是一个空数组

既然没有分配内存,那这个 ArrayList 对象是如何存数据的呢?

^

继续查看 add 方法的原码,得出结论:

结论1:虽然初始化时没有分配内存,但是第一次 add 的时候会分配大小为10的内存

结论2:对于ArrayList来说,当容量满了,采用的扩容方式是1.5倍扩容

^

3. 有通配符的构造方法

参数列表的含义:

Collection:表示传入的参数是 Collection 类型的,实现了Collection接口的类型也可以

<? extends E>:通配符上界,这里表示可以传入的参数类型是 E 或者 E 的子类

^

例如:

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

ArrayList<Number> list1 = new ArrayList<>(list);

首先,list 是实现了 Collection 接口的,?:Integer ;E: Number,Integer 是 Number 的子类,list 满足这两个条件,所以可以作为参数正确执行。相当于把 list 表中数据打包给到 list

    public static void main(String[] args) {LinkedList<Integer> list1 = new LinkedList<>();list1.add(1);list1.add(2);list1.add(3);ArrayList<Number> list2 = new ArrayList<>(list1);list2.add(99);list2.add(88);System.out.println(list2); // 输出 [1,2,3,99,88]}

3、ArrayList常见方法

    public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);ArrayList<Number> list123 = new ArrayList<>();list123.addAll(list); // 与上述第三个构造方法类似System.out.println(list123);//123list123.remove(2); // 删除 2 位置元素list123.remove(new Integer(2)); // 删除遇到的第一个 2System.out.println(list123);//23list123.get(0);list123.set(1,2);list123.contains(1);list.add(4);list.add(5);//并不会产生新的对象!List<Integer> list1 = list.subList(1,3); // [1,3)System.out.println(list1);System.out.println("==============");list1.set(0,99);System.out.println(list1);System.out.println(list);}

上述 subList 方法执行结果:

list1:  [99,3]

list:    [1, 99, 3,4, 5]

发现通过 list1 修改,list 也会发生改变,所以 subList 的执行过程并不会产生新的对象,在这个案例中,list1 的起始位置指向 list 的 1 下标

4、ArrayList的遍历

1. for循环+下标

public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用下标+for遍历for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}System.out.println();
}

2. foreach

^

for(Integer x : list) {
    System.out.print(x+" ");

}
System.out.println();

3. 迭代器

只有实现了 literable 接口的类型,才能使用迭代器;Map 就不能使用,因为他没有实现 literable 接口

Iterator<Integer> it = list.iterator();    --  通用迭代器

Iterator<Integer> it = list.listIterator();    --  List 的专属迭代器

^

//使用 迭代器 遍历集合类 list
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next()+" ");

}

注意:ArrayList最长使用的遍历方式是:for循环+下标 以及 foreach 

5、ArrayList的扩容机制

在上述构造方法中,通过查看 add 方法的底层代码得出结论:ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容

底层代码总结:

1. 检测是否真正需要扩容,如果是调用grow准备扩容
2. 预估需要库容的大小

  • 初步预估按照1.5倍大小扩容
  • 如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容
  • 真正扩容之前检测是否能扩容成功,防止太大导致扩容失败

3. 使用copyOf进行扩容

6、ArrayList的具体使用

6.1、杨辉三角

力扣118

分析 List<List<Integer>> 

class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> ret = new ArrayList<>();// 1. 先处理第一行List<Integer> list = new ArrayList<>();list.add(1);ret.add(list);// 2. 从第2行开始计算 每个list当中的数据for(int i = 1;i < numRows;i++) {// 3. 先准备当前行数据List<Integer> curRow =  new ArrayList<>();// 4. 准备当前行的第一个数据curRow.add(1);// 5. 准备当前的中间数据List<Integer> prevRow = ret.get(i-1); // 拿到上一行的数据for(int j = 1; j < i;j++) {// 上一行的当前列 + 上一行的前一列int val = prevRow.get(j) + prevRow.get(j-1);curRow.add(val);}// 6. 准备当前行最后一个数据curRow.add(1);// 7. 把这个数据放到二维数组当中去ret.add(curRow);}return ret;}
}

6.2、简单的洗牌算法

实现这个算法要解决的问题:

1.买一副牌【要生成一副扑克牌】放到哪里?

2.洗牌,怎么洗?

3.揭牌,每个人轮流抓5张牌,怎么抓牌?抓的牌放到哪里?

1. 创建一个 card 类,定义 花色 和 数字 两个属性;生成 get 和 set 方法;生成toString方法

package card;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;}@Overridepublic String toString() {return suit+":"+rank+" ";}
}

2. 创建 CardDemo 和 Test 类;CardDemo类中定义一个买牌的方法,在Test类中测试

    一共52张牌 1-k,其中1对应A、J对应11、Q对应12、K对应13

 3. 在CardDemo 类中再定义一个花色类,并完善buyCard方法

4. 买完牌后洗牌,这里使用生成随机数的方式,从最后一张牌开始,与随机生成的牌交换

5. 揭牌,3个人每人轮流揭5张,每次揭1张

把三个人的关系用一个二维数组表示

每揭一张牌,就把整副牌的0下标位置删除

CardDemo 类的完整代码

public class CardDemo {private  final String[] suits = {"♥","♠","♦","♣"};/*** 52张 1-K*      J   Q  K*      11 12 13* @return*/public List<Card> buyCard() {List<Card> cardList = new ArrayList<>();for (int i = 0; i < 4; i++) {for (int j = 1; j <= 13; j++) {Card card = new Card(suits[i],j);cardList.add(card);}}return cardList;}public void shuffle(List<Card> cardList) {Random random = new Random();for (int i = cardList.size()-1; i > 0; i--) {int index = random.nextInt(i);//index  i 交换swap(cardList,i,index);}}private void swap(List<Card> cardList,int a,int b) {Card tmp = cardList.get(a);cardList.set(a,cardList.get(b));cardList.set(b,tmp);/*** tmp = a* a = b* b = tmp*/}/*** 揭牌* 3个人 每个人轮流揭牌5张* @param cardList*/public void getCard(List<Card> cardList) {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个人 轮流抓牌5张 每次揭牌1张for (int i = 0; i < 5; i++) {//j代表人for (int j = 0; j < 3; j++) {Card card = cardList.remove(0);hands.get(j).add(card);}}System.out.println("第1个揭牌如下:");System.out.println(hand1);System.out.println("第2个揭牌如下:");System.out.println(hand2);System.out.println("第3个揭牌如下:");System.out.println(hand3);System.out.println("剩下的牌:");System.out.println(cardList);}
}

Test 类中代码

public class Test {public static void main(String[] args) {CardDemo cardDemo = new CardDemo();List<Card> cardList =  cardDemo.buyCard();System.out.println("买的牌如下:");System.out.println(cardList);System.out.println("洗牌:");cardDemo.shuffle(cardList);System.out.println(cardList);System.out.println("揭牌:");cardDemo.getCard(cardList);}
}

7、顺序表的优缺点

缺点:

  1. 插入数据必须移动其他数据,最坏情况下,就是插入到0位置。时间复杂度O(N)
  2. 删除数据也需要移动数据,最坏情况下,就是删除0位置。时间复杂度O(N)
  3. 扩容之后有可能会浪费空间

优点:在给定下标进行查找的时候,时间复杂度O(1)

总结:顺序表比较适合进行给定下标查找的场景。

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

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

相关文章

lambda用法及其原理

目录 lambda形式lambda用法1.sort降序2.swap3.捕捉列表 习题解题 lambda形式 [capture-list](parameters)->return type{function boby}[capture-list]&#xff1a;[捕捉列表]用于捕捉函数外的参数&#xff0c;可以为空&#xff0c;但不能省略&#xff1b;(parameters) &am…

基于ASP.NET的动漫网站

一、系统架构与技术实现 系统架构&#xff1a;基于ASP.NET的MVC框架构建&#xff0c;实现网站的层次结构&#xff0c;使得网站更加易于维护和扩展。 技术实现&#xff1a;利用ASP.NET的技术特点&#xff0c;如强大的后端开发能力、丰富的UI控件等&#xff0c;结合前端技术如HT…

用 HTML5 Canvas 和 JavaScript 实现流星雨特效

最近在研究前端动画效果时,实现了一个超酷的流星雨特效,今天来和大家分享下具体实现过程。 1,整体实现思路 这个流星雨特效主要由 HTML、CSS 和 JavaScript 协同完成。HTML 搭建基础结构,CSS 负责页面样式设计,JavaScript 实现星星和流星的动态效果。 效果展示: 用 HTM…

AI中的神经元与权重矩阵之间的关系;神经元连接角度看行和列的意义

AI中的神经元与权重矩阵之间的关系 目录 AI中的神经元与权重矩阵之间的关系神经元连接角度看行和列的意义AI中的神经元概念 在人工智能领域,特别是神经网络中,神经元是基本的计算单元,它是对生物神经元的一种抽象模拟。就像生物神经元接收来自其他神经元的电信号,经过处理后…

Visual studio code编写简单记事本exe笔记

安装扩展cmake tools c/c c/c Extension pack CMakeLists.txt cmake_minimum_required(VERSION 3.20) project(NotepadApp)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)# Windows specific settings if(WIN32)set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)s…

Linux 35.6 + JetPack v5.1.4之编译 pytorch升级

Linux 35.6 JetPack v5.1.4之编译 pytorch升级 1. 源由2. 升级步骤1&#xff1a;获取二进制版本步骤2&#xff1a;安装二进制版本步骤3&#xff1a;获取torchvision步骤4&#xff1a;安装torchvision步骤5&#xff1a;检查安装版本 3. 使用4. 补充4.1 torchvision版本问题4.2 …

计算机网络--根据IP地址和路由表计算下一跳

一、必备知识 1.无分类地址IPV4地址网络前缀主机号 2.每个IPV4地址由32位二进制数组成 3. /15这个地址表示网络前缀有15位&#xff0c;那么主机号32-1517位。 4.地址掩码&#xff08;子网掩码&#xff09;&#xff1a;所对应的网络前缀为1&#xff0c;主机号为0。 5.计算下…

欧几里得算法(简单理解版,非严格证明)

欧几里得算法用于求解两个整数的最大公约数&#xff0c;又称为辗转相除 依据的基本定理&#xff1a; GCD(a,b)GCD(a%b,b) 证明&#xff1a; 对于搞理论的人可能需要会严格证明&#xff0c;但是对于我们一般人而言&#xff0c;只要能理解其原理并记住即可&#xff0c;后者实际上…

插入式微型机顶盒来了

快科技1月6日消息&#xff0c;据国家广播电视总局今日消息&#xff0c;国家广播电视总局为首款以插入式微型机顶盒品类通过入网检测的设备颁发了入网认定证书。 这是插入式微型机顶盒批量部署进程中的又一大进展。同时&#xff0c;广播电视科学研究院依据行业标准建成了插入式…

lamda表达式

提示&#xff1a;文章 文章目录 前言一、背景在使用lambda的时候&#xff0c;有几个参数是可以直接省略的&#xff1a; 二、题目问题探究 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; lamda表达式 一、背景 看c科二的时候有看到lamda表达式&#xff0c;就再次看了…

XXL-RPC v1.8.1 | RPC服务框架

Release Notes 1、【安全】序列化安全性增强&#xff0c;默认开启package安全空间机制&#xff1b;2、【扩展】序列化扩展性增强&#xff0c;支持自定义序列化package白名单&#xff1b;3、【优化】序列化类型主动检测&#xff0c;提升问题定位效率&#xff1b;4、【能力】服务…

前端路由layout布局处理以及菜单交互(三)

上篇介绍了前端项目部署以及基本依赖的应用&#xff0c;这次主要对于路由以及布局进行模块化处理 一、 创建layout模块 1、新建src/layout/index.vue <template><el-container class"common-layout"><!-- <el-aside class"aside">&l…

Spring Boot(4)使用 IDEA 搭建 Spring Boot+MyBatis 项目全流程实战

文章目录 一、⚡搞个引言二、⚡开始搭建 Spring Boot 项目吧&#xff01;2.1 启动 IDEA 并创建新项目2.2 选择项目依赖2.3 完成项目创建 三、&#x1f4d8;项目结构剖析四、✍配置数据库连接五、✍ 创建 MyBatis 相关组件5.1 实体类&#xff08;Entity&#xff09;5.2 Mapper 接…

使用wujie搭建微前端应用及踩坑

线上演示地址&#xff1a;wujie-app 源码地址&#xff1a;https://github.com/Jiang-K-J/micro-app?tabreadme-ov-file &#xff08;如果觉您得有用&#xff0c;请帮忙点个小星星&#xff09; 主应用&#xff1a;vue2webpack 子应用&#xff1a;vue3vite 子应用&#xff1…

【数据可视化-11】全国大学数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

141.《mac m1安装mongodb详细教程》

文章目录 下载从官网下载安装包 下载后双击解压出文件夹安装文件名修改为 mongodb配置data存放位置和日志log的存放位置启动方式一方式二方式二:输入mongo报错以及解决办法 本人电脑 m2 pro,属于 arm 架构 下载 官网地址: mongodb官网 怎么查看自己电脑应该下载哪个版本,输入…

frameworks 之 Winscope 工具

frameworks 之 Winscope 工具 1. 手机端开启2. 加载追踪的文件2.1 Android12 3. 分析文件 Winscope 是一款 Web 工具&#xff0c;可以让用户在动画和转换期间和之后记录、重放和分析多个系统服务的状态。Winscope 将所有相关的系统服务状态记录在一个跟踪文件中。使用带有跟踪文…

在日期字段中自动插入斜杠“/”的最佳方法是什么

我正在尝试向输入日期字段添加功能&#xff0c;以便当用户输入数字时&#xff0c;自动添加斜杠“/”。 所以假设我有以下 html&#xff1a; <input type"text" id"fooDate" />假设我有以下 javascript&#xff1a; var dateField document.getElem…

极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现

极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现 目录 极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现1. 极限学习机 (ELM) 算法概述1.1 单隐层前馈神经网络1.2 ELM的优势2. ELM的核心技术2.1 模型定义2.2 随机初始化2.3 最小二乘法2.4…