Java最全2024年Java面试题最新整理,附白话答案(1),java每次面试一般多长时间

线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识

一线互联网P7面试集锦+各种大厂面试集锦

学习笔记以及面试真题解析

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

获取对象时需要用到equals和hashCode方法,正确的重写这两个方法是非常重要的,因为两个不相等的对象返回不同的hashCode的话,碰撞的几率就会小些,就可以提高HashMap的性能。

11. final、finally、finalize的区别

final用于修饰属性、方法和类,分别表示属性不可变,方法不可覆盖,类不可继承

finally异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在GC执行时会调用被回收对象的此方法

12. sleep()和wait()的区别

sleep()是Thread类的,wait()是Object类的方法

sleep不会释放锁,wait会释放锁。

sleep可在任意地方使用,wait notify notifyAll只能在synchronized块方法中使用。

sleep必须捕获异常,而wait不需要。

13. 抽象类和接口的区别、以及使用场景

**抽象类中可以有构造方法、静态方法、普通方法、普通成员变量。接口中不能有。

抽象类中的抽象方法访问类型可以是public、protected和默认类型,接口中只能是public。

抽象类中的静态成员变量访问类型可以任意,接口中只能是public的。

一个类只能继承一个类,但是可以实现多个接口。**

抽象类和子类为“是不是”的关系。主要用于为一些类提供公共实现代码。

接口和实现为“有没有”的关系。主要用于代码的扩展性和可维护性。

14. Overload(重载)和Override(重写)的区别

重载是一个类中多态性的一种表现,在一个类中定义了多个同名的方法,他们有不同的参数列表

重写是父类与子类之间多态的一种表现,子类中定义了与父类有相同名称和参数的方法时,子类对象使用该方法会调用子类中的定义。

15. forward(转发)和redirect(重定向)的区别

forward服务器请求资源,服务器访问目标URL,把响应内容发给用户,用户不知道数据是从哪来的。

redirect服务器向客户端发送一个状态码,告知重新请求该URL

16. 连接池的工作机制

服务器启动时会建立一定数量的池连接,客户端需要连接时,池会返回一个未使用的连接并将其标记为忙,如果没有空闲连接,池会新建一定数量的连接,当连接使用完毕后,池会将其标记为空闲。

17. 什么是序列化

序列化就是一种用来处理对象流的机制,就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输于网络之间。

可通过实现java.io.Serializable接口来实现序列化。

二、第三方框架部分


1. 什么是AOP、Spring AOP的底层原理是什么

AOP是面向切面编程,用于在不改变原有逻辑的基础上增加一些额外的功能,如事务管理、日志、缓存、权限控制等。

Spring AOP是基于代理的。

如果目标对象实现了接口,则默认采用JDK动态代理

如果目标对象没有实现接口,则采用CgLib进行动态代理

如果目标对象实现了接口,且强制CgLib代理,则采用CgLib动态代理。

2. 什么是IOC、IOC注入方式有哪些

IOC翻译为控制反转,他还有个别名为DI(依赖注入)。

IOC就是由IOC容器来负责对象的生命周期和对象之间的关系

控制反转就是本来应该你做的事情,让系统去做,比如通常获取一个对象需要通过new,而使用IOC则是IOC将对象创建后注入到被注入的对象中。

注解注入(Spring)、构造器注入setter方法注入、接口方式注入(不推荐)

3. Mybatis中 #{} 和 ${}的区别

#{}是预编译,可防止SQL注入

${}是直接拼接在SQL语句中。

4. Spring Boot的核心注解是什么,它是由哪几个注解组成的

核心注解:@SpringBootApplication

包含:

@SpringBootConfiguration 实现配置文件功能

@EnableAutoConfiguration 打开自动配置功能

@CompoentScan 组件扫描功能

5. SpringBoot 怎么读取配置文件

属性上使用@Value注解

类上使用@ConfigurationProperties注解

读取指定文件注解可在类上使用@PropertySource(不支持yml文件读取)

注入Environment对象获取到。

6. SpringCloud和Dubbo的区别

SpringCloud采用基于HTTP的REST API,Dubbo采用RPC方式。

7. SpringCloud的Hystrix断路器特性

请求熔断:请求服务失败量超过一定比例(默认50%)断路器会切换到开路状态,这时所有请求不会发送到后端服务,断路器在保持开路状态一段时间后(默认5秒),自动切换到半开路状态。这时如果下一次请求成功,断路器切回闭路状态,否则重新切换到开路状态。

