Java开发工程师&架构师面试题

8.14 LWJ
1.Java中,如果2个对象有相同的hashcode,用equals作比较的时候,应该是true或false还是其他什么情况?
map的情况下呢?

2.springcloud项目开发中用到了哪些组件?
springcloud用的什么版本?
对于后面继续升级了的springcloud采用什么方案?springcloud有好多组件现在不是停止更新了吗?

3.面向用户的项目,你们会考虑外部的攻击吗?

4.分布式锁你用的是什么方案?redis+什么?

5.Mybatis有用二级缓存吗?查询优化做什么考量?

6.在整体框架层面的优化,对一些缓存的应用,一些其他技术的支持、其他业务如全文检索,类似于走中间件,项目中都用到了哪些?举例说明。
你们用全文检索,在什么业务方面、为什么要考虑全文检索?在整体优化上会考虑框架上的什么优化?针对系统在实际使用中的优化。举例说明。

7.docker的作用?为什么要用docker?

8.redis怎么保持热点数据?热点数据:用的频率比较高的数据。
让用户可以持续关注到一部分热点数据?
redis中用什么策略可以保持持续关注到热点数据?
如何保证其中一部分数据一直是热点数据?

9.数据库事务的隔离级别。

10.Spring中aop和ioc原理是什么?Java层面最终用的什么技术?

11.activeMQ有什么组件?
(activeMQ就是一个组件)

12.rabbitMQ中间件 有哪些组件?不同的业务是用到了什么组件?怎么处理的?

13.前后台传递消息的时候,Controller层,@requestBody,@requestParam有什么区别?@requestbody支持get请求吗?
最后一个问题没听清楚说的什么注解。

1.Java中,如果2个对象有相同的hashcode,用equals作比较的时候,应该是true或false还是其他什么情况?map的情况下呢?

