day14_集合

今日内容

零、 复习昨日
一、集合框架体系
二、Collection
三、泛型
四、迭代
五、List(ArrayList、LinkedList)

零、 复习

throw和throws什么区别

throwthrows
位置方法里面方法签名上
怎么写throw + 异常对象throws+异常类名(多个)
作用真正抛出异常对象声明抛出的异常类型

运行时异常有哪些,什么特点

  • 运行时异常,查异常类是否继承自RuntimeException
  • 特点: 不用主动处理
  • 别称: 不受检查异常

编译期异常有哪些,什么特点

  • 只要不是RuntimeException及其子类,那都是编译期
  • 特点: 必须处理
  • 别称: 受检查异常(CheckedException)

异常的处理方式哪些,什么区别

  • 抛出,代码停止
  • 捕获,代码继续

finally干什么的

  • 放在最后执行,其中写的释放资源的代码

一、集合框架体系

数组: 是一个容器,用来存放数据的

  • 定长
  • 只能存储同一种数据类型的数据
  • int[] 可以存储int值,Student[] 可以存储引用类型
  • 只有一个length属性,没有方法,使用时功能简单

集合: 是一个容器,用来存放数据的

  • 不定长
  • 存各种各样类型
  • 只能存储引用类型
  • 提供了操作数据的各种方法

集合体系

image-20230731093616057

今天主要学习Collection,List,ArrayList,LinkedList…

二、Collection

Collection是单列集合层次结构中的根接口
一些 集合允许有重复的元素,而另一些则不允许。一些 集合是有序的,而另一些则是无序的
Collection下面的一些子实现类有些有重复元素,有些没有,有些可以有序,有些无序

方法: 每个都很常见,很重要

