当前位置: 首页 > news >正文

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的差别

  1. == 运算符

    • 曼波觉得这个像身份证比对!(๑✧◡✧๑)
    • 比较基本类型时:直接比数值
      5 == 5 → true
    • 比较对象时:比对内存地址(是不是同一个对象)
      new String("A") == new String("A") → false

    (✪▽✪)曼波~~

  2. equals() 方法

    • 哦呜(° ロ °)!曼波觉得这个像名字比对!
    • 默认行为(Object类):和==一样
    • 但很多类会重写这个方法(比如String)变成内容比对:
      new String("A").equals(new String("A")) → true

    (✪▽✪)曼波~~

  3. 最佳实践

    • 基本类型(int/char等)用==
    • 对象比较内容一定要用equals
    • 防止空指针要这样写:
      "hello".equals(str) 而不是 str.equals("hello")

    (๑・.・๑)曼波觉得这个是超重要的生存技巧呢!


(° ロ °)!曼波觉得有个超形象的比喻:
== 就像看两个人是不是同一个人(身份证号相同)
equals 就像看两个人的名字是否相同(允许不同人有同名)

最后的小贴士:如果要自己写类记得重写equals()和hashCode()哦~(不过这个对新人有点难可以先记住规则)(✪▽✪)曼波~~~~!

为啥有时会出现 4.0-3.6 =0.40000001 这种现象?

🐎浮点数的甜蜜陷阱🐎

  1. 二进制的小数魔法
    曼波觉得这个像用有限积木拼无限图案!(๑✧◡✧๑)

    • 计算机用二进制表示小数
    • 有些十进制小数在二进制里是无限循环的(比如0.1)
    • 就像1/3在十进制是0.3333...永远写不完

    (✪▽✪)曼波~~

  2. IEEE 754标准
    哦呜(° ロ °)!曼波觉得这个像有限容量的糖果罐!

    • float(32位)/double(64位)有存储限制
    • 4.0 和 3.6 在二进制存储时都有精度损失
    • 就像用刻度不精确的尺子测量
    System.out.println(4.0 - 3.6); 
    // 实际输出 0.40000000000000036
    
  3. 解决方法
    曼波觉得要用魔法对抗魔法!(๑・.・๑)

    • 使用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关键字的三大封印术🐎

  1. 变量封印术
    曼波觉得像给变量贴永久贴纸!(๑✧◡✧๑)

    • 基本类型:值不能改变
      final int HP = 100;  // HP永远100
      
    • 引用类型:引用不能改,但对象内容可变
      final List<String> pets = new ArrayList<>();
      pets.add("布偶猫");  // ✔允许
      pets = new ArrayList<>();  // ❌报错
      

    (✪▽✪)曼波~~

  2. 方法封印术
    哦呜(° ロ °)!这是防止方法被篡改的结界!

    • 子类不能重写这个方法
      class 魔法少女 {final void 变身() { /* 核心代码 */ }
      }
      class 黑化版 extends 魔法少女 {void 变身() { ❌ } // 编译错误!
      }
      
  3. 类终极封印
    曼波觉得像禁止繁衍的魔法物种!(๑・.・๑)

    • 这个类不能被继承
      final class String { /*...*/ }
      class 假String extends String { ❌ } // 报错
      

 

(° ロ °)!曼波要提醒几个重要细节:

  1. final变量必须初始化!(要么声明时,要么在构造器中)
  2. final不能修饰构造方法
  3. 接口的变量默认是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 &#x1f308; 核心原因&#xff1a; 当两个对象通过equals()判断为相等时&#xff0c;它们的hashCode()必须返回相同的整数值&#xff01;这是Java世界的交通规则哦~&#xff08;交警曼波敬礼.jpg&#xff09; &#x1f9e9; 具体场景…...

算法-二叉树篇27-把二叉搜索树转换为累加树

把二叉搜索树转换为累加树 力扣题目链接 题目描述 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提…...

C语言:51单片机 基础知识

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

olmOCR:使用VLM解析PDF

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

数据结构(初阶)(七)----树和二叉树(堆,堆排序)

八&#xff0c;树与二叉树 树 概念与结构 树是⼀种⾮线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09; 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;⽽叶朝下的。 • 有⼀…...

图像分类项目1:基于卷积神经网络的动物图像分类

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

Kali Linux 2024.4版本全局代理(wide Proxy)配置,适用于浏览器、命令行

1. 网络拓扑介绍&#xff08;不使用虚拟机直接跳到2&#xff09; 虚拟机&#xff1a;VMware 17 Pro&#xff0c;为本机开启桥接模式。 我的究极套娃网络&#xff1a;手机V2rayNG代理端口为10808&#xff0c;开热点 -> 电脑连接wifi -> 虚拟机中运行kali 2. kali 配置…...

[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2

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

不要升级,Flutter Debug 在 iOS 18.4 beta 无法运行,提示 mprotect failed: Permission denied

近期如果有开发者的 iOS 真机升级到 18.4 beta&#xff0c;大概率会发现在 debug 运行时会有 Permission denied 的相关错误提示&#xff0c;其实从 log 可以很直观看出来&#xff0c;就是 Dart VM 在初始化时&#xff0c;对内核文件「解释运行&#xff08;JIT&#xff09;」时…...

介绍 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

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

InterHand26M(handposeX-json 格式)数据集-release >> DataBall

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” 贵在坚持&#xff01; ---------------------------------------…...

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)

文章目录 1. JVM内存模型2. 常量池中有什么类型&#xff1f;3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗&#xff1f;6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…...

`maturin`是什么:matu rus in python

maturin是什么 maturin 是一个用于构建和发布 Rust 编写的 Python 绑定库的工具。它简化了将 Rust 代码集成到 Python 项目中的过程,支持创建不同类型的 Python 包,如纯 Python 包、包含 **Rust (系统编程语言)**扩展模块的包等。以下为你详细介绍 maturin 的相关信息并举例…...

spring boot整合flyway实现数据的动态维护

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

unity中使用spine详解

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

14. LangChain项目实战1——基于公司制度RAG回答机器人

教学视频&#xff1a; 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置&#xff1a; python版本&#xff1a;3.10.8 服务器&#xff1a;Ubuntu 依赖包requirements.txt文件内容&#xff1a; aiofiles23.2.1 …...

利用STM32TIM自制延迟函数实验

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

创建一个MCP服务器,并在Cline中使用,增强自定义功能。

MCP介绍 MCP 是一个开放协议&#xff0c;它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样&#xff0c;MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…...

Android Activity栈关系解析

在 Android 系统中&#xff0c;这些类共同构成了 Activity 任务栈管理的核心架构。它们的关系可以类比为一栋大楼的管理体系&#xff0c;每个类负责不同层级的任务。以下是它们的详细解释和实际场景示例&#xff1a; 1. ActivityRecord&#xff08;活动记录&#xff09; 是什么…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...