011_异常、泛型和集合框架

异常、泛型和集合框架

  • 异常
    • Java的异常体系
      • 异常的作用
    • 自定义异常
    • 异常的处理方案
      • 异常的两种处理方式
  • 泛型
    • 泛型类
    • 泛型接口
    • 泛型方法、通配符和上下限
    • 泛型支持的类型
  • 集合框架
    • 集合体系结构
      • Collection
    • Collection集合
      • Collection的遍历方式
      • 认识并发修改异常问题
        • 解决并发修改异常问题的方案
    • List集合
      • List集合的特有方法
      • ArrayList底层原理
      • LinkedList的底层原理
      • LinkedList的应用场景

异常

  • 异常代表程序出现的问题。

Java的异常体系

  • Java.lang.Throwable
    • Error
    • Exception
      • RuntimeException
      • 其他异常…
  • Error:代表的系统级别错误(属于严重问题),也就是说系统一旦出现问题,sun公司会把这些问题封装为Error对象给出来。
  • Exception:叫异常:它代表的才是我们程序可能出现的问题,所以通常会用Exception以及它的孩子来封装程序出现的问题。
  • 运行时异常:RuntimeException及其子类,编译阶段不会出现错误提醒,运行时出现的异常
  • 编译时异常:“其他异常…” 编译阶段就会出现错误提醒的。
  • 抛出异常(throws)
    • 在方法上使用throws关键字,可以将方法内部出现的异常抛出去给调用者处理。
方法 throws 异常1 ,异常2 ,异常3 ..{}
  • 捕获异常(try…catch)
    • 直接捕获程序出现的异常。
try{// 监视可能出现异常的代码!
}catch(异常类型1 变量){// 处理异常
}catch(异常类型2 变量){// 处理异常
}...

异常的作用

  • 异常使用来定位程序bug的关键信息。
  • 可以作为方法内部的一种特殊返回值,以便通知上层调用者,方法的执行问题。

自定义异常

  • Java无法为这个世界上全部的问题都提供异常类来代表, 如果企业自己的某种问题,想通过异常来表示,以便用异常来管理该问题,那就需要自己来定义异常类了。
  • 自定义运行时异常
    • 定义一个异常继承RuntimeException。
    • 重写构造器。
    • 通过 throw new 异常类(xxx)来创建异常对象抛出
    • 特点:编译阶段不报错,运行时才可能出现,提醒不属于激进型。
  • 自定义编译时异常
    • 定义一个异常继承Exception。
    • 重写构造器。
    • 通过 throw new 异常类(xxx)创建异常对象并抛出。
    • 特点:编译阶段就报错,提醒比较激进。

异常的处理方案

  1. 方案一:底层异常层层往上抛出,最外层捕获异常,记录下异常信息,并响应适合用户观看的信息进行提示。
  2. 方案二:最外层捕获异常后,尝试重新修复。

异常的两种处理方式

  • 抛出异常(throws)
方法 throws 异常1 ,异常2 ,异常3 ..{…
}
  • 捕获异常(try…catch)
try{// 监视可能出现异常的代码!
}catch(异常类型1 变量){// 处理异常}catch(异常类型2 变量){// 处理异常
}...

泛型

  • 定义类、接口、方法是,同时声明了一个或多个类型变量(如:)
    • 称为泛型类、泛型接口、泛型方法,它们统称为泛型。
public class ArrayList<E>{. . .
}
  • 作用:泛型提供了在编译阶段约束所能操作的数据类型,并自动进行检查的能力. 这样可以避免强制类型转换,及其可能出现的异常。
  • 泛型的本质:把具体的数据类型作为参数给类型变量。

泛型类

修饰符 class 类名<类型变量,类型变量,…> { 
}
  • 类型变量建议用大写的英文字母,常用的有:E、T、K、V 等

泛型接口

修饰符 interface 接口名<类型变量,类型变量,…> { 
}

泛型方法、通配符和上下限

  • 泛型方法
修饰符 <类型变量,类型变量,…>  返回值类型 方法名(形参列表) { }
  • 通配符
    • 就是 “?”,可以在 “使用泛型” 的时候代表一切类型; E T K V 是在定义泛型的时候使用。
  • 泛型的上下限:
    • 泛型上限:? extends Car: ? 能接收的必须是Car或者其子类 。
    • 泛型下限:? super Car:? 能接收的必须是Car或者其父类。

