java面试Day5

1. Java 中 hashCode 和 equals 方法是什么?它们和 == 各有什么区别?

在 Java 中,hashCode 和 equals 方法都是 Object 类的方法。它们的作用分别如下:

  • hashCode 方法返回对象的哈希码,用于支持基于哈希表的集合,如 HashMap、HashSet 等。如果两个对象的 equals 方法返回 true,则它们的 hashCode 方法必须返回相同的值,反之则不需要。

  • equals 方法用于比较对象是否相等。默认情况下,equals 方法使用的是 == 操作符,即只有两个对象引用指向同一个对象时才会返回 true。但是,大部分情况下,我们需要重写 equals 方法来实现自己定义的相等规则。

两者之间的区别在于,hashCode 方法返回的是一个 int 类型的数值,而 equals 方法返回的是一个 boolean 类型的值。

hashCode 方法用于快速比较两个对象是否不同,因为如果它们的哈希码不同,那么它们肯定不相等。hashCode 可能会出现 hash 碰撞,所以导致不相等的两个对象 hash 码可能相等,equals 方法则用于判断两个对象是否真正相等,这个判断比较复杂,需要根据对象的实际情况来定义。

另外,需要注意的是,== 操作符用于比较两个对象的引用是否相等,即它们是否指向同一个对象。而 equals 方法则用于比较两个对象的值是否相等。

在 Java 中,对象的值比较往往需要根据对象的实际情况来定义,因此一般需要重写 equals 方法。

== 和 equals() 的区别

== 对于基本类型和引用类型的作用效果是不同的:

  • 对于基本数据类型来说,== 比较的是值。

  • 对于引用数据类型来说,== 比较的是对象的内存地址。

因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。

equals() 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,因此所有的类都有equals()方法。

总结

  • equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。

  • 两个对象有相同的 hashCode 值,他们也不一定是相等的(哈希碰撞)。

2. Spring 的两大核心概念是什么?简单讲一下你对它们的理解

Spring 框架的两大核心概念是控制反转(Inversion of Control,IoC)和面向切面编程(Aspect Oriented Programming,AOP)。

控制反转IOC指的是将对象的创建和依赖注入由应用代码转移到了 Spring 容器中进行,即由 Spring 容器负责创建对象和管理它们之间的依赖关系。这样,应用代码只需要关注业务逻辑的实现,而不需要关注对象的创建和管理,降低了应用代码的复杂度,提高了代码的可重用性和可维护性。

面向切面编程AOP是指将与业务逻辑无关的代码(如日志、安全、事务等)从业务逻辑中剥离出来,以便于统一管理和维护。通过 AOP,我们可以将这些与业务逻辑无关的横切关注点(Cross-cutting Concerns)定义为切面(Aspect),并将它们织入到业务逻辑中,从而实现了业务逻辑与横切关注点的解耦。

这两个概念是 Spring 框架的核心,它们使得 Spring 框架具有了高度的可扩展性、灵活性和模块化,极大地提高了应用程序的开发效率和代码的可维护性。

扩展:

  1. AOP是如何实现的呢?

  • (见 面试题挑战 Day3 JDK 动态代理和 CGLIB 动态代理的区别是什么?)

  1. 如果你简历上写了设计模式,那么这两个核心概念中有涉及到什么设计模式可以讲讲吗?

  • 工厂设计模式:spring中使用了BeanFactory和ApplicationContext创建了Bean对象。

  • 单例模式:在IOC中的对象默认都是单例的,可以通过配置文件修改。

  • 代理模式:AOP就是基于动态代理的,如果对象实现了接口,使用JDK的动态代理,如果对象没有实现接口则使用CGLIB的动态代理。(这里可以暗示往这两个动态代理方面问,就又撞到前几天刷过的题了

3. 死锁是什么?如何预防和避免死锁?

死锁是指两个或多个进程互相等待对方释放资源而陷入无限等待的状态,导致程序无法继续执行下去,称为死锁。

死锁产生的四个条件:

  1. 互斥条件:多个线程不能同时使用一个资源

  2. 持有并等待条件:线程A在等待资源2的同时并不会释放自己已经持有的资源1

  3. 不可剥夺条件:在自己使用之前不能被其他线程获取

  4. 环路等待条件:两个线程获取资源的顺序构成了环形链

预防和避免死锁需要:

  1. 避免使用多个锁:在设计程序时,应尽量减少使用多个锁,或者在使用多个锁时,尽量将锁的持有时间缩短到最小。这可以减少死锁的概率。

  2. 避免嵌套锁:在使用嵌套锁时,需要注意锁的顺序,以避免不同线程获取锁的顺序不同而导致死锁。如果必须使用嵌套锁,可以使用统一的锁顺序来避免死锁。

  3. 使用超时机制:在获取锁时,可以设置一个超时时间,如果在指定时间内没有获取到锁,就放弃锁的获取,避免一直等待锁而导致死锁。

  4. 使用死锁检测和恢复机制:可以使用死锁检测机制来检测死锁的发生,并采取恰当的措施来解决死锁问题,比如终止一个进程或者回滚一个事务。

  5. 避免循环等待:在获取锁的时候,应该避免循环等待,即每个线程只能持有一个锁,而获取其他锁时必须先释放原有锁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值