ps: Collection是接口,不能创建对象,为了演示这些API,需要使用子实现类,使用最常用的ArrayList集合来实现方法

    public static void main(String[] args) {// Collection是接口,不能直接创建对象// 但是当做父引用指向子类对象Collection col = new ArrayList(); // 向上转型// 存放元素 add(Object o)col.add(1);// 1--> 自动装箱Integer对象 --> Objectcol.add("a");col.add(new Date( ));System.out.println(col );// 再创建集合Collection col2 = new ArrayList();col2.add(11);col2.add(22);col2.add(33);// 批量添加 addAll(Collection c)col.addAll(col2);// 将参数与集合中的所有数据都添加到当前集合System.out.println(col );// 移除元素// boolean remove(Object o) 删除指定元素boolean r1= col.remove(-11);System.out.println("删除是否成功:" + r1 );System.out.println("删除后: "+col );// boolean removeAll(Collection<?> c)// 批量删除// col.removeAll(col2);// 删除指定数据// System.out.println("批量删除后: " + col );// 保留全部(反向删除)// boolean retainAll(Collection<?> c)col.retainAll(col2);// 保留指定数据,删除其他数据System.out.println("保留全部"+col );// 删除全部数据(清空)// col.clear();// System.out.println("清空: "+col );// 获得集合大小(尺寸/容量)int size = col.size( );System.out.println(size );// 判断集合是否为空(没有元素,长度为0即为空)boolean empty = col.isEmpty( );System.out.println(empty );// 判断集合是否包含指定元素// containsboolean contains = col.contains(11);System.out.println("是否包含:" + contains );}

三、迭代[重要]

迭代 (遍历), 将集合元素迭代,目的是取出元素.

    public static void main(String[] args) {Collection col = new ArrayList(  );col.add(1);col.add(2);col.add(3);col.add(4);col.add(5);col.add(6);// 遍历(迭代)集合// 1) 获得迭代器Iterator iterator = col.iterator( );// 2) 通过迭代器完成迭代(遍历)while(iterator.hasNext()){// hasNext() 判断有无下一个Object o = iterator.next( );// next()取出下一个元素System.out.println(o );}}

image-20230419105956171

增强for循环(foreach)

  public static void main(String[] args) {Collection col = new ArrayList(  );col.add(1);col.add(2);col.add(3);col.add(4);col.add(5);col.add(6);// 遍历(迭代)集合// 1) 获得迭代器Iterator iterator = col.iterator( );// 2) 通过迭代器完成迭代(遍历)while(iterator.hasNext()){// hasNext() 判断有无下一个Object o = iterator.next( );// next()取出下一个元素System.out.println(o );}// 使用增强for循环,改写迭代器遍历/*** for(数据类型 变量:集合/数组){** }* 1) 冒号右边是写要被遍历的集合或者数组对象* 2) 每次从集合或者数组取出的值赋值给左边变量*/System.out.println("-------" );for (Object o : col){System.out.println(o );}System.out.println("----------" );int[] arr = {11,22,33,44};for (int i : arr){System.out.println(i );}}

四、泛型

泛型在集合中主要是用来规定数据类型的.

语法: 设计时 <类型> , 例如<E> <K> ,<K,V> <T>
ps: E,K,V,T这些都是见名知意的简写,其实是可以随意写的

​ 使用时(创建类对象)指定泛型,即指定明确的数据类型<String> <Integer>

作用:

  • 约束集合存储的数据类型
  • 避免数据类型转换
   public static void main(String[] args) {// 没有泛型Collection col = new ArrayList();// 类型没有限制col.add(1);col.add("2");col.add(1.1);// for (Object o : col){//     String s = (String) o;// }// 使用泛型Collection<String> col2 = new ArrayList<>();// 就可以限制数据类型col2.add("A");col2.add("B");for (String s : col2){System.out.println(s );}// 使用泛型Collection<Integer> col3 = new ArrayList<>();col3.add(1);col3.add(2);col3.add(3);for (Integer i : col3){System.out.println(i );}/*** 为什么要用泛型?* 1) 经验: 虽然集合可以存储多种数据类型,但是大部分场景都是只存同一种数据* 2) 最主要的原因是: 没有泛型,类型太杂,需要使用指定类型还需要强制*    但是强制还容易报错*    所以:泛型的好处就会可以约定数据类型,从而减少数据类型转型*/}

泛型: 可以研究泛型类,泛型参数,泛型方法等等…

五、List

  • List是Collection的子接口
  • List是有序集合: 有序是指集合迭代顺序和插入顺序一致
  • List集合允许重复元素!!
  • List集合提供了可以针对索引(下标)操作元素的方法

List接口中的方法大部分与父接口Collection中一致,
但是除此之外的方法,确实提了可以通过下标操作元素(CRUD)的方法

  • void add(int index,E e) 按照下标位置加入元素 (增)(Create创建/新增)
  • E remove(int index) 按照下标位置移除元素 (删)(Delete删除)
  • E set(int index,E e) 按照下标位置设置(修改)元素 (改)(Update更新/修改)
  • E get(int index) 按照下标位置获得元素 (查)(Read读取/查询)

List是接口,没有办法演示其中的方法

List接口有两个常用的实现类:ArrayListLinkedList

5.1 ArrayList[重点]

ArrayList实现了List接口,即ArrayList也是有序集合,也允许重复元素,且那些关于下标操作集合的方法ArrayList都有!

ArrayList不保证线程安全

ArrayList底层是数组,大小可变是指它会扩容(不是真正大小可变)

5.1.1 演示方法

构造方法

  • ArrayList() 创建空集合,默认创建了一个长度为10的数组
  • ArrayList(Collection c) 创建一个集合,集合内直接就有指定的参数
  • ArrayList(int initialCapacity) 创建一个指定初始化容量的数组
 ArrayList<Integer> list = new ArrayList<>( );

方法

  • 其他的方法上午在Collection中已经学过
  • void add(int index,E e)
  • E remove(int index)
  • E get(int index)
  • E set(int index,E e)
    public static void main(String[] args) {// 定义泛型// 空参构造,创建空集合(默认容量10)ArrayList<Integer> list = new ArrayList<>( );// 最基本的添加方法list.add(3);list.add(1);list.add(1);list.add(4);list.add(4);list.add(2);// 遍历(保证顺序-->有序)// 允许重复元素for (Integer i : list) {System.out.println(i );}// 其他常规方法不再演示// 主要掌握关于下标的方法// 311442// 按照下标插入 add(int i,E e)list.add(3,0);System.out.println(list );// 按照下标获得元素(取值) E get(int i)Integer e = list.get(4);System.out.println("下标4的值: " + e );// 按照下标修改值 E set(int i,E e)Integer old = list.set(4, 10);System.out.println("修改后的集合:" + list );System.out.println("返回的数据:" + old );// 按照下标删除 E remove(int i)Integer remove = list.remove(4);System.out.println("删除下标3的数据后:" + list );System.out.println("返回的数据:" + remove );}

5.1.2 底层原理[掌握|理解]

ArrayList底层是使用数组,默认长度是10,但是存储元素多于10时会扩容.

如何扩容的?

  • 当加入元素时,先判断加入后会不会超出默认长度
  • 如果没有超出默认长度
    • add(Object o) 元素直接放最后
    • add(int index,Object o) 先将该位置以后的元素依次往后移动一个,然后再将该元素放入该位置
  • 当加入元素时,判断加入后长度会不会超出容量,如果超出就要扩容
  • 扩容是创建一个新的数组,容量是原来的1.5倍
  • 将原来数组的元素依次拷贝到新数组
  • 然后再放入新元素
// jdk源码   private void grow(int minCapacity) {// int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);// 1.5倍if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);}
/*
给定的代码是一个名为"grow"的方法,用于增加数组的容量。它接受一个参数"minCapacity",表示数组应该具有的最小容量。
以下是代码的逐步解释:
1. 方法首先使用"elementData"数组的"length"属性获取当前容量。
2. 然后通过将旧容量的一半加上旧容量本身来计算新容量。这是使用右移运算符(>>)实现的,它将值除以2。
3. 接下来,它检查新容量减去最小容量是否小于0。如果这个条件为真,说明新容量不足以满足所需的最小容量。在这种情况下,它将新容量设置为等于最小容量。
4. 然后,它检查新容量减去最大数组大小是否大于0。如果这个条件为真,说明新容量超过了数组允许的最大大小。在这种情况下,它调用"hugeCapacity"方法来计算一个在允许范围内的新容量。
5. 最后,它使用"Arrays.copyOf"方法创建一个具有更新容量的新数组。"elementData"数组被赋予新数组,从而增加了其容量。
总之,"grow"方法增加数组的容量以满足最小容量要求,并确保不超过允许的最大大小。
*/

5.1.3 特点[记住]

ArrayList特点: 1) 有序 2) 重复 3) 查询更新效率高 4) 删除插入效率低

应用场景: 适合那些查询频率高的地方. 且基本大部分场景都是经常查不经常删除和插入的,所以呢ArrayList就非常常用!!! 如果以后没有特殊说明,直接就使用ArrayList!!

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

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

相关文章

极智开发 | CUDA Memory内存模型

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 CUDA Memory内存模型。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 熟悉和了解 CUDA Memory 内存模型对于…

成本预算管理系统

成本预算管理系统 功能介绍&#xff1a; 一 基本信息&#xff1a; 1、产品设置&#xff1a;产品的长、宽、高及面积计算公式的设置。 2、板材设置&#xff1a;板材类别、厚度、尺寸的设置 3、系统名称&#xff1a;风管系统的类别设置 4、公司信息&#xff1a;本公司的信息…

【多线程】线程互斥 {竞态条件,互斥锁的基本用法,pthread_mutex系列函数,互斥锁的原理;死锁;可重入函数和线程安全}

一、进程线程间通信的相关概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。确切的说&#xff0c;临界资源在同一时刻只能被一个执行流访问。临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。互斥&#xff1a;通过互…

vue实现图片分页

本小节学会使用v-show和click 、v-bind&#xff0c;v-bind可以简写为: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

基于鸟群算法的无人机航迹规划-附代码

基于鸟群算法的无人机航迹规划 文章目录 基于鸟群算法的无人机航迹规划1.鸟群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鸟群算法来优化无人机航迹规划。 1.鸟群搜索算法 …

OSCAR数据库上锁问题如何排查

关键字 oscar lock 问题描述 oscar 数据库上锁问题如何排查 解决问题思路 准备数据 create table lock_test(name varchar(10),age varchar(10));insert into lock_test values(ff,10); insert into lock_test values(yy,20); insert into lock_test values(ll,30);sessio…

0基础学习PyFlink——用户自定义函数之UDF

大纲 标量函数入参并非表中一行&#xff08;Row&#xff09;入参是表中一行&#xff08;Row&#xff09;alias PyFlink中关于用户定义方法有&#xff1a; UDF&#xff1a;用户自定义函数。UDTF&#xff1a;用户自定义表值函数。UDAF&#xff1a;用户自定义聚合函数。UDTAF&…

vue2+ant-design-vue a-select组件二次封装(支持单选/多选添加全选/分页(多选跨页选中)/自定义label)

一、效果图 二、参数配置 1、代码示例 <t-antd-selectv-model"selectVlaue":optionSource"stepList"change"selectChange" />2、配置参数&#xff08;Attributes&#xff09;继承 a-select Attributes 参数说明类型默认值v-model绑定值…

安装PS及AI遇到的问题

Mac安装PS/AI/PR/AE提示错误代码146 Failed with error code 146解决办法: 访达, -> 前往 ->前往文件夹 -> /Applications/Utilities/Adobe Sync 将Adobe Sync 文件夹里的CoreSync文件夹直接删掉

C++ 标准库随机数:std::default_random_engine

库头文件 #include <random> // 通过种子值设置随机数生成器 std::default_random_engine rng(seed);// 不设置种子值&#xff0c;使用默认值 std::default_random_engine rng; // 生成一个0到9之间的随机整数 int random_int rng() % 10;// 生成一个0到1之间的随机浮…

vivado crash

将增量编译去了

[Shell] ${} 的多种用法

文章目录 解释代码 解释 在Shell脚本中&#xff0c;${} 是一种变量替换语法。它用于获取和操作变量的值。 具体来说&#xff0c;${} 可以用来执行以下操作&#xff1a; 变量引用&#xff1a;${variable} 表示引用变量 variable 的值。 变量默认值&#xff1a;${variable:-de…

FPGA时序分析与约束(9)——主时钟约束

一、时序约束 时序引擎能够正确分析4种时序路径的前提是&#xff0c;用户已经进行了正确的时序约束。时序约束本质上就是告知时序引擎一些进行时序分析所必要的信息&#xff0c;这些信息只能由用户主动告知&#xff0c;时序引擎对有些信息可以自动推断&#xff0c;但是推断得到…

Sprint Cloud Stream整合RocketMq和websocket实现消息发布订阅

1.引入RocketMQ依赖&#xff1a;首先&#xff0c;在pom.xml文件中添加RocketMQ的依赖&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</versi…

文件改名,轻松添加前缀顺序编号,文件改名更高效!

您是否曾经需要批量修改文件名&#xff0c;并希望在文件名中添加特定的前缀或顺序编号&#xff1f;现在&#xff0c;我们为您带来了一款全新的文件改名工具&#xff0c;帮助您轻松解决这个问题&#xff01; 第一步&#xff0c;进入文件批量改名高手主页面&#xff0c;在板块栏…

C++学习笔记之四(标准库、标准模板库、vector类)

C 1、C标准库2、C标准模板库2.1、vector2.1.1、vector与array2.1.2、vector与函数对象2.1.3、vector与迭代器2.1.4、vector与算法 1、C标准库 C C C标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray)&#xff0c;它定义了十个大类…

