day15_集合_ArrayList

今日内容

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

零、 复习昨日

日期解析的方法签名(字符串–>日期)

  • Date parse(String s)

日期格式化的方法签名(日期–>字符串)

  • String format(Date date)

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

  • RuntimeException及其子类,编码时不用强制处理

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

  • 除了以上的都是,编码时必须强制处理

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

  • 抛出,抛出后代码不再执行
  • 捕获,捕获后还可以执行

finally干什么的

  • 释放资源

throw和throws什么区别

  • 位置?throw在方法内,throws在方法参数列表()后
  • 后面写?throw后跟1个异常对象,throws后面跟多个异常类名
  • 作用?throw是抛出异常对象的,throws只是声明可能要抛出异常类型

一、集合框架体系

数组: 存储多个数据的容器

  • 数组长度固定
  • 数组只能存储同一种类型
  • 数组用法单一,只能通过下标取值赋值
  • 数组内元素可以重复
  • 数组内元素有顺序(存值时顺序)

集合(Collection): 存储多个数据的容器

  • 集合长度不固定
  • 集合可以存储不同类型
  • 集合是一些列的类,可以创建对象,有丰富的方法可以操作数据
  • 有些集合可以重复(List),有些集合不允许重复(Set);有些集合有序的(List),有些集合是无序的(HashSet),而且有些集合还会排序(TreeSet)

image-20240308095727002

  • Collection是集合层次的父接口,定义了所有集合共性操作

  • Collection有两个常用子接口:List,Set

  • List接口集合,主要特征是有序,允许重复元素的集合

  • Set接口集合,主要特征是元素去重

  • List接口有两个常用实现类

    • ArrayList,底层是数组,也是允许元素重复,数据有序
    • LinkedList,底层是链表,也是允许元素重复,数据有序
  • Set接口有两个常用实现类

    • HashSet,底层是hash表,存储的元素无序且去重
    • TreeSet,底层是二叉树,存储的元素是排序且去重

二、Collection、List介绍

  • Collection父接口

    • 定义了一部分集合的共性操作,并不全
  • List是Collection的子接口,有序允许重复的集合

    • 定义了一些方法,可以对位置进行精准控制
    • 即可以按照下标插入,删除,查询,修改集合元素
  • List是接口,不能只能直接用,常用使其子实现类,ArrayList和LinkedList

三、ArrayList[重点]

  • 是List接口的实现类,允许重复,有序
  • 底层是数组,大小"可变"
  • 是不同步,即不保证线程安全

3.1 方法演示1

