1/31每日

1. Exception 和 Error 的区别

ExceptionError 都是 Throwable 类的子类,但它们有不同的用途和含义。

  • Exception: 代表程序运行时可以处理的异常情况。Exception 是可预料的,通常是程序逻辑错误或者其他外部因素导致的,程序可以通过捕获这些异常来做出适当的处理。例如:FileNotFoundExceptionIOException 等。

  • Error: 代表程序无法控制的严重错误,通常是由系统或硬件故障引起的。Error 不应当被捕获和处理,通常意味着程序的执行不能继续下去。例如:OutOfMemoryErrorStackOverflowError 等。

总结:

  • Exception 是可以被捕获和处理的异常。
  • Error 是无法被程序处理的错误,通常表示虚拟机或硬件故障。

2. Checked Exception 和 Unchecked Exception 的区别

Checked ExceptionUnchecked Exception 是 Java 中异常的两大类,主要区别在于是否需要显式处理(捕获或者声明)。

  • Checked Exception:

    • 需要显式处理,即程序必须通过 try-catch 块捕获,或者通过 throws 声明抛出。
    • 通常代表可以预见和处理的异常,如文件未找到、网络连接中断等。
    • 例如:IOExceptionSQLException
  • Unchecked Exception:

    • 不需要显式处理,通常是程序中的错误,系统不会强制要求处理这些异常。
    • 继承自 RuntimeException,通常是程序的逻辑错误,例如数组越界、空指针访问等。
    • 例如:NullPointerExceptionArrayIndexOutOfBoundsException

Java 三大特性

Java 的三大特性是:封装 (Encapsulation)继承 (Inheritance)多态 (Polymorphism)。这三大特性是面向对象编程的核心,帮助开发者组织和管理代码,提升可重用性和扩展性

  1. 封装 (Encapsulation):

    • 定义: 封装是将对象的状态(属性)和行为(方法)绑定在一起,并对外界隐藏实现细节,只有通过公有方法(如 getter 和 setter)访问对象的状态。
    • 好处: 通过封装,可以保护对象的内部状态不被随意改变,增加了安全性和灵活性,也提高了代码的可维护性。
    • 实现:
      • 将类的属性声明为 private,然后通过 public 方法提供对属性的访问。

继承 (Inheritance):

  • 定义: 继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,使得子类可以复用父类的代码,同时可以扩展或修改父类的行为。
  • 好处: 继承使得代码得以复用,避免了重复代码,并且有助于构建类之间的层次结构。

多态 (Polymorphism):

  • 定义: 多态是指同一个方法在不同的对象中表现出不同的行为。通过多态,可以用统一的接口调用不同实现类的对象,增强代码的灵活性和可扩展性。
  • 好处: 多态支持程序设计中的“开放-封闭原则”,即对扩展开放,对修改封闭。即我们可以扩展新的子类,不需要修改现有代码。
  • 实现:
    • 方法重载:同一个类中,方法名称相同但参数不同,表现为编译时多态。
    • 方法重写:子类重写父类的方法,表现为运行时多态。

方法重载 (Overloading):

  • 同一个类中,方法名称相同,但参数类型、数量或顺序不同。
  • 这种多态性是在编译时确定的,叫做编译时多态。

方法重写 (Overriding):

  • 子类可以重写父类的方法,调用时会根据实际对象的类型来决定调用哪个方法。
  • 这种多态性是在运行时确定的,叫做运行时多态。

多态的优势

  • 灵活性: 可以通过父类引用指向子类对象,调用父类方法时实际执行的是子类重写的方法。

        在上面的例子中,animal1animal2 都是 Animal 类型的引用,但它们指向的是 DogCat 的实例。调用 sound() 方法时,实际执行的是 DogCat 中重写的方法,而不是 Animal 类中的方法,这体现了灵活性。

