Java 学习(四)集合框架与异常处理

news2024/12/21 18:20:21

在 Java 编程中,集合框架和异常处理机制是开发高效、健壮程序的两个关键部分。掌握这两个方面的知识,能够大大提高代码的质量和可维护性。本篇博客将深入探讨 Java 集合框架和异常处理机制的核心概念,并结合实际案例,帮助你更好地理解和应用这些技术。


1. Java 集合框架

Java 提供了丰富的集合类和接口,用于存储、操作和处理大量的数据。集合框架分为两大类:集合(Collection)和映射(Map)。每类集合有多种实现类,各具特点。

1.1 集合的分类

Java 集合框架的核心接口分为以下几类:

  • Collection 接口:集合框架的根接口,所有集合类都实现了这个接口。

    • List:有序的集合,允许重复元素,支持按索引访问。常见实现:ArrayListLinkedList
    • Set:无序的集合,不允许重复元素。常见实现:HashSetTreeSet
    • Queue:队列,通常用于实现先进先出(FIFO)的数据结构。常见实现:LinkedListPriorityQueue
  • Map 接口:用于存储键值对(key-value),每个键唯一,值可以重复。常见实现:HashMapTreeMapLinkedHashMap

1.2 List 接口与其实现类

List 是一个有序集合,允许元素重复。常见的实现类有 ArrayListLinkedList

示例:使用 ArrayList
import java.util.ArrayList;
import java.util.List;

public class ListExample {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cherry");

        // 按索引访问
        System.out.println(fruits.get(1));  // 输出: Banana

        // 遍历 List
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }
}
ArrayListLinkedList 区别
  • ArrayList 基于数组实现,适合快速随机访问,但在插入和删除元素时性能较差。
  • LinkedList 基于链表实现,适合在中间插入或删除元素,但访问元素的性能较差。

1.3 Set 接口与其实现类

Set 是一个无序的集合,不允许重复元素。常见的实现类有 HashSetLinkedHashSetTreeSet

示例:使用 HashSet
import java.util.HashSet;
import java.util.Set;

public class SetExample {
    public static void main(String[] args) {
        Set<String> fruits = new HashSet<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Apple");  // 重复元素不会被添加

        for (String fruit : fruits) {
            System.out.println(fruit);  // 输出: Apple, Banana (顺序不定)
        }
    }
}
HashSetTreeSet 区别
  • HashSet 是无序集合,插入时不保证顺序。
  • TreeSet 是有序集合,自动按升序排序元素。

1.4 Map 接口与其实现类

Map 存储键值对,每个键唯一。常见的实现类有 HashMapTreeMap

示例:使用 HashMap
import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {
        Map<String, Integer> fruitPrices = new HashMap<>();
        fruitPrices.put("Apple", 1);
        fruitPrices.put("Banana", 2);
        fruitPrices.put("Cherry", 3);

        // 访问 Map 中的元素
        System.out.println("Price of Banana: " + fruitPrices.get("Banana"));  // 输出: 2

        // 遍历 Map
        for (Map.Entry<String, Integer> entry : fruitPrices.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
HashMapTreeMap 区别
  • HashMap 基于哈希表实现,存储顺序不保证。
  • TreeMap 基于红黑树实现,按键的自然顺序或指定的比较器排序。

2. Java 异常处理

异常处理是 Java 编程中的一个重要部分。合理的异常处理机制能使程序更加健壮,能够应对各种可能的错误情况。

2.1 异常的类型

Java 中的异常分为两种类型:

  • 检查型异常(Checked Exception):必须在代码中进行处理的异常,例如 IOExceptionSQLException
  • 非检查型异常(Unchecked Exception):通常是程序逻辑错误导致的异常,如 NullPointerExceptionArrayIndexOutOfBoundsException

2.2 异常的捕获与处理

Java 提供了 try-catch 语句块来捕获和处理异常。当异常发生时,程序会跳转到对应的 catch 块进行处理。

示例:使用 try-catch 处理异常
public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0;  // 会抛出 ArithmeticException
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());  // 捕获并处理异常
        } finally {
            System.out.println("This will always execute");
        }
    }
}

解释

  • try 块中包含可能抛出异常的代码。
  • catch 块捕获特定的异常并进行处理。
  • finally 块在任何情况下都会执行,通常用于释放资源。

2.3 抛出异常

Java 允许你在程序中主动抛出异常。可以使用 throw 关键字抛出异常对象。

示例:使用 throw 抛出异常
public class ThrowExample {
    public static void main(String[] args) {
        try {
            checkAge(15);
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());  // 输出: Age must be 18 or older
        }
    }

    public static void checkAge(int age) {
        if (age < 18) {
            throw new IllegalArgumentException("Age must be 18 or older");
        }
    }
}

