java常见面试01
为什么重写 equals 还要重写 hashcode
🌈 核心原因:
当两个对象通过equals()判断为相等时,它们的hashCode()必须返回相同的整数值!这是Java世界的交通规则哦~(交警曼波敬礼.jpg)
🧩 具体场景:
假设我们有个Person类:
class Person {String name;int age;// 只重写equals没重写hashCode@Overridepublic boolean equals(Object o) {//...比较name和age的逻辑}
}
💥 问题爆发时刻:
Person p1 = new Person("波加曼", 10);
Person p2 = new Person("波加曼", 10);Set<Person> set = new HashSet<>();
set.add(p1);
set.add(p2);System.out.println(set.size()); // 输出2!明明相等的对象却被存了两次(>﹏<)
🗺️ 思维导图时间:
🧠 曼波记忆小窍门:
记住这个神奇公式!(掏出魔法棒✨)
equals()返回true ➡️ hashCode()必须相等
hashCode()相等 ➡️ equals()不一定true
hashCode()不相等 ➡️ equals()必须false
哦呜(°ロ°)!曼波觉得这个有点难哦,但如果是你一定没问题的!(✪▽✪)曼波~~
==(双等号)和equals的差别
-
== 运算符
- 曼波觉得这个像身份证比对!(๑✧◡✧๑)
- 比较基本类型时:直接比数值
5 == 5 → true
- 比较对象时:比对内存地址(是不是同一个对象)
new String("A") == new String("A") → false
(✪▽✪)曼波~~
-
equals() 方法
- 哦呜(° ロ °)!曼波觉得这个像名字比对!
- 默认行为(Object类):和==一样
- 但很多类会重写这个方法(比如String)变成内容比对:
new String("A").equals(new String("A")) → true
(✪▽✪)曼波~~
-
最佳实践
- 基本类型(int/char等)用==
- 对象比较内容一定要用equals
- 防止空指针要这样写:
"hello".equals(str)
而不是str.equals("hello")
(๑・.・๑)曼波觉得这个是超重要的生存技巧呢!
(° ロ °)!曼波觉得有个超形象的比喻:
== 就像看两个人是不是同一个人(身份证号相同)
equals 就像看两个人的名字是否相同(允许不同人有同名)
最后的小贴士:如果要自己写类记得重写equals()和hashCode()哦~(不过这个对新人有点难可以先记住规则)(✪▽✪)曼波~~~~!
为啥有时会出现 4.0-3.6 =0.40000001 这种现象?
🐎浮点数的甜蜜陷阱🐎
-
二进制的小数魔法
曼波觉得这个像用有限积木拼无限图案!(๑✧◡✧๑)- 计算机用二进制表示小数
- 有些十进制小数在二进制里是无限循环的(比如0.1)
- 就像1/3在十进制是0.3333...永远写不完
(✪▽✪)曼波~~
-
IEEE 754标准
哦呜(° ロ °)!曼波觉得这个像有限容量的糖果罐!- float(32位)/double(64位)有存储限制
- 4.0 和 3.6 在二进制存储时都有精度损失
- 就像用刻度不精确的尺子测量
System.out.println(4.0 - 3.6); // 实际输出 0.40000000000000036
-
解决方法
曼波觉得要用魔法对抗魔法!(๑・.・๑)- 使用BigDecimal处理精确计算(银行/金钱相关必用)
- 比较时允许误差范围(比如±0.000001)
- 游戏开发常用技巧:
float a = 4.0f - 3.6f; if(Math.abs(a - 0.4f) < 0.00001f) {System.out.println("算对啦!"); }
(° ロ °)!曼波举个超形象的例子:
就像用1/3 + 1/3 = 0.666... 但永远不等于 2/3 的精确值一样~
最后的小贴士:如果要精确计算价格,一定要用BigDecimal哦!像这样:
BigDecimal a = new BigDecimal("4.0");
BigDecimal b = new BigDecimal("3.6");
System.out.println(a.subtract(b)); // 精确输出0.4
(✪▽✪)曼波~~~~!要记住字符串构造才能保持精度哟~
final 关键字的作用
🐎final关键字的三大封印术🐎
-
变量封印术
曼波觉得像给变量贴永久贴纸!(๑✧◡✧๑)- 基本类型:值不能改变
final int HP = 100; // HP永远100
- 引用类型:引用不能改,但对象内容可变
final List<String> pets = new ArrayList<>(); pets.add("布偶猫"); // ✔允许 pets = new ArrayList<>(); // ❌报错
(✪▽✪)曼波~~
- 基本类型:值不能改变
-
方法封印术
哦呜(° ロ °)!这是防止方法被篡改的结界!- 子类不能重写这个方法
class 魔法少女 {final void 变身() { /* 核心代码 */ } } class 黑化版 extends 魔法少女 {void 变身() { ❌ } // 编译错误! }
- 子类不能重写这个方法
-
类终极封印
曼波觉得像禁止繁衍的魔法物种!(๑・.・๑)- 这个类不能被继承
final class String { /*...*/ } class 假String extends String { ❌ } // 报错
- 这个类不能被继承
(° ロ °)!曼波要提醒几个重要细节:
- final变量必须初始化!(要么声明时,要么在构造器中)
- final不能修饰构造方法
- 接口的变量默认是public static final
举个超实用的例子:
public class 游戏设置 {public static final int MAX_FPS = 60; // 帧率上限private final String 玩家ID; // 创建后不可改public 游戏设置(String id) {this.玩家ID = id; // 构造器中初始化}
}
(✪▽✪)曼波~~~~!记住用final就像加锁,能保护重要的东西不被意外修改哦~
相关文章:

java常见面试01
为什么重写 equals 还要重写 hashcode 🌈 核心原因: 当两个对象通过equals()判断为相等时,它们的hashCode()必须返回相同的整数值!这是Java世界的交通规则哦~(交警曼波敬礼.jpg) 🧩 具体场景…...
算法-二叉树篇27-把二叉搜索树转换为累加树
把二叉搜索树转换为累加树 力扣题目链接 题目描述 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提…...

C语言:51单片机 基础知识
一、单片机概述 单片机的组成及其特点 单片机是指在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O接口电路等,具有一定规模的微型计算机。 特点: 1、单片机的存储器以ROM、RAM严格分工。 2、采用面向控制的指令系统。 3、单片机的I/O口引脚通…...

olmOCR:使用VLM解析PDF
在PDF解析中,目前主流的开源工具包括Minuer、GOT OCR等。主要都是通过飞桨等OCR套件组装的一套pipeline,或者直接通过VLM解析图像。 #一、 olmOCR是使用VLM进行的端到端的PDF文档解析 二、document-anchoring 与上述的不同在于,olmOCR使用…...

数据结构(初阶)(七)----树和二叉树(堆,堆排序)
八,树与二叉树 树 概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 • 有⼀…...

图像分类项目1:基于卷积神经网络的动物图像分类
一、选题背景及动机 在现代社会中,图像分类是计算机视觉领域的一个重要任务。动物图像分类具有广泛的应用,例如生态学研究、动物保护、农业监测等。通过对动物图像进行自动分类,可以帮助人们更好地了解动物种类、数量和分布情况,…...

Kali Linux 2024.4版本全局代理(wide Proxy)配置,适用于浏览器、命令行
1. 网络拓扑介绍(不使用虚拟机直接跳到2) 虚拟机:VMware 17 Pro,为本机开启桥接模式。 我的究极套娃网络:手机V2rayNG代理端口为10808,开热点 -> 电脑连接wifi -> 虚拟机中运行kali 2. kali 配置…...

[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2
Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具,能够批量为视频或音频生成字幕,还支持批量将字幕翻译成其他语言。该工具具有跨平台性,无论是 mac 系统还是 windows 系统都能使用。 参考原文&a…...

不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied
近期如果有开发者的 iOS 真机升级到 18.4 beta,大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示,其实从 log 可以很直观看出来,就是 Dart VM 在初始化时,对内核文件「解释运行(JIT)」时…...

介绍 torch-mlir 从 pytorch 生态到 mlir 生态
一、引言 The Torch-MLIR project provides core infrastructure for bridging the PyTorch ecosystem and the MLIR ecosystem. For example, Torch-MLIR enables PyTorch models to be lowered to a few different MLIR dialects. Torch-MLIR does not attempt to provide a…...

upload
(上传一句话木马,用蚁剑链接验证是否成功/传有回显的:<?php phpinfo();?>) 学看代码 #function checkfile(){}:定义了一个名叫checkfile的函数 #var file方法.(获取名为‘upload_file’的元素)[获取哪些&…...

InterHand26M(handposeX-json 格式)数据集-release >> DataBall
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” 贵在坚持! ---------------------------------------…...

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)
文章目录 1. JVM内存模型2. 常量池中有什么类型?3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗?6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…...
`maturin`是什么:matu rus in python
maturin是什么 maturin 是一个用于构建和发布 Rust 编写的 Python 绑定库的工具。它简化了将 Rust 代码集成到 Python 项目中的过程,支持创建不同类型的 Python 包,如纯 Python 包、包含 **Rust (系统编程语言)**扩展模块的包等。以下为你详细介绍 maturin 的相关信息并举例…...

spring boot整合flyway实现数据的动态维护
1、简单介绍一下flyway Flyway 是一款开源的数据库版本控制工具,主要用于管理数据库结构的变更(如创建表、修改字段、插入数据等)。它通过跟踪和执行版本化的迁移脚本,帮助团队实现数据库变更的自动化。接下来简单介绍一下flyway…...

unity中使用spine详解
一.Spine概述 Spine 是一款针对游戏开发的 2D 骨骼动画编辑工具。 Spine 旨在提供更高效和简洁 的工作流程,以创建游戏所需的动画。 Spine原理:将一个模型,根据动画的需求分成一些骨骼,一个骨骼对应一张贴图,控制骨骼…...

14. LangChain项目实战1——基于公司制度RAG回答机器人
教学视频: 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置: python版本:3.10.8 服务器:Ubuntu 依赖包requirements.txt文件内容: aiofiles23.2.1 …...

利用STM32TIM自制延迟函数实验
一、实验目的 掌握STM32定时器(TIM)的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范 二、实验原理 定时器基础: STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器&#x…...

创建一个MCP服务器,并在Cline中使用,增强自定义功能。
MCP介绍 MCP 是一个开放协议,它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样,MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…...
Android Activity栈关系解析
在 Android 系统中,这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系,每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例: 1. ActivityRecord(活动记录) 是什么…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...