泛型支持的类型

  • 泛型不支持基本数据类型,只能支持对象类型(引用数据类型)。
    • 可以使用基本数据类型的包装类。

集合框架

  • 集合是一种容器,用来装数据的,类似于数组,但集合的大小可变,开发中也非常常用。

集合体系结构

  • Collection 代表单列集合,每个元素(数据)只包括一个值。
  • Map 代表双列集合,每个元素包含两个值(键值对)。

Collection

  • Collection
    • List
      • ArrayList
      • LinkedList
    • Set
      • HashSet
        • LinkedHashSet
      • TreeSet
  • Collection集合特点
    • List系列集合:添加的元素是有序、可重复、有索引。
      • ArrayList、LinekdList:有序、可重复、无索引。
    • Set系列集合:添加的元素是无序、不重复、无索引。
      • HashSet:无序、不重复、无索引。
      • LinkedHashSet:有序、不重复、无索引。
      • TreeSet:按照大小默认升序排序、不重复、无索引。

Collection集合

  • Collection是单列集合的祖宗,它规定的方法(功能)是全部单列集合都会继承的。
方法名说明
public boolean add(E e)把给定的对象添加到当前集合中
public void clear()清空集合中所有的元素
public boolean remove(E e)把给定的对象在当前集合中删除
public boolean contains(Object obj)判断当前集合中是否包含给定的对象
public boolean isEmpty()判断当前集合是否为空
public int size()返回集合中元素的个数。
public Object[] toArray()把集合中的元素,存储到数组中

Collection的遍历方式

  1. 迭代器遍历
    • 迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator。
方法名称说明
Iterator iterator()返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素
  • Iterator迭代器中的常用方法
方法名称说明
boolean hasNext()询问当前位置是否有元素存在,存在返回true ,不存在返回false
E next()获取当前位置的元素,并同时将迭代器对象指向下一个元素处。
  1. 增强 for 循环
  • 增强for可以用来遍历集合或者数组
  • 增强for遍历集合,本质就是迭代器遍历集合的简化写法。
for (元素的数据类型 变量名 : 数组或者集合) {
}
  1. Lambda表达式
  • JDK 8开始的新技术Lambda表达式,提供了一种更简单、更直接的方式来遍历集合。
方法名称说明
default void forEach(Consumer<? super T> action)结合lambda遍历集合
Collection<String> lists = new ArrayList<>();
...
lists.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}
});
  • 简化
Collection<String> lists = new ArrayList<>();
...
lists.forEach(s -> {System.out.println(s);
});
//  lists.forEach(s -> System.out.println(s));

认识并发修改异常问题

  • 遍历集合的同时又存在增删集合元素的行为时可能出现业务异常,这种现象被称之为并发修改异常问题。
解决并发修改异常问题的方案
  • 如果集合支持索引,可以使用for循环遍历,每删除数据后做 i–;或者可以倒着遍历。
  • 可以使用迭代器遍历,并用迭代器提供的删除方法删除数据。
  • 增强for循环/Lambda遍历均不能解决并发修改异常问题,因此增它们只适合做数据的遍历,不适合同时做增删操作。

List集合

  • ArrayList和LinkedList,底层实现不同,适应的场景不同。

List集合的特有方法

  • List集合因为支持索引,所以多了很多与索引相关的方法。
方法名称说明
void add(int index,E element)在此集合中的指定位置插入指定的元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index,E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素
  • List集合支持的遍历方式
    • for循环
    • 迭代器
    • 增强for循环
    • Lambda表达式

ArrayList底层原理

  • ArrayList底层是基于数组存储数据的。
  • 数组的特点
    • 查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同。

    • 增删数据效率低:可能需要把后面很多的数据进行前移。

LinkedList的底层原理

  • LinkedList底层是基于链表存储数据的。
    • 基于双链表实现的。
      • 特点:查询慢,增删相对较快,但对首尾元素进行增删改查的速度是极快的。
  • 链表的特点:
    • 链表中的数据是一个一个独立的结点组成的,结点在内存中是不连续的,每个结点包含数据值和下一个结点的地址。
    • 查询慢,无论查询哪个数据都要从头开始找。
    • 链表增删相对快.
  • 双链表:对首尾元素进行增删改查的速度是极快的。
  • LinkedList新增了很多首尾操作的特有方法。