解释

  • checkAge 方法检查年龄,如果小于 18 岁,就抛出 IllegalArgumentException

2.4 自定义异常

有时,我们需要创建自定义异常类,以便处理特定的错误情况。自定义异常类通常继承自 ExceptionRuntimeException 类。

示例:自定义异常
class InvalidAgeException extends Exception {
    public InvalidAgeException(String message) {
        super(message);
    }
}

public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
            validateAge(16);
        } catch (InvalidAgeException e) {
            System.out.println(e.getMessage());  // 输出: Age is invalid
        }
    }

    public static void validateAge(int age) throws InvalidAgeException {
        if (age < 18) {
            throw new InvalidAgeException("Age is invalid");
        }
    }
}

解释

  • InvalidAgeException 是一个自定义异常类。
  • validateAge 方法在年龄小于 18 时抛出自定义异常。

3. 异常的最佳实践

良好的异常处理不仅能帮助我们发现问题,还能使程序更加健壮和易于维护。以下是一些最佳实践:

3.1 不要捕获通用异常

尽量避免捕获 ExceptionThrowable,这样会掩盖实际的异常类型,难以定位问题。应该捕获特定的异常类型。

3.2 避免过度使用异常

异常处理的目的是应对异常情况,不是程序的正常控制流。不要用异常来控制程序的业务逻辑。频繁的抛出和捕获异常会带来性能损失。

3.3 使用自定义异常

当系统遇到特定错误时,自定义异常能提高程序的可读性和可维护性。使用明确的异常名称和清晰的错误信息。


4. 总结

在这篇博客中,我们深入探讨了 Java 集合框架和异常处理机制的核心概念和常用技巧。通过理解集合的种类和使用场景,以及掌握异常的捕获、抛出和自定义技巧,你将能够编写更高效、健

壮且易于维护的 Java 程序。

  • 集合框架 提供了多种灵活的数据结构,用于存储和操作数据。
  • 异常处理 是保证程序健壮性的关键,合理的异常捕获和处理机制能有效避免程序崩溃。

希望这篇博客能帮助你更深入地理解 Java 编程,提升你的开发技能。继续实践和学习,将使你在 Java 编程的道路上越走越远!

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

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

相关文章

React,Antd实现文本输入框话题添加及删除的完整功能解决方案

最终效果就是实现该输入框&#xff1a; 添加话题时&#xff0c;话题自动插入到输入框前面多文本输入框左侧间距为话题的宽度多行文本时&#xff0c;第二行紧接开头渲染删除文本时&#xff0c;如果删除到话题&#xff0c;再次删除&#xff0c;话题被删除 首先构造div结构 cons…

坑人 C# MySql.Data SDK

一:背景 1. 讲故事 为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MySql.Data,这就让人无语了,并且反馈都是升级了MySql.Data驱动引发,接下…

(五)FT2232HL高速调试器之--三步实现STM32的VSCODE在线仿真工程搭建

对于单片机开发&#xff0c;rtthread studios 与 vscode&#xff0c;鱼与熊掌可以兼得否&#xff0c;其实是可以的&#xff0c;下面通过三个步骤&#xff0c;实现基于FT2232HL高速调试器的&#xff0c;stm32的VSCODE在线仿真工程的搭建。 1、软件下载与VSCODE插件安装配置 软…

【计算机网络】lab2 Ethernet(链路层Ethernet frame结构细节)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…

鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现

鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现 在之前的教程中完成了分类页面的左右两侧的列表结构&#xff0c;如下图所示。 接下来需要实现左侧分类导航项的点击操作&#xff0c;可以友好的提示用户选择了哪一个文字分类导航项。 一、左侧文字分类导航的处理 …

数字IC后端零基础入门基础理论(Day1)

数字IC后端设计导入需要用到的input数据如下图所示。 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 Netlist: 设计的Gate level&#xff08;门级&#xff09;网表。下图所示为一个计数器设计综合后的门级netlist。 从这个netlist中我们看到这个设计顶层的名字叫counte…

如何编译Opencv +ffmpeg linux 明明安装了ffmpeg但是opencv就是找不到

想要编译opencvffmpeg&#xff1a; 1.安装ffmpeg 随便位置&#xff08;具体看ffmpeg 编译安装&#xff09; 执行下面命令&#xff0c;其中/usr/local/ffmpeg/lib/pkgconfig是你实际的ffmpeg路径 export PKG_CONFIG_PATH$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig2.下载…

三维视频融合在数字孪生中的应用

一、在提升监控效率与决策准确性方面的应用 改善监控视角与理解&#xff1a;在数字孪生场景下&#xff0c;三维视频融合技术能够将监控视频与三维环境相结合。例如在城市安防、工业生产、大型活动等场景中&#xff0c;形成连续、实时、动态的三维全景拼接图。这解决了传统监控…