class Animal {public void sound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("Dog barks");}
}class Cat extends Animal {@Overridepublic void sound() {System.out.println("Cat meows");}
}public class Test {public static void main(String[] args) {Animal animal1 = new Dog();  // 父类引用指向子类对象Animal animal2 = new Cat();  // 父类引用指向子类对象animal1.sound();  // 输出 "Dog barks"animal2.sound();  // 输出 "Cat meows"}
}
  • 可扩展性: 新增子类时,不需要修改已有代码,只需新增子类并实现父类的接口或方法。
// 定义 Shape 接口
interface Shape {void draw();
}// Circle 类实现了 Shape 接口
class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing Circle");}
}// Rectangle 类实现了 Shape 接口
class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing Rectangle");}
}// Triangle 类实现了 Shape 接口
class Triangle implements Shape {@Overridepublic void draw() {System.out.println("Drawing Triangle");}
}// 测试类
public class Test {public static void main(String[] args) {// 创建 Shape 类型的数组Shape[] shapes = { new Circle(), new Rectangle(), new Triangle() };// 使用多态遍历数组并调用每个形状的 draw 方法for (Shape shape : shapes) {shape.draw();}}
}
  • 代码简洁: 通过多态,代码更加简洁,避免了大量的 ifswitch 语句来判断类型。
class Animal {public void sound(String animalType) {if (animalType.equals("Dog")) {System.out.println("Dog barks");} else if (animalType.equals("Cat")) {System.out.println("Cat meows");} else {System.out.println("Unknown animal");}}
}public class Test {public static void main(String[] args) {Animal animal = new Animal();animal.sound("Dog");  // 通过判断字符串来调用不同的行为animal.sound("Cat");}
}abstract class Animal {public abstract void sound();
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("Dog barks");}
}class Cat extends Animal {@Overridepublic void sound() {System.out.println("Cat meows");}
}public class Test {public static void main(String[] args) {Animal dog = new Dog();Animal cat = new Cat();dog.sound();  // 输出 "Dog barks"cat.sound();  // 输出 "Cat meows"}
}
                                Collection|----------------------------------------------------------------|                               |                               |List                           Set                            Queue|                               |                               |-----------------              ---------------               --------------|               |              |             |               |            |
ArrayList    LinkedList      HashSet     TreeSet        LinkedList    PriorityQueue|LinkedHashSet

Collection:这是所有集合类的根接口。它定义了一些基本的集合操作方法,如 add()remove()size() 等。

  • List:继承自 Collection,是有序的集合,允许重复元素。常见的实现类有:

    • ArrayList:基于动态数组实现,查找速度快,插入和删除效率较低。
    • LinkedList:基于双向链表实现,适合频繁的插入和删除操作。
  • Set:继承自 Collection,是无序的集合,不允许重复元素。常见的实现类有:

    • HashSet:基于哈希表实现,元素无序,查找速度快。
    • LinkedHashSet:基于哈希表和链表实现,保持插入顺序。
    • TreeSet:基于红黑树实现,元素自动按升序排序。
  • Queue:继承自 Collection,用于按顺序处理元素。常见的实现类有:

    • LinkedList:既是 List 的实现类,也是 Queue 的实现类,适用于队列操作。
    • PriorityQueue:基于优先级堆实现,元素按优先级排序。。

 

HashMap 的扩容机制是基于负载因子(load factor)和容量(capacity)来动态调整大小的。具体流程如下:

  1. 负载因子HashMap 默认的负载因子是 0.75,意味着当 HashMap 中存储的元素个数达到了容量的 75% 时,会触发扩容。

  2. 容量HashMap 的容量是它可以存储的桶的数量。扩容时,HashMap 会将桶的数量扩展为原来容量的两倍。

  3. 扩容触发条件:当 HashMap 中的元素数量超过了负载因子和当前容量的乘积时(即元素数量 >= 容量 * 负载因子),就会触发扩容。

  4. 扩容过程

    • 新的容量是原来容量的两倍。
    • 所有的键值对都会重新计算哈希值并被重新分配到新的桶中,因为桶的数量发生了变化。这个过程可能会带来一定的性能开销,特别是当数据量很大的时候。
  5. 扩容后的影响:扩容后,HashMap 的性能通常会稍微降低,直到再填充一些元素后,性能才会回到正常水平。

总的来说,HashMap 通过负载因子和容量来平衡空间和性能,避免了过早的扩容带来的不必要开销,同时也防止了因为容量不足导致的频繁扩容。

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

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

相关文章

供应链系统设计-供应链中台系统设计(十四)- 清结算中心设计篇(三)

关于清结算中心的设计,我们之前的两篇文章中,对于业务诉求的好的标准进行了初步的描述,如果没有看的同学可以参考一下两篇文章进行了解,这样更有利于理解本篇的内容。链接具体如下: 供应链系统设计-供应链中台系统设计…

搭建自己的专属AI——使用Ollama+AnythingLLM+Python实现DeepSeek本地部署

前言 最近DeepSeek模型非常火,其通过对大模型的蒸馏得到的小模型可以较轻松地在个人电脑上运行,这也使得我们有机会在本地构建一个专属于自己的AI,进而把AI“调教”为我们希望的样子。本篇文章中我将介绍如何使用OllamaAnythingLLMPython实现…

Golang 并发机制-1:Golang并发特性概述

并发是现代软件开发中的一个基本概念,它使程序能够同时执行多个任务,从而提高效率和响应能力。在本文中,我们将探讨并发性在现代软件开发中的重要性,并深入研究Go处理并发任务的独特方法。 并发的重要性 增强性能 并发在提高软…

【算法应用】基于鲸鱼优化算法求解OTSU多阈值图像分割问题

目录 1.鲸鱼优化算法WOA 原理2.OTSU多阈值图像分割模型3.结果展示4.参考文献5.代码获取 1.鲸鱼优化算法WOA 原理 SCI二区|鲸鱼优化算法(WOA)原理及实现 2.OTSU多阈值图像分割模型 Otsu 算法(最大类间方差法)设灰度图像有 L L …

项目升级Sass版本或升级Element Plus版本遇到的问题

项目升级Sass版本或升级Element Plus版本遇到的问题 如果项目有需求需要用到高版本的Element Plus组件,则需要升级相对应的sass版本,Element 文档中有提示,2.8.5及以后得版本,sass最低支持的版本为1.79.0,所升级sass、…

数据结构 树1

目录 前言 一,树的引论 二,二叉树 三,二叉树的详细理解 四,二叉搜索树 五,二分法与二叉搜索树的效率 六,二叉搜索树的实现 七,查找最大值和最小值 指针传递 vs 传引用 为什么指针按值传递不会修…

利用metaGPT多智能体框架实现智能体-1

1.metaGPT简介 MetaGPT 是一个基于大语言模型(如 GPT-4)的多智能体协作框架,旨在通过模拟人类团队的工作模式,让多个 AI 智能体分工合作,共同完成复杂的任务。它通过赋予不同智能体特定的角色(如产品经理、…

嵌入式系统|DMA和SPI

文章目录 DMA(直接内存访问)DMA底层原理1. 关键组件2. 工作机制3. DMA传输模式 SPI(串行外设接口)SPI的基本原理SPI连接示例 DMA与SPI的共同作用 DMA(直接内存访问) 类型:DMA是一种数据传输接口…

【MySQL】--- 复合查询 内外连接

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: MySQL 🏠 基本查询回顾 假设有以下表结构: 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为…

2 MapReduce

2 MapReduce 1. MapReduce 介绍1.1 MapReduce 设计构思 2. MapReduce 编程规范3. Mapper以及Reducer抽象类介绍1.Mapper抽象类的基本介绍2.Reducer抽象类基本介绍 4. WordCount示例编写5. MapReduce程序运行模式6. MapReduce的运行机制详解6.1 MapTask 工作机制6.2 ReduceTask …

【memgpt】letta 课程6: 多agent编排

Lab 6: Multi-Agent Orchestration 多代理协作 letta 是作为一个服务存在的,app通过restful api 通信 多智能体之间如何协调与沟通? 相互发送消息共享内存块,让代理同步到不同的服务的内存块

cmd命令行无法进入D:盘怎么办

我找到了一个方法就是 增加一个/d cd /d d: 如下图,我不仅可以进入d盘符下,还可以访问盘符下的文件夹

【机器学习】自定义数据集 ,使用朴素贝叶斯对其进行分类

一、贝叶斯原理 贝叶斯算法是基于贝叶斯公式的,其公式为: 其中叫做先验概率,叫做条件概率,叫做观察概率,叫做后验概率,也是我们求解的结果,通过比较后验概率的大小,将后验概率最大的…

2025年人工智能技术:Prompt与Agent的发展趋势与机遇

文章目录 一、Prompt与Agent的定义与区别(一)定义(二)区别二、2025年Prompt与Agent的应用场景(一)Prompt的应用场景(二)Agent的应用场景三、2025年Prompt与Agent的适合群体(一)Prompt适合的群体(二)Agent适合的群体四、2025年Prompt与Agent的发展机遇(一)Prompt的…

2025_1_31 C语言中关于数组和指针

1.数组作为指针传递 数组作为指针传递可以: 加一个数减一个数两个指针相减自增自减 int main() {int arr[] { 1,2,3,4,5,6,7,8,9 };printf("%d\n", arr[0] 2);printf("%d\n", arr[2] - 2);printf("%d\n", arr[0] arr[2]);int* …

Baklib推动企业知识管理创新与效率提升的全面探讨

内容概要 在当今数字化转型的背景下,有效的知识管理显得尤为重要。知识是企业的核心资产,而传统的管理方式往往无法充分发挥这些知识的价值。因此,企业亟需一种高效、灵活的解决方案来应对这一挑战。Baklib作为一款先进的企业级知识管理平台…

JAVA实战开源项目:网上购物商城(Vue+SpringBoot) 附源码

本文项目编号 T 041 ,文末自助获取源码 \color{red}{T041,文末自助获取源码} T041,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

访问CMOS RAM

实验内容、程序清单及运行结果 访问CMOS RAM(课本实验14) 代码如下: assume cs:code data segment time db yy/mm/dd hh:mm:ss$ ;int 21h 显示字符串,要求以$结尾 table db 9,8,7,4,2,0 ;各时间量的存放单元 data ends cod…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能? 每月 2000 代码补全,帮助开发者快速完成代码编写。 每月 …

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器,网卡绑定有2个ip地址,分别为: A:192.168.111.201 B:192.168.111.202 在这台服务器请求目标地址 C:192.168.111.203 时必须使用B作为源地址才能访问目标地址C,在这台服务器默认…