服务降级:对于查询操作,可以实现一个fallback方法。当请求服务出现异常时,可以使用fallback方法返回的值。

依赖隔离:通过线程池来实现资源隔离,比如一个服务调用另外两个服务,如果这两个服务在同一线程池,那么如果一个服务卡住,后面的请求又来了,就会导致后面的请求都会卡住等待。

请求缓存:缓存上次请求结果,返回给后续请求。

请求合并:把多个请求合并成一个请求,提升效率。

三、MySQL数据库部分


1. 事物的四大特性和隔离级别

原子性:不可分割的操作单元,要么全部成功,要么回滚。

一致性:如果执行事物之前数据库是一致的,那么执行后还是一致的。

隔离性:事物操作之间彼此独立和透明,互不影响。

持久性:事物一旦提交,其结果就是永久的。

未提交读:允许脏读,其他事物只要修改了数据,即使未提交,本事物也能看到修改后的数据值。

提交读:只能读取到已提交的数据。

可重复读(innoDB默认):无论其他事物是否修改并提交了数据,这个事物中的数据不受影响。

串行读:完全串行化的读,每次读都要获得锁,读写相互都会阻塞。

2. MySQL优化相关

使用更小的整数类型、尽可能的定义字段为not null(否则会导致索引复杂)、

只创建需要的索引、分库分表。

使用explain检查复杂SQL语句、LIMIT语句尽量要跟order by或distinct、

插入多条数据时使用单条INSERT语句。

3. MySQL存储引擎InnoDB和MyISAM的区别

InnoDB支持事物,MyISAM不支持。

InnoDB支持外键,MyISAM不支持。

InnoDB是聚集索引,MyISAM是非聚集索引。索引和数据文件是分离的。

InnoDB必须要有主键(没有会自己找或创建),MyISAM可以没有。

InnoDB不保存表的行数,MyISAM用了一个变量保存表的行数。

InnoDB支持表、行级锁 默认行级锁,MyISAM只支持表级锁。

4. MySQL在哪些情况下不使用索引

like查询使用%开头不能使用索引,但用%结尾的可以使用索引。

where语句中使用<>或!=。

where语句中使用or,且没有把or中的所有字段加上索引。

where语句中对字段表达式操作。

where语句中使用NOT IN。使用简单的IN会使用索引。

5. MySQL分库分表策略

垂直切分:某个表字段过多,可以将不常用或字段长度较大的字段拆分出去到扩展表中。

水平切分:分为库内分表和分库分表,是根据表内数据的逻辑关系,按照不同的条件分散到多个数据库或表中。

四、扩展阅读


1. 关于Spring对JDK和CgLib动态代理的选择

通过查阅Spring-AOP包中的org.springframework.aop.framework.DefaultAopProxyFactory 类得到以下代码:

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {

@Override

public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {

if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {

Class<?> targetClass = config.getTargetClass();

if (targetClass == null) {

throw new AopConfigException("TargetSource cannot determine target class: " +

“Either an interface or a target is required for proxy creation.”);

}

if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {

return new JdkDynamicAopProxy(config);

}

return new ObjenesisCglibAopProxy(config);

}

else {

return new JdkDynamicAopProxy(config);

}

}

private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {

Class<?>[] ifcs = config.getProxiedInterfaces();

return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));

}

}

可以看到,Spring先使用isOptimize()方法、isProxyTargetClass()方法以及hasNoUserSuppliedProxyInterfaces()方法进行判断,这三个方法的含义分别如下:

isOptimize()

是否对生成代理策略进行优化

当返回值为true时为进行优化,如果有接口就代理接口(使用JDK动态代理),没有接口代理类(CGLIB代理)

当返回值为false时为不进行优化(default)

isProxyTargetClass()

是否强制使用CGLIB来实现代理

当返回值为true时为强制使用CgLib来实现代理

当范围值为false时为不强制使用CgLib来实现代理,而是首选JDK来实现代理(default)

hasNoUserSuppliedProxyInterfaces()

判断代理的对象是否只有指定了SpringProxy的接口或未实现接口

当返回值为true时代表没有实现接口或仅实现了指定SpringProxy的接口

最后

这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)

image

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)

[外链图片转存中…(img-BGITVaXO-1715299575256)]

[外链图片转存中…(img-JWmsqtDt-1715299575257)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值