语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限

环境&#xff1a; Win10专业版 谷歌浏览器 版本 131.0.6778.140&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; 问题描述&#xff1a; 局域网web语音识别出现识别失败 chrome控制台出现下获取浏览器录音功能&#xff0c;因为安全性问题&#xff0c;需要在…

计算机网络-传输层 TCP协议(上)

目录 报头结构 TCP的可靠传输机制 核心机制一&#xff1a;确认应答 TCP的序号和确认序号 核心机制二&#xff1a;丢包重传 核心机制三&#xff1a;连接管理 建立连接-三次握手 断开连接-四次挥手 核心机制四&#xff1a;滑动窗口 数据包已经抵达, ACK被丢了 数据包就…

【Cadence射频仿真学习笔记】IC设计中电感的分析、建模与绘制(EMX电磁仿真,RFIC-GPT生成无源器件及与cadence的交互)

一、理论讲解 1. 电感设计的两个角度 电感的设计可以从两个角度考虑&#xff0c;一个是外部特性&#xff0c;一个是内部特性。外部特性就是把电感视为一个黑盒子&#xff0c;带有两个端子&#xff0c;如果带有抽头的电感就有三个端子&#xff0c;需要去考虑其电感值、Q值和自…

AutoSarOS中调度表的概念与源代码解析

--------AutoSarOS调度表的概念 一、AutoSarOS 是什么以及调度表的重要性 AutoSar(Automotive Open System Architecture)是汽车行业的一个开放式软件架构标准哦。它就像是一种大家都遵循的规则,能让不同的软件供应商一起合作开发汽车软件,这样软件就能被重复使用,开发效…

对golang的io型进程进行off-cpu分析

背景&#xff1a; 对于不能占满所有cpu核数的进程&#xff0c;进行on-cpu的分析是没有意义的&#xff0c;因为可能程序大部分时间都处在阻塞状态。 实验例子程序&#xff1a; 以centos8和golang1.23.3为例&#xff0c;测试下面的程序&#xff1a; pprof_netio.go package m…

VS项目,在生成的时候自动修改版本号

demo示例&#xff1a;https://gitee.com/chenheze90/L28_AutoVSversion 可通过下载demo运行即可。 原理&#xff1a;通过csproject项目文件中的Target标签&#xff0c;实现在项目编译之前对项目版本号进行修改&#xff0c;避免手动修改&#xff1b; 1.基础版 效果图如下 部…

springcloud-gateway获取应用响应信息乱码

客户端通过springcloud gateway跳转访问tongweb上的应用&#xff0c;接口响应信息乱码。使用postman直接访问tongweb上的应用&#xff0c;响应信息显示正常。 用户gateway中自定义了实现GlobalFilter的Filter类&#xff0c;在该类中获取了上游应用接口的响应信息&#xff0c;直…

node安装,npm安装,vue-cli安装以及element-ui配置项目

node.js Node.js主要用于开发高性能、高并发的网络服务器&#xff0c;特别适合构建HTTP服务器、实时交互应用&#xff08;如聊天室&#xff09;和RESTful API服务器等。‌它使用JavaScript语言&#xff0c;基于Chrome V8引擎&#xff0c;提供模块化开发和丰富的npm生态系统&…

新能源汽车充电需求攀升,智慧移动充电服务有哪些实际应用场景?

在新能源汽车行业迅猛发展的今天&#xff0c;智慧充电桩作为支持这一变革的关键基础设施&#xff0c;正在多个实际应用场景中发挥着重要作用。从公共停车场到高速公路服务区&#xff0c;从企业园区到住宅小区&#xff0c;智慧充电桩不仅提供了便捷的充电服务&#xff0c;还通过…

MCU驱动使用

一、时钟的配置&#xff1a; AG32 通常使用 HSE 外部晶体&#xff08;范围&#xff1a;4M~16M&#xff09;。 AG32 中不需要手动设置 PLL 时钟&#xff08;时钟树由系统自动配置&#xff0c;无须用户关注&#xff09;。用户只需在配置文件中给出外部晶振频率和系统主频即可。 …

简单的bytebuddy学习笔记

简单的bytebuddy学习笔记 此笔记对应b站bytebuddy学习视频进行整理&#xff0c;此为视频地址&#xff0c;此处为具体的练习代码地址 一、简介 ByteBuddy是基于ASM (ow2.io)实现的字节码操作类库。比起ASM&#xff0c;ByteBuddy的API更加简单易用。开发者无需了解class file …

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块&#xff0c;旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项&#xff0c;企业可实现精细化管理&#xff0c;提升运营效…