js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件

js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件 js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件使用 FileReader js读取文件 vue读取文件 JavaScript 读取文件解析为字符串 js读取文件 Vue读取文件 使用 F…

【python爬虫】设计自己的爬虫 1. request封装

通过requests.session().request 封装request方法 考虑到请求HTTP/2.0 同时封装httpx 来处理HTTP/2.0的请求 封装requests # 遇到请求失败的情况时 重新请求&#xff0c;请求5次等待2s retry(stop_max_attempt_number5, retry_on_resultlambda re_data: re_data is None, wai…

亚马逊,速卖通,美客多如何打造爆款商品,排名提升榜首

1、产品Listing的完整性 Listing是亚马逊A9算法认识你产品的基础&#xff0c;在发布一条listing的时候&#xff0c;尽可能地做到最好!在准备一条listing之前&#xff0c;一定事先要收集、整理足够多的产品关键词&#xff0c;在优化listing内容的时候填充进去。仔细观察优秀竞品…

Realrek 2.5G交换机 8+1万兆光RTL8373-VB-CG方案简介

新一代2.5G交换机方案RTL8373-VB-CG可以提供4中不同形态 a. 52.5G 电口110G光》RTL8373 b. 52.5G 电口110G电》RTL83738261 c. 82.5G 电口110G光》RTL83738224 d.82.5G 电口110G电口》RTL837382248261 1.概述 Realtek RTL8373-CG是一款低功耗、高性能、高度集成的八端口2.5G和一…