```bash
简而言之,在集合查找时,hashcode能大大降低对象比较次数,提高查找效率!

Java对象的eqauls方法和hashCode方法是这样规定的:

1、相等(相同)的对象必须具有相等的哈希码(或者散列码)。

2、如果两个对象的hashCode相同,它们并不一定相同。

详解参考:https://www.cnblogs.com/Neil-J/p/13547244.html
2.springcloud项目开发中用到了哪些组件?springcloud用的什么版本?对于后面继续升级了的springcloud采用什么方案?springcloud有好多组件现在不是停止更新了吗?
用到的组件:
Eureka:注册中心,
Feign:实现提供者和消费者之间的请求调用,
Ribbon:负载均衡,
Hystrix:熔断器,
ZUUl:网关,前端将请求发送到这里,再由zuul实现分发
springcloud版本:SR4
升级方案:Eureka换成nacos

(组件详情参考我的其他博客。)
3.面向用户的项目,你们会考虑外部的攻击吗?
这时可能会发生缓存穿透的情况:
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,
如发起为id为“-1024”的数据或id为特别大不存在的数据。
这时的用户很可能是攻击者,攻击会导致数据库压力过大。
解决方法:
1.接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
2.从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,
缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。
这样可以防止攻击用户反复用同一个id暴力攻击
4.分布式锁你用的是什么方案?redis+什么?
基于 REDIS 的 SETNX()、EXPIRE() 方法做分布式锁。
1、setnx(lockkey, 1) 如果返回 0,则说明占位失败;如果返回 1,则说明占位成功
2、expire() 命令对 lockkey 设置超时时间,为的是避免死锁问题。
3、执行完业务代码后,可以通过 delete 命令删除 key。

具体到业务中,redis中的setnx,每个商品指定一个key值,在对其操作的时候将其key值放入setnx中,这样其他进程就无法访问。

详情参考:https://blog.csdn.net/jaryle/article/details/93774341
5.Mybatis有用二级缓存吗?查询优化做什么考量?
我参与过的项目中没用二级缓存,缓存采用的redis来解决的。

Mybatis一级缓存作用域是session,session commit之后缓存就失效了

Mybatis二级缓存作用域是sessionfactory,该缓存是以namespace为单位的(也就是一个Mapper.xml文件),
不同namespace下的操作互不影响。所有对数据表的改变操作都会刷新缓存。
但是一般不要用二级缓存,例如在UserMapper.xml中有大多数针对user表的操作。
但是在另一个XXXMapper.xml中,还有针对user单表的操作。
这会导致user在两个命名空间下的数据不一致。
如果在UserMapper.xml中做了刷新缓存的操作,在XXXMapper.xml中缓存仍然有效,
如果有针对user的单表查询,使用缓存的结果可能会不正确,读到脏数据。

Redis比之一、二级缓存的好处很多,Redis可以搭建在其他服务器上,缓存容量可扩展。Redis可以灵活的使用在需要缓存的数据上,比如一些热点数据。

二级缓存详情参考:https://www.jianshu.com/p/d98d6cb61841
6.在整体框架层面的优化,对一些缓存的应用,一些其他技术的支持、其他业务如全文检索,类似于走中间件,项目中都用到了哪些?举例说明。
全文检索的话有elasticsearch,solr,目的是为了减缓mysql数据库的压力,
缓存像我刚刚说的,redis来进行数据缓存,
走中间件的话就是rebbitmq和activemq,
如果是说处理高并发,就说分布式锁+activemq队列,
处理分布式事务就说rabbitmq,比如消息通过中间件分发到队列,
再分发到消费者,中间出现异常就通过死信队列或者中间件持久化来处理事务等等。
7.docker的作用?为什么要用docker?
Docker是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
每一个容器都相当于一个小型的linux系统。

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。
其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

详情参考:https://www.jianshu.com/p/3bfa8d09bc8b
8.redis怎么保持热点数据?热点数据:用的频率比较高的数据。

让用户可以持续关注到一部分热点数据?

1.我们在设置一个key的时候,一般会给这个key设置一个过期时间(expire time)
可以将热点数据的过期时间加大,普通的数据可能很快就过期而被淘汰,而热点的数据就相对的持续很久了。
2.结合redis对key的定期删除和惰性删除,走redis的内存淘汰策略,
使用属性allkeys-lru(从所有数据集中挑选最近最少使用的数据淘汰;最常用的热点数据缓存策略)。
3.设置热点数据永远不过期。

详情参考:https://www.cnblogs.com/linxiyue/p/10945216.html
https://blog.csdn.net/zzpueye/article/details/81451916
9.数据库事务的隔离级别。
MySQL数据库为我们提供的四种隔离级别:

  ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
  对于同⼀⾏记录,“写”会加“写锁”,“读”会加“读锁”,当出现读写锁冲突的时候,后访问的事务必须等前⼀个事务执⾏完成,才能继续执⾏。

  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
  ⼀个事务执⾏过程中看到的数据,总是跟这个事务在启动时看到的
数据是⼀致的。
也就是说,⼀个事务的查询结果每次都是⼀样的。
  ③ Read committed (读已提交):可避免脏读的发生。
  ⼀个事务提交之后,它做的变更才会被其他事务看到。

  ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
  ⼀个事务还没提交时,它做的变更就能被别的事务看到。

详情参考:https://www.cnblogs.com/fjdingsd/p/5273008.html
10.Spring中aop和ioc原理是什么?Java层面最终用的什么技术?
控制反转(Inverse of Control,IoC),又称依赖注入(Dependency Injection)。
当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,
调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可。
也就是说将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。

AOP:面向切面编程。(Aspect-Oriented Programming)
AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。
当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。
也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。
日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。
在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。

详情参考:https://blog.csdn.net/dkbnull/article/details/87219562

Java层面最终用的什么技术?
创建applicationContext.xml -> 注入Bean到配置文件(如bean,dao,service) -> 
通过ClassPathXmlApplicationContext实例化spring配置文件的上下文 -> 
通过ApplicationContext的getBean()方法根据id去获取Bean的实例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值