分类: Java面试题

24 篇文章

Spring依赖注入的几种方式详解
在Spring框架中,依赖注入(Dependency Injection,简称DI)是控制反转(Inversion of Control,简称IoC)的核心实现方式。它通过将对象的依赖关系由自身创建改为外部容器注入,降低了组件间的耦合度,提高了代码的可维护性和可测试性。本文将详细介绍Spring中常用的几种依赖注入方式,包括构造器注入、Setter…
Java中为什么不建议用 equals 判断对象相等?
在Java开发中,equals()方法是我们日常编码中频繁使用的对象比较方法。然而,直接使用a.equals(b)进行对象比较存在诸多隐患,实际开发中并不推荐这种写法。本文将深入分析其原因,并介绍更安全的替代方案。 一、空指针异常风险 核心问题:当调用者为null时抛出NullPointerException 这是使用equals()方法最常见也是…
在java中HashMap是怎么解决哈希冲突的?
HashMap 主要通过以下几种方式解决哈希冲突: 1. 链表法(拉链法) 这是HashMap最基本的冲突解决方式: 每个数组元素(桶)存储一个链表 当多个key的哈希值相同(哈希碰撞)时,这些键值对会以链表形式存储在同一个桶中 新元素插入到链表头部(Java 8改为尾部插入) // 简化示意图 [0] -> null [1]…
为什么重写 equals()就必须要同时重写 hashCode()?
这是一个非常经典的Java面试题。重写 equals() 时必须重写 hashCode() 主要是为了维护 hashCode方法的通用约定,确保基于哈希的集合(如 HashMap、HashSet、Hashtable)能够正常工作。 根本原因:hashCode 方法的约定 在 Object类的规范中,hashCode()方法有以下重要约定: 一致性:…
Java 中 final、finally 和 finalize 各有什么区别?
在Java中,final、finally 和 finalize​ 是完全不同的三个概念,主要区别如下: 1. final(关键字) 作用:用于声明不可变的实体 修饰变量:变量一旦初始化就不能被修改(基本类型值不能变,引用类型引用不能变) 修饰方法:方法不能被子类重写(override) 修饰类:类不能被继承 // 1. final变量 final …
Java 中 String、StringBuffer 和 StringBuilder 的区别是什么?
在 Java 中,String、StringBuffer和 StringBuilder都是用于处理字符串的类,但它们在可变性、线程安全性和性能方面有重要区别。以下是详细的对比: 1. String(字符串常量) 不可变性:String对象创建后不可改变,任何修改操作都会生成新的对象 线程安全:由于不可变,天生线程安全 存储位置:字符串常量池(字面量…
为什么不能用浮点型表示金额?
这是一个非常重要且常见的问题。简单来说,因为浮点型(如 float、double)是二进制近似值,无法精确表示十进制小数,而金融计算要求绝对精确,一分一厘都不能有误差。 下面从原理、问题和解决方案三个方面详细解释: 1. 根本原因:二进制浮点数的固有缺陷 计算机使用二进制(0和1)存储数字。浮点数(如IEEE 754标准)通过“符号位+指数+尾数”…