方法名称说明
public void addFirst(E e)在该列表开头插入指定的元素
public void addLast(E e)将指定的元素追加到此列表的末尾
public E getFirst()返回此列表中的第一个元素
public E getLast()返回此列表中的最后一个元素
public E removeFirst()从此列表中删除并返回第一个元素
public E removeLast()从此列表中删除并返回最后一个元素

LinkedList的应用场景

  • 用来设计队列
    • 队列的特点:先进先出,后进后出。
  • 用来设计栈
    • 栈的特点:后进先出,先进后出。
    • 数据进入栈模型的过程称为:压/进栈(push)
    • 数据离开栈模型的过程称为:弹/出栈(pop)
  • 使用首尾元素,用Linked来实现很合适。

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

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

相关文章

Kubernetes 集群搭建(三):使用dashboard用户界面(需要访问外网获取yaml)

&#xff08;一&#xff09;简介 K8s Dashboard是Kubernetes提供的一种基于Web的用户界面工具&#xff0c;用于可视化地管理和监控Kubernetes集群 主要功能&#xff1a; 资源查看与管理&#xff1a; 查看Kubernetes集群中的各种资源&#xff0c;如节点、Pod、服务、部署等。 对…

【数据挖掘】岭回归(Ridge Regression)和线性回归(Linear Regression)对比实验

这是一个非常实用的 岭回归&#xff08;Ridge Regression&#xff09;和线性回归&#xff08;Linear Regression&#xff09;对比实验&#xff0c;使用了 scikit-learn 中的 California Housing 数据集 来预测房价。 &#x1f4e6; 第一步&#xff1a;导入必要的库 import num…

大疆无人机系列知识

目录 知识 开发者文档 &#xff08;上云&#xff09; 无人机的应用 知识 大疆行业无人机接入音视频平台协议详解_大疆无人机 视频流-CSDN博客 开发者文档 &#xff08;上云&#xff09; 上云API 无人机的应用 【大疆无人机地图测绘技术学习&#xff1a;高精度、高效率的…

CNN注意力机制的进化史:深度解析10种注意力模块如何重塑卷积神经网络

&#x1f31f; 引言&#xff1a;注意力为何改变CNN的命运&#xff1f; 就像人类视觉会优先聚焦于重要信息&#xff0c;深度学习模型也需要"学会看重点"。从2018年SENet首提通道注意力&#xff0c;到2024年SSCA探索空间-通道协同效应&#xff0c;注意力机制正成为CNN…

Linux/树莓派网络配置、远程登录与图形界面访问实验

一.准备工作 1.修改网络适配器&#xff08;选择本机网卡&#xff09; 2.创建一个新的用户。 3.使用新用户登录&#xff0c;使用ip a指令查看IP&#xff08;现代 Linux 发行版&#xff08;如 Ubuntu、Debian、CentOS、Fedora 等&#xff09;&#xff09;。 通过sudo arp-sca…

Python----TensorFlow(TensorFlow介绍,安装,主要模块,高级功能)

一、TensorFlow TensorFlow 是由谷歌大脑团队于 2015 年推出的开源机器学习框架。作为深度学习的第二代系统&#xff0c;TensorFlow 支持多种编程语言&#xff0c;包括 Python、C、Java 和 Go&#xff0c;广泛应用于 CNN、RNN 和 GAN 等深度学习算法。 TensorFlow 可以…

【动态规划】 深入动态规划 回文子串问题

文章目录 前言例题一、回文子串二、 最长回文子串三、回文串分割IV四、分割回文串II五、最长回文子序列六、让字符串成为回文串的最小插入次数 结语 前言 那么&#xff0c;什么是动态规划中的回文子串问题呢&#xff1f; 动态规划中的回文子串问题是一个经典的字符串处理问题。…

lodash库介绍(一个现代JavaScript实用工具库,提供模块化、性能优化和额外功能)JavaScript库(防抖、节流、函数柯里化)JS库

https://www.lodashjs.com/ 文章目录 Lodash库全解析简介核心优势一致性API模块化设计性能优化 常用功能分类数组操作对象操作函数增强 高级应用场景数据转换链函数组合 性能考量大数据集处理 最佳实践按需引入利用FP模块 结语 Lodash库全解析 简介 Lodash是一个现代JavaScri…

Spring MVC 国际化机制详解(MessageSource 接口体系)