先演示了部分方法,主要对集合元素 增 删 改 查

   public static void main(String[] args) {// 创建空集合ArrayList list = new ArrayList( );System.out.println("初始值: " + list);// 向末尾添加元素// 有序(插入顺序),允许重复,允许存储不同类型list.add(4);list.add(2);list.add(2);list.add(5);list.add("六");System.out.println("添加值:" + list);// 向指定下标插入数据list.add(2, 1);System.out.println("中间插入:" + list);// 获得指定下标的元素Object o = list.get(2);System.out.println(o);// 按照下标修改元素list.set(2, 100);System.out.println("修改后:" + list);// 按下下标删除元素Object old = list.remove(0);System.out.println("被删除掉的元素:" + old );System.out.println("删除后的集合:"+list );}

3.2 泛型

 private static void show2() {/*** 集合确实可以允许存储不同类型数据* 但是大部分情况下,集合只会存储同一类型* -----------* 目前这种情况,设计时存储的是Object* 取出数据也是Object,需要使用对应数据类型时需要强转* 但是强制转换有风险* ---------------------* 所以,在JDK1.5时引入泛型 ,通过泛型就可以解决这个问题*/ArrayList list = new ArrayList(  );list.add(1);list.add(2.0);list.add("3");list.add(new Date(  ));double o = (double) list.get(0);System.out.println(o );System.out.println("-------------------------" );/*** 下面使用泛型来定义集合* 通过在类名后,指定泛型类型,从而确定该集合只能存储指定类型* -------------* 泛型好处: 减少类型转换(强转)*/ArrayList<Integer> list2 = new ArrayList<>( );list2.add(1);// 有了泛型约束,存储时只能是Integerlist2.add(2);list2.add(3);Integer i = list2.get(2);// 有了泛型约束,取出就是Integer,无需强转}

以后,凡是用集合操作,必用泛型!!

3.3 方法演示2

/*** 演示ArrayList其他方法*/private static void show3() {ArrayList<Integer> l1 = new ArrayList<>( );l1.add(11);l1.add(22);l1.add(33);System.out.println("原始l1:" + l1 );ArrayList<Integer> l2 = new ArrayList<>( );l2.add(10);l2.add(20);l2.add(30);// 将另外一个集合中的全部元素加入当前集合l1.addAll(l2);System.out.println("addAll后: " + l1);// 移除当前集合中,存在于参数集合相同的元素l1.removeAll(l2);System.out.println("移除后:" + l1 );// 判断集合是否为空System.out.println(l1.isEmpty( ));// 存储的元素的个数int size = l1.size( );System.out.println("集合元素个数:" + size );// 判断集合是否包含某个元素System.out.println(l1.contains(11));// 先创建整型数组Integer[] integers = new Integer[l1.size( )];// 再将集合转成数组Integer[] array = l1.toArray(integers);System.out.println(Arrays.toString(array));// 清空集合l1.clear();System.out.println("清空后: " + l1 );// 判断集合是否为空System.out.println(l1.isEmpty( ));}

3.4 迭代

集合遍历

// 使用迭代器遍历

   public static void main(String[] args) {/*** 使用迭代器遍历*/ArrayList<Integer> list = new ArrayList<>( );list.add(4);list.add(2);list.add(1);list.add(3);// 1)获得迭代器Iterator<Integer> iterator = list.iterator();// 2)遍历迭代while (iterator.hasNext()) {// 判断有无下一个元素,如果有返回trueInteger next = iterator.next( );// 取出下一个元素System.out.println(next );}}

// foreach迭代

    public static void main(String[] args) {/*** 使用迭代器遍历*/ArrayList<Integer> list = new ArrayList<>( );list.add(4);list.add(2);list.add(1);list.add(3);// 1)获得迭代器Iterator<Integer> iterator = list.iterator();// 2)遍历迭代while (iterator.hasNext()) {// 判断有无下一个元素,如果有返回trueInteger next = iterator.next( );// 取出下一个元素System.out.println(next );}// 迭代器的简化写法: 增强for循环,也叫foreach/*** for(数据类型 变量 : 集合) {** }*/for (Integer i : list) {System.out.println(i );}// 遍历数组int[] arr = {1,2,3,4};for(int i:arr){ // 冒号左边是遍历得到的结果,不是下标!!!System.out.println(i);}}

3.5 底层原理[面试]

  • ArrayList底层是数组实现的
  • 始容量(数组长度)默认是10
    • 刚new完创建的空集合的,容量是0
    • 当第一次加入元素的时候,数组扩容成10
  • 当元素放满10个时,当加入第11个时候会触发扩容,扩容为原来的1.5倍(通过 >> 1 右移1位算出来)
    • 扩容成1.5倍后,再把原数组的元素拷贝到新数组

// 扩容的源码 (ArrayList.java(

private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);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);}
这个函数是用于增长数组容量的。当数组容量不足时,它将根据最小需求容量(minCapacity)来计算新的容量大小,并确保新的容量大于当前需求。若新容量小于需求,则将新容量设置为需求容量。若新容量超过最大数组大小,则调用hugeCapacity方法来处理。最后,通过Arrays.copyOf方法复制原数组到新的容量中。

使用上效率问题

  • ArrayList进行元素的 查询,修改速度快
  • 进行元素的,插入和删除速度慢

原因

  • 数组在内存是连续空间,有下标
  • 所以,通过下标直接定位找到元素,改变该位置元素(查询和更新快)
  • 也是因为内存空间原因,插入或者删除一个数据时,从插入/删除位置开始后续的元素需要后移/前移一位

四、LinkedList[理解]

LinkedList也是List实现类,也是允许元素重复,有序的集合

4.1 方法演示

LinkedList也是List实现类,大部分方法与ArrayList一模一样用法,不再演示

自习尝试,

  • 创建LinkedList集合
  • 加入元素
  • foreach变量LinkedList

4.2 特殊方法

除了基本的方法与ArrayList一样之外,LinkedList还提供一些比较特殊的操作头尾的方法

  • getFirst getLast
  • removeFirst removeLast
  • addFirst addLast
    public static void main(String[] args) {LinkedList<Integer> l1 = new LinkedList<>( );l1.add(11);l1.add(22);l1.add(33);// 获得头 尾操作Integer first = l1.getFirst( );Integer last = l1.getLast( );System.out.println(first );System.out.println(last );}

4.3 底层原理

LinkedList底层是双向链表

  • 链表在内存中是不连续
  • 通过链域里面记录上一个/下一个元素的位置

image-20240308163027261

当通过下标找寻一个元素的时候,并不是直接定位的,是从头或者尾开始一个一个遍历查找对应的元素,也正是因为如此,所以提供了专门操作头尾的方法的,可以直接定位到,方便操作

又因为这个空间数据结构问题,导致了一些特性

  • LinkedList查询,更新数据慢
  • LinkedList插入,删除的快
    • 因为插入/删除元素改变的知识链域的记录信息,没有改变其他元素位置

五、总结

  • 记住集合体系的各自特点
  • 牢记ArrayList方法,底层原理
  • LinkedList了解原理

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

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

相关文章

19、电源管理入门之微内核中的电源管理

目录 1. QNX电源管理框架 2. QNX客户端API库 3. QNX代码分析 4. Fuchsia中的电源管理 5. Minix中的电源管理 6. Harmony OS中的电源管理 之前介绍的电源管理机制基本都是在Linux中实现的,可以看到很复杂,各种框架,明明一个操作非要转来转去,而且在内核里面实现,跟内…

【HarmonyOS】ArkTS-联合类型

目录 联合类型实例 联合类型 联合类型是一种灵活的数据类型&#xff0c;它修饰的变量可以存储不同类型的数据。 语法&#xff1a;let 变量: 类型1 | 类型2 | 类型3 值 基于联合类型&#xff0c;变量可存不同类型数据 实例 // 需求&#xff1a;定义一个变量&#xff0c;存放…

Spring web开发(入门)

1、我们在执行程序时&#xff0c;运行的需要是这个界面 2、简单的web接口&#xff08;127.0.0.1表示本机IP&#xff09; package com.example.demo;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestCont…

【OD】算法二

开源项目热度榜单 某个开源社区希望将最近热度比较高的开源项目出一个榜单&#xff0c;推荐给社区里面的开发者。对于每个开源项目&#xff0c;开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、…

垃圾回收:JavaScript内存管理的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ChatGPT 控制机器人的基本框架

过去的一年&#xff0c;OpenAI的chatGPT将自然语言的大型语言模型&#xff08;LLM&#xff09;推向了公众的视野&#xff0c;人工智能AI如一夜春风吹遍了巴黎&#xff0c;全世界都为AI而疯狂。 OpenAI ChatGPT是一个使用人类反馈进行微调的预训练生成文本模型。不像以前的模型主…

MYSQL | 数据库到底是怎么来的?

“以史为鉴&#xff0c;可以让我们更深刻地理解现在&#xff0c;预见未来。” 要想知道一件东西是怎么发生的, 我们不妨把时间拨回关系型数据库被提出前后来探索。在信息技术飞速发展的今天&#xff0c;回望数据库管理系统的演进之路&#xff0c;我们可以深刻理解到技术进步如…

Go语言数据结构(二)堆/优先队列

文章目录 1. container中定义的heap2. heap的使用示例3. 刷lc应用堆的示例 更多内容以及其他Go常用数据结构的实现在这里&#xff0c;感谢Star&#xff1a;https://github.com/acezsq/Data_Structure_Golang 1. container中定义的heap 在golang中的"container/heap"…

Linux网络套接字之预备知识

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、预备知识 1.理解源IP地址和目的IP地址 …

【解读】OWASP 大语言模型(LLM)安全测评基准V1.0

大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;是指参数量巨大、能够处理海量数据的模型, 此类模型通常具有大规模的参数&#xff0c;使得它们能够处理更复杂的问题&#xff0c;并学习更广泛的知识。自2022 年以来&#xff0c;LLM技术在得到了广泛的应…

leetcode 热题 100_搜索二维矩阵

题解一&#xff1a; 二叉搜索树&#xff1a;从矩阵右上角观察&#xff0c;结构类似二叉搜索树&#xff0c;因此可以用类似的解法来做。具体做法是双指针从右上角开始&#xff0c;向左下角逐步搜索&#xff0c;如果当前值比目标值大&#xff0c;则向下移动&#xff0c;如果当前值…

了解 HTTPS 中间人攻击:保护你的网络安全

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

mybatis-plus整合spring boot极速入门

使用mybatis-plus整合spring boot&#xff0c;接下来我来操作一番。 一&#xff0c;创建spring boot工程 勾选下面的选项 紧接着&#xff0c;还有springboot和依赖我们需要选。 这样我们就创建好了我们的spring boot&#xff0c;项目。 简化目录结构&#xff1a; 我们发现&a…

Qt 实现诈金花的牌面值分析工具

诈金花是很多男人最爱的卡牌游戏 , 每当你拿到三张牌的时候, 生活重新充满了期待和鸟语花香. 那么我们如果判断手中的牌在所有可能出现的牌中占据的百分比位置呢. 这是最终效果: 这是更多的结果: 在此做些简单的说明: 炸弹(有些地方叫豹子) > 同花顺 > 同花 > 顺…

Day27:安全开发-PHP应用TP框架路由访问对象操作内置过滤绕过核心漏洞

目录 TP框架-开发-配置架构&路由&MVC模型 TP框架-安全-不安全写法&版本过滤绕过 思维导图 PHP知识点 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框架开发等 技…

安卓提示风险解决源码搭建教程

一&#xff0e;环境 1.安装Nginx 2.安装Tomcat8.5 3. 安装Mysql5.7 二&#xff0e;修改app已生成的文件下载地址 1.打开编辑config.properties 2.填写你的ip&#xff0c;端口不用修改 三&#xff0e;启动教程 启动命令&#xff1a;sh.start.sh 源码下载链接:https://p…

ArrayDeque集合源码分析

ArrayDeque集合源码分析 文章目录 ArrayDeque集合源码分析一、字段分析二、构造函数分析方法、方法分析四、总结 实现了 Deque&#xff0c;说面该数据结构一定是个双端队列&#xff0c;我们知道 LinkedList 也是双端队列&#xff0c;并且是用双向链表 存储结构的。而 ArrayDequ…

哪些狗粮比较适合幼年犬?

亲爱的朋友&#x1f44b;&#xff0c;你为家中的幼年犬挑选狗粮可真是个贴心的主人呢&#xff01;选择适合幼年犬的狗粮&#xff0c;确实是个需要仔细考虑的问题。幼年犬处于生长发育的关键期&#xff0c;所以狗粮的营养成分和口感都非常重要。 &#x1f436; 在选择狗粮时&…

排序算法全景:从基础到高级的Java实现

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

CentOS系统上安装Redis操作教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…