2023 java面试题整理

java面试题整理二

1、RocketMQ消息可靠性怎么保证?
To:消息丢失可能发生在生产者发送消息、MQ本身丢失消息、消费者丢失消息三个方面
生产者丢失:
可能发生在程序发送异常了没有重试处理、或者发送成功但是网络出现问题导致MQ没有收到.这个时候消息就丢失了
处理方法:可以通过异步发送+回调通知+本地消息表的形式处理;
比如:
1.下单后先保存本地数据和MQ消息表,这个时候消息的状态是发送中,如果本地事物失败,那么下单失败,事物回滚
2.下单成功,直接返回客户端成功,异步发送MQ消息
3.MQ回调通知消息发送结果,对应更新数据库MQ发送状态
4.JOB轮询超过一定时间还未成功发送,就去重试
5.在监控平台JOB程序处理一定次数一直发送不成功,就告警,人工处理
MQ本身丢失:
可能发生在MQ收到消息后还在内存中,这时候宕机了又没来得及同步给节点,这时候导致消息丢失
处理方法:进行刷盘的处理,RocketMQ分为同步刷盘和异步刷盘两种方式,默认的是异步刷盘,就有可能导致消息还未刷到硬盘上就丢失了,可以通过设置为同步刷盘的方式来保证消息可靠性,这样即使MQ挂了,恢复的时候也可以从磁盘中去恢复消息.
消费者丢失:
可能发生在消费者刚收到消息,此时服务器宕机,MQ认为消费者已经消费,不会重复发送消息,消息丢失.
处理方法:RocketMQ默认是需要消费者回复ack确认,消费方不返回ack确认,重发的机制根据MQ类型的不同发送时间间隔、次数都不尽相同,如果重试超过次数之后会进入死信队列,需要手工来处理了.
2、如果消费者一直消费失败,消息积压怎么处理?
To:
1、消费者出错,肯定是程序或者其他问题导致,如果容易修复,先把问题修复,让消费者(consumer)恢复正常消费
2、做转发处理,写一个临时的消费方案,先把消息消费,然后转发到新的topic和MQ资源,这个topic单独申请,要能承载当时积压的消息
3、处理完积压后,修复consumer,去消费新的MQ和现有的MQ数据,新的MQ消费完成后恢复原状
3、RocketMQ实现原理?
To:RocketMQ由NameServer注册中心集群、Producer生产者集群、Consumer消费者集群和若干Broker(RocketMQ进程)组成
架构原理:
1、Broker在启动的时候去向所有的NameServer注册,并保持长连接,每30s发送一次心跳
2、Producer在发送消息的时候从NameServer获取Broker服务器地址,根据负载均衡算法选择一台服务器来发送消息
3、Conusmer消费消息的时候同样从NameServer获取Broker地址,然后主动拉取消息来消费
4、Broker是怎么保存数据的?
To:Broker在收到消息之后,会把消息保存到commitlog的文件中
5、Master和Slave之间是怎么同步数据的?
To:
1、在broker收到消息之后,会被标记为uncommitted状态
2、然后会把消息发送给所有slave
3、slave在收到消息之后返回ack响应给master
4、master在收到超过半数的ack之后,把消息标记为committed
5、发送committed消息给所有slave,slave也修改状态为committed
6、Elasticsearch 与 Solr 的比较总结
To:
1、Solr利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能
2、Solr支持更多的数据类型,而Elasticsearch仅支持json文件格式
3、Solr在传统的搜索应用中表现好于Elasticsearch,但在处理实时应用时效率明显低于Elasticsearch
7、为什么用自增列作为主键?
To: 如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
如果使用非自增主键,由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现在索引页的中间某个位置
此时,MySQL不得不移动数据,甚至每次把缓存清掉后,又重新从磁盘上读取出来,这增加了很多开销
8、为什么使用数据索引能提高效率?
To:
1、数据索引是有序的存储
2、在有序的情况下,通过索引查询一个数据是无需遍历索引记录的
3、极端情况下,数据索引的查询效率为二分法查询效率,趋近于log2(N)
9、B+树索引和哈希索引的区别?
To:
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接,是有序的
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需要一次哈希算法即可,是无序的
10、哈希索引的优势是什么?
To:
等级查询,哈希索引具有绝对优势(前提是:没有大量重复键值,如果大量重复键值时,哈希索引的效率很低,因为存在所谓的哈希碰撞问题)
11、哈希索引不适用的场景有哪些?
To:
1、不支持范围查询
2、不支持索引完成排序
3、不支持联合索引的最左前缀匹配规则
通常,B+树索引结构适用于绝大多数的场景,像下面这种场景用哈希索引才更有优势:
如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引
12、B树和B+树的区别是什么?
To:
B树,每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null,叶子节点不包含任何关键字信息
B+树,所有的叶子节点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子节点本身依关键字的大小自小而大的顺序链接,所有的非终端节点可以看成是索引部分

13、java中如何解决哈希冲突?
To:
1、再哈希发:又叫双哈希法,有多个不同的hash函数,出现冲突后采用其他的哈希函数计算,直到不再冲突为止
2、拉链法:又叫链地址法,将具有相同哈希地址的记录链成一个单链表,m个哈希地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构
(拉链法优点:
1、拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短
2、由于拉链法中各链表上的节点空间是动态申请的,故它更适合于造表前无法确定表长的情况)