Spring MVC 国际化机制详解&#xff08;MessageSource 接口体系&#xff09; 1. 核心接口与实现类详解 接口/类名描述功能特性适用场景MessageSource核心接口&#xff0c;定义消息解析能力支持参数化消息&#xff08;如{0}占位符&#xff09;所有国际化场景的基础接口Resource…

PyTorch张量范数计算终极指南:从基础到高阶实战

在深度学习领域&#xff0c;张量范数计算是模型正则化、梯度裁剪、特征归一化的核心技术。本文将以20代码实例&#xff0c;深度剖析torch.norm的9大核心用法&#xff0c;并揭示其在Transformer模型中的关键应用场景。 &#x1f680; 快速入门&#xff08;5分钟掌握核心操作&…

荣耀90 GT信息

外观设计 屏幕&#xff1a;采用 6.7 英寸 AMOLED 荣耀绿洲护眼屏&#xff0c;超窄边框设计&#xff0c;其上边框 1.6mm&#xff0c;左右黑边 1.25mm&#xff0c;屏占较高&#xff0c;带来更广阔的视觉体验。屏幕还支持 120Hz 自由刷新率&#xff0c;可根据使用场景自动切换刷新…

【Java中级】11章、枚举 - java引用数据类型,枚举介绍、快速入门,了解枚举类的基本使用方式【1】

文章内容&#xff1a; 自定义实现枚举enum关键字实现枚举 ❤️内容涉及枚举的定义&#xff0c;快速入门&#xff0c;注意事项和小题巩固知识点 &#x1f308; 跟着B站一位老师学习的内部类内容&#xff0c;现写这篇文章为学习内部类的小伙伴提供思路支持&#xff0c;希望可以一…

局域网访问 Redis 方法

局域网访问 Redis 方法 默认情况下&#xff0c;Redis 只允许本机 (127.0.0.1) 访问。如果你想让局域网中的其他设备访问 Redis&#xff0c;需要 修改 Redis 配置&#xff0c;并确保 防火墙放行端口。 方法 1&#xff1a;修改 Redis 配置 1. 修改 redis.conf&#xff08;或 me…

如何应对客户频繁变更需求

如何应对客户频繁变更需求&#xff1f;要点包括&#xff1a; 快速响应、深入沟通、灵活规划、过程记录、风险管控。这些策略既能降低项目失控风险&#xff0c;也能帮助团队在变动环境中保持高效率。其中深入沟通尤为关键&#xff0c;它不仅能够让团队第一时间了解客户意图&…

Set 集合

默认情况下&#xff0c; Scala 使用的是不可变集合&#xff0c; 如果你想使用可变集合&#xff0c; 需要引用 scala.collection.mutable.Set Set 默认是不可变集合&#xff0c;数据无序 数据不可重复 遍历集合 创建可变集合 mutable.Set 打印集合 集合添加元素 向集合中…

最新 OpenHarmony 系统一二级目录整理

我们在学习 OpenHarmony 的时候&#xff0c;如果对系统的目录结构了解&#xff0c;那么无疑会提升自己对 OpenHarmony 更深层次的认识。 于是就有了今天的整理。 首先在此之前&#xff0c;我们要获取源码 获取源码的方式 OpenHarmony 主干代码获取 方式一&#xff08;推荐&am…

STL常用容器整理

STL常用容器操作整理 STL常用容器操作整理&#xff08;string/vector/set/map&#xff09;一、string&#xff08;字符串&#xff09;构造函数元素访问修改操作容量操作子串与查找 二、vector&#xff08;动态数组&#xff09;构造函数元素访问修改操作容量操作 三、set&#x…

Unity 实现伤害跳字

核心组件&#xff1a; Dotween TextMeshPro 过程轨迹如下图&#xff1a; 代码如下&#xff1a; using System.Collections; using System.Collections.Generic; using DG.Tweening; using TMPro; using UnityEngine; using UnityEngine.Pool;public class …

Ubuntu 22.04 AI大模型环境配置及常用工具安装

一、基础环境准备 1.1 系统准备 建议使用 Ubuntu22.04 以下配置皆以 Ubuntu22.04 系统版本为例 1.2 安装git apt-get update && apt-get install git -y1.3 安装 Python 3.9 【建议安装 3.10】&#xff08;安装miniconda或者conda来管理虚拟环境&#xff09; wget …

STM32单片机入门学习——第27节: [9-3] USART串口发送串口发送+接收

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.08 STM32开发板学习——第27节: [9-3] USART串口发送&串口发送接收 前言开发板说…