14、spring security的认证流程是怎么样的?
To:
1、用户发起表单登陆请求,首先进入UsernamePasswordAuthenticationFilter,在UsernamePasswordAuthenticationFilter中根据用户输入的用户名、密码构建了UsernamePasswordAuthenticationToken 并将其交给AuthenticationManager来进行认证处理
2、接着跳转到ProviderManager,该类是AuthenticationManager的实现类
3、AuthenticationManager跳转到AbstractUserDetailsAuthenticationProvider来进行处理
4、再次调用UserDetailsService类里面的UserDetails方法,将我们的用户存入UserDetails,最后进行Authentication认证
15、使用JWT认证原因是什么?
To:
支持用户通过用户名和密码登录,登录后通过http header返回token,每次请求,客户端需要通过header将token带回,用于权限校验;服务端负责token的定时刷新
16、SpringClound和Dubbo有哪些区别?
To:
dubbo是二进制传输,占用带宽少一点.SpringClound是http传输,带宽会多一点,同时使用http协议一般会使用JSON报文,消耗会更大
dubbp开发难度较大,所依赖的jar包有很多问题大型工程无法解决.SpringClound对第三方的继承可以一键式生成,天然集成
SpringClound接口协议约定比较松散,需要强有力的行政措施来限制接口无序升级
最大的区别:
SpringClound抛弃了Dubbo的RPC通信,采用的是基于HTTP和REST方式
17、SpringBoot和SpringClound之间的关系?
To:
SpringBoot专注于快速方便的开发单个个体微服务;SpringClound关注全局的微服务协调治理框架,将SpringBoot开发的一个个单体微服务组合并管理起来
SpringBoot可以离开SpringClound独立使用,但是SpringClound不可以离开SpringBoot,属于依赖关系.
18、什么是熔断?什么是服务降级?
To:
服务熔断的作用类似于家用的保险丝,当服务出现不可用或者响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用
服务降级时从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了防止某些功能出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback错误处理信息.这样,虽然提供的是一个有损的服务,但是却保证了整个系统的稳定性和可用性
19、eureka和zookeeper的区别是什么?
To:
zookeeper是CP原则,强一致性和分区容错性
eureka是AP原则,可用性和分区容错性
zookeeper当主节点故障时,zk会在剩余节点重新选择主节点,耗时过长,虽然最终能够恢复,但是选取主节点期间会导致服务不可用,这是不能容忍的
eureka各个节点时平等的,一个节点挂掉,其他节点仍会正常保证服务

20、Hystrix的使用方式?
To:
Hystrix翻译过来就是“豪猪”的意思.它的设计目的:
1⃣️:通过第三方客户端的库来访问依赖服务时的潜在故障提供保护和控制
2⃣️:防止在复杂分布式系统中出现级联故障
3⃣️:快速失败和迅速恢复
4⃣️:在允许的情况下,提供退路对服务进行优雅降级
5⃣️:提供近实时的监控、报警和操作控制
使用方式:
现在pom文件引入依赖;再修改启动类,在启动类上加上@EnableCircuitBreaker注解,也可以直接使用@SpringCloundApplication注解来代替@SpringBootApplication(或者@EnableEurekaServer)、@EnableDiscoveryClient、@EnableCircuitBreaker这三个注解。在进行修改Controlle,在方法上面增加断路器功能(注解 @HystrixCommand(fallbackMethod = “getMsgFallback”)fallbackMethod(退回的方法名)
)
Feign结合Hystrix:通过配置@FeignClient注解的fallback属性来指定fallback处理类
修改yml配置,Feign默认是关闭Hystrix的支持的
21、JWT的token是怎么解析的?
To:
获取token之后,使用jwts.parse的climes方法进行解析,因为解析数据存放在climes里面,从climes里面或取数据即可

22、Feign的原理是什么?
To:
Feign远程调用,核心就是通过一系列的封装和处理,将以JAVA注解的方式定义的远程调用API接口,最终转换成HTTP的请求形式,然后将HTTP的请求的响应结果,解码成JAVA Bean,返回给调用者.
23、synchronized 和Lock区别?
To:
synchronized存在jvm层面上,lock是一个类; synchronized性能少量同步,lock大量同步; synchronized锁状态无法判断,lock可以判断

24、什么是SQL注入?

To:
	SQL注入是通过把SQL命令插入到web表单提交或通过页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL指令。

25、mybatis中的#{} 为什么能防止sql注入,${}不能防止sql注入?

To:
	 #{}在mybatis中的底层是运用了PreparedStatement 预编译,传入的参数会以 ? 形式显示,因为sql的输入只有在sql编译的时候起作用,当sql预编译完后,传入的参数就仅仅是参数,不会参与sql语句的生成,而${}则没有使用预编译,传入的参数直接和sql					
              进行拼接,由此会产生sql注入的漏洞。

26、父类的静态方法能否被子类重写?
To:
不能,因为重写的定义是重写父类的虚函数,虚函数式动态绑定的,而静态方法是静态绑定的,所以静态必然不是虚函数,就不存在重写之说了
27、mysql行锁和表锁的区别是什么?
To:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
28、双亲委派模型。 向上委托 向上委托
TO:
程序运行类加载器--------->扩展类加载器--------->引导类加载器

29、垃圾回收算法
TO:
标记-清楚算法
标记-复制算法
标记-整理算法

30、什么是内存泄漏?什么是内存溢出?
TO:
内存溢出:程序申请内存时,没有足够空间存放
内存泄漏:程序运行后,没有被释放占用的内存空间,垃圾回收器无法进行回收,时间长了,就导致内存泄漏,堆积一定程度就会产生内存溢出
资源未关闭,长时间也会导致内存泄漏
31、类加载过程
TO:
java程序运行------->javac编译.class文件------>链接(验证、准备、解析)------->初始化------->使用-------->卸载

32、创建线程池的方法(7种)
TO:
1⃣️:Executors.newFixedThreadPool
创建一个固定大小的线程池,可控制并发的线程数,超出的线程会在队列中等待
2⃣️:Executors.newCachedThreadPool
创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后回收,若线程数不够,则新建线程


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值