java偏功能实现的面试题,教你如何做面霸_公司面试实现功能
6. 描述一下怎么实现分页(>7)
limit语法
7. sql优化经验或者sql编写技巧(>9k)
可以参考适当的背一些,但是都不如掌握explain语法。建议掌握。
8. 描述mysql的两种搜索引擎(>9k)

9. 聚集索引与非聚集索引区别(>10)
如果想了解“聚集索引和非聚集索引”那么可以先看看B树和B+树
下面说说他们的区别
聚集索引:1.属于Innodb。
2.按照主键B+树的排列方式存放,子节点存放的就是数据。(如果没有主键,以第一列为聚集索引)
3.只有一个聚集索引。
4.普通索引指向聚集索引
非聚集索引:1.属于MyIsam。
2.普通索引和非聚集索引没什么区别。
3.存放的是地址。
10. 说一下mysql的事务隔离级别(>10)
未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。
提交读(Read Committed):只能读取到已经提交的数据。
可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL
标准中,该隔离级别消除了不可重复读,但是还存在幻读。
串行化(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞,效率最低,可以避
免脏读,幻读,不可重复读。
这四种隔离等级从上向下依次变低
11. b tree与b+tree (>12k)
篇幅有限请自行百度
>
> 同样,必备技能,但是小公司没有问的那么深,能熟练的书写sql语句,掌握常用语法就已经达标。在sql优化方面explain可以说是必杀技了,建议了解。
>
>
>
### 三.设计模式
1. 说说了解哪些设计模式 (在我这,一般到这就结束了。。)(>5)
根据了解扩展
2. 详细描述一下工厂模式,代理模式。(>7)
概念:委托一个代理类对另一个类进行控制(代理类中有被代理类的对象,同时可以在代理类中增强)
使用场景:aop(可以控制被代理类是否被调用,是否被代理)。
优点: 1.确保被代理类的隐秘性
2.降低耦合性(不用挨个加需要增强的方法)
分静态代理,jdk代理,CGLib动态代理
>
> 篇幅有限 具体的请自行了解
>
>
>
3. 说说在日常编码中使用过哪些设计模式(>7)
代理模式,工厂模式,外观模式,策略模式。
请自行扩展。
4. 介绍一下外观模式(>8)
它为子系统中的一组接口提供一个统一的高层接口。这一接口使得子系统更加容易使用。(体现为service和dao,
一个service可以调用多个dao)
5. 代理模式,装饰者模式,适配器模式三者类图相同 说说三者区别 (>9)
适配器模式:主要强调适配,在不使用继承的情况下,可以调用其他不同的接口。
代理模式:主要强调控制,被代理的类不一定执行,可能不允许被代理。
装饰者模式:主要强调增强,目的是在原类中加入需要装饰。而被装饰者一般情况下都会被执行
6. 介绍策略模式和状态模式的区别(>10)
这个也比较常问,所以好好理解 建议仔细研究一下:https://www.zhihu.com/question/23693088
>
> 设计模式在日常使用中使用的不多,但是也需要了解一些基础来扩宽以后的视野。现在阶段可以适当了解应付一下面试。
>
>
>
### 四.mybatis
1. #{}与%{}区别(>5)
{}是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;
Mybatis 在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值。
使用#{}可以有效的防止 SQL 注入,提高系统安全性
2. 说说sql注入(>5)
账号密码输入‘’ or 1=1
查询语句变成以下形式
SELECT * FROM Users WHERE username=‘’ or 1=1 AND password=‘’ or 1=1;
3. 说说常用标签(>5)
foreach,where,if,sql,set,include,sql,choose,curd不多说
4. mysql自增主键怎么返回(>6)
标签加入keyProperty=“id” useGeneratedKeys=“true”
5. 说说mybatis的一级缓存和二级缓存 (>7)
一级缓存是自动开启的。是sqlSession级别的缓存。个人理解就是同一个事务之内,调取两次相同sql.
二级缓存是mapper级别的,只要是对一个mapper调用就可以使用二级缓存。
6. mybatis的实现原理(>9)
一言难尽,请自行百度。
>
> 必备技能,但是以上基础部分需要重点掌握。根据自己的薪资可以自行提升难度。
>
>
>
### 五.分布式
1. 介绍一下分布式,说说对分布式的理解(>5)
分布式侧重将一个系统拆分成多个业务单元,例如一个门户网站里面可能有登录、视频、图片等,每一个都可以拆分出
来独立部署,而且每一个都可以弄成集群,视频服务集群,图片服务集群,主系统可以对这些子系统进行调用,子系统
之间可以有调用关系也可以没有,看实际业务情况。
网上很多,请自己总结
2. 分布式事务(>10)
tcc,seata等,篇幅原因请自行查看
3. 分布式锁(>10)
Redission等,篇幅原因请自行查看
>
> 分布式事务分布式锁等小公司使用并不多,初级,中级了解即可,如果想拿到一个更高的薪资(装b)建议掌握。
>
>
>
### 六.spring全家桶(吃饭的家伙)
#### 6.1 spring
1. 介绍一下spring的理解(>5)
提供了ioc,aop,用于解耦。
2. spring的依赖注入和控制反转是什么意思(>5)
依赖注入与控制反转是一回事
依赖注入:被注入对象依赖IoC容器配置依赖对象。
控制反转:bean的控制交于工厂。
3. 和new()相比,spring有什么优点(>6)
1.bean交于容器统一管理
2.节省堆内存
4. ioc与aop的实现原理(>7)
ioc工厂模式
aop代理模式
涉及源码,篇幅有限 请自行百度
5. 说一下自己了解spring注入失败的原因(>6)
1.bean重名
2.bean起名为set或get(其他关键字可能也会有问题)
3.循环依赖
6. 能介绍一下spring的循环依赖吗 (>10)
循环依赖其实就是循环引用,也就是两个或则两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A
7. 说一下spring的事务传播级别(>10)
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
8. bean的初始化流程 (>10)
涉及源码,篇幅有限 请自行百度。
#### 6.2 spring cloud
1. 是否使用过微服务,说说对微服务的理解 (>5)
1.按照业务拆分服务,方便于管理开发。
2.更加方便集群化建设。
3.更加容易容器化建设。
2. 在项目中使用过哪些微服务组件(>6)(根据不同微服务生态)
Netflix和爸爸版生态 需要了解一个
3. 说说微服务生态的各组件的选型(>7)
建议选型爸爸版
注册与配置:nacos
服务间调用:dubbo/openfeign
网关:getway
监控:sentinel
优点
1.还在持续开源,未来或许还有其他功能
2.nacos比eureka更加强大,有命名空间,组等功能呢。
3.性能更加优越。
4.中文文档齐全。
4. 说说对网关的理解(>7)
在没有API网关作为统一出口的情况下,需要调用方自己组合各种服务,而且容易让调用方感知后端各种服务的存在,
加入网关后,客户端调用服务需要通过网关来进行,并且网关可以处理路由,安全,限流,缓存,日志,监控,重试,
熔断等事务,使业务开发更纯净。
5. 说说对熔断的理解(>7)
由于网络原因或者自身的原因,服务并不能保证 100% 可用,如果单个服务出现问题,调用这个服务就会出现线程阻
塞,此时若有大量的请求涌入,Servlet 容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故
障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的 “雪崩” 效应。为了解决这个问题,业界提
出了 熔断器模型。
6. 在微服务体系中 服务的注册和暴露的过程 (>8)
服务向注册中心发送请求,注册中心获取到服务信息后,保存在本地,当需要服务间需要调用时,服务会拉取注册中心
的服务列表,获取被调用服务信息,执行调用。
并且有着心跳的概念,及在固定时间内服务向注册中心发送请求,表明自己还活着。
7. 服务间调用如果响应时间过慢造成无响应怎么办(>9)
可以加大调用允许保持连接的时间,但是如果是响应过慢,对用户体验特别差,所以不建议。所以需要以下
1.排查被调用服务器是否有优化余地,如sql等。
2.如果是少部分请求,加入熔断,提升用户体验,
3.如果允许可以使用异步或者mq。以异步的方式获取数据。
#### spring mvc(如果简历写过)
1. spring mvc的原理 (>7)
(1)客户端(浏览器)发送请求,直接请求到DispatcherServlet。
(2)DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。
(3)解析到对应的Handler后,开始由HandlerAdapter适配器处理。
(4)HandlerAdapter会根据Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。
(5)处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。
(6)ViewResolver会根据逻辑View查找实际的View。
(7)DispaterServlet把返回的Model传给View。
(8)通过View返回给请求者(浏览器)
详细答案请自行百度
2. 介绍一下dispatchservlet (>8)
- 请求会首先发送到DispatchServlet,这是spring的前置Servlet,它会接收请求并转发给spring的MVC
controller,也就是业务controller - DispatchServlet通过HandlerMapping(处理器映射)确定将请求转发给哪个controller,HandlerMapping主
要通过请求中的URL确定映射关系的 - DispatchServlet将请求转发给确定的controller之后,DispatchServlet卸下请求的负载,controller负责处
理这个请求,一般会通过调用service层进行业务逻辑处理 - 当controller处理完请求后,它会把业务处理结果封装成model,为了使处理结果的model在页面上更好的展示,
controller还会指定展示model对应的view(比如一个JSP页面),当controller确定了model和view之后,会把它们
以请求的形式再转发给DispatchServlet - DispatchServlet通过查询ViewResolver(视图解析器)找到view对应的页面
- DispatchServlet最终把model交给页面进行渲染
- 页面对model进行渲染,将结果展示到客户端,整个请求结束
3. 说说对上下文的理解(>8)
context就是“容器”,放的就是应用程序的所有资源,要用时候就访问它,所以context里面的东西,在同一个应用程
序里面是全局的;web上下文可以看成web应用的运行环境,一般用context名字来修饰,里面保存了web应用相关的一
些设置和全局变量
4. 说说与spring boot的区别(>10)
spring mvc需要大量xml配置,spring boot遵守着约定大于配置,springboot具体实现可以参考下文
#### 6.3 spring boot
1. 介绍一下编写接口的注解(>5)
@RestController,@RequestMapping,@RequestParam,@Service,@RequestBody,@requestmapping等
2. 介绍一下spring boot事务(>5)
一个接口内,数据全部处理完成或者处理失败,防止一部分失败一部分成功。
使用@Transactional(rollbackFor = Exception.class)
3. 描述一下restful风格(>7)
一种软件架构风格、设计风格,增删改查接口全部使用一个命名,使用请求类型来(get,post,put,delete)确定调
用的那个接口。
4. springboot的启动原理(>8)
1.运行 SpringApplication.run()方法
2.SpringApplicationRunListeners listeners = this.getRunListeners(args);获取监听器
3.listeners.starting()触发applicationStartedEvent 启动监听器
4.准备好环境environment 触发applicationEnvironmentPrepareEvent
5.创建一个spring上下文createApplicationContext()
6.初始化上下文
1):获取要启动类包的地址
2):转为BeanDefinitionRegistry
3):通过注解扫描出bean
4):调用BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder,
this.registry);将启动类BeanDefinition注册到IoC容器的beanDefinitionMap中
7.刷新上下文refreshContext(注入各种需要的bean 以下是bean的生命周期 !!关键)
//设置BeanFactory的后置处理. 空方法,留给子类拓展用。
(1)postProcessBeanFactory(beanFactory);
//调用BeanFactory的后处理器, 这些后处理器是在Bean定义中向容器注册的.
(2)invokeBeanFactoryPostProcessors(beanFactory);
(3)实现自动化配置
//注册Bean的后处理器, 在Bean创建过程中调用.
(4)registerBeanPostProcessors(beanFactory);
//初始化上下文中的消息源,即不同语言的消息体进行国际化处理
(5)initMessageSource();
//初始化ApplicationEventMulticaster bean,应用事件广播器
(6)initApplicationEventMulticaster();
//初始化其它特殊的Bean, 空方法,留给子类拓展用。
(7)onRefresh();
//检查并向容器注册监听器Bean
(8)registerListeners();
//实例化所有剩余的(non-lazy-init) 单例Bean.
(9)finishBeanFactoryInitialization(beanFactory);
//发布容器事件, 结束refresh过程.
(10)finishRefresh();
7.ApplicationRunner和CommandLineRunner启动
5. spring boot是怎么实现约定大于配置的(>8)
涉及源码,请自行百度。
6. 描述一下spring boot中的异步(>8)
@EnableAsync使异步调用@Async注解生效
调用后立即返回固定对象,释放线程,程序在后台执行。前台无感知。
7. 描述一下跨域是如何处理(>8)
添加cors配置。指定后台地址允许访问。
8. 介绍一下自定义注解(>9)
1.基于aop
2.拦截器
3.ConstraintValidator注解实现验证
9. 介绍一下@resource和@Autowired区别(>9)
@Autowired注解由Spring提供,只按照byType注入;@resource注解由J2EE提供,默认按照byName自动注入2、
@Autowired默认按类型进行装配,@Resource默认按照名称进行装配。”
>
> 对于小公司,技能要求真心不多,数据结构算法,完全用不上,那么最重要的还是springboot的使用,如果你能熟练的书写接口,熟练掌握ssh,那么找个一个理想的工作是不难的。所以,springboot接口编写一定要6。
>
>
>
#### 6.4 spring security
1. 描述一下spring security作用,并分别介绍以下(>7)
验证与鉴权。
验证:验证密码是否正确
鉴权:判断用户是否有权限访问接口。
2. spring security token的存储方式 (>7)
内存,数据库,redis,jwt
3. jwt和redis存储有什么区别 (>8)
jwt只能验证,并不能对token删除修改等,如果需要踢人,或者需要对token进行操作,请选择redis.
4. 描述一下spring security核心配置类 (>8)
5. 简单介绍一下spring security的原理(>9)
是一大堆过滤器链,分别验证
6. 怎么实现验证码功能(>9)
7. 记住我功能怎么实现(>9)
>
> 在小公司spring security+oauth2人才真的少,所以学吧老铁。如果未来想成为公司的架构的参与者,或者不满于curd,spring security应该是值得你掌握的。
>
>
>
### 七.中间件
#### 7.1 elasticsearch
1. 简单介绍一下es (如果简历有写)
Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。并
有以下特点
1.分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
2.实时分析的分布式搜索引擎。
3.可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
2. 说说es的倒排索引是怎么回事 (>6)
记录每个词条出现在那些文档,以及文档中的位置,可以根据词条快速定位到包含这个词条的文档及出现的位置
3. es查询索引的语句怎么写 (>6) (以上两个问题答不上来说明不会 不用往下问了 二三线使用概率还是很小的)
GET /20211201-logs/_search
{
“query”: { “match_all”: {}
}
4. es使用的场景是什么(>7)
全文检索,精准查询,elk等
5. spring boot整合中用了什么客户端 (>7)
简单的可以使用spring提供的ElasticsearchTemplate
复杂的可以使用RestClient
6. 查询前缀名相同的索引的查询语句 (>8)
GET /*_logs/_search
{
“query”: { “match_all”: {}
}
>
> 使用的非常少,有写的咱就得问啊。不是必须掌握。
>
>
>
#### 7.2 rabbitmq
1. mq的作用是什么(>5)
削峰,异步,解耦
2. rabbitmq使用场景(>6)
向其他服务器异步发送消息
大量请求怼过来,按照服务器性能慢慢拉取适量请求
3. 说说交换机种类(>7)
fanout:发送给所有绑定该交换机的队列。
Direct:默认的交换方法,按照提供的key去寻找队列。如果key为A,数据只能发送到A的队列中。
Topic:模糊匹配,只要符合该格式就可以。可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配
一个单词,“#”用于匹配多个单词(可以是零个)。如*.C.# 可以匹配A.C.B.不能匹配A.B.C.(其中以banding key
关联)
head:根据消息内容中的headers属性进行匹配。
4. 怎么保证消息不丢失(>8)
1:队列持久化硬盘
2:手动ack
3:确认是否发送成功
4:集群化处理
5:异地容灾
6:发送消息持久化到db中 进行消息的重新发送
7:消费者消息固话到db中 通过消息id判断是否重复消费
5. 说说ack和nack
手动应答是否接收成功,否则会出现消费者一直占用这队列的情况
6. 了解延时队列和死信队列吗 (>10)
死信队列:如果有有错误消息 如果手动nack同时将消息放回到队列中 那么这条消息会反复消费 留在队列中
如果nack后将消息丢弃 那么如果碰到网络抖动 消息也会丢失 。 所以 建立死信队列避免消息丢失。
延时队列:在一定条件后触发执行
>
> mq在小公司应用的也比较少,但是强烈建议了解一下,如果不写一般也不会问,但是如果使用一定要在一定程度保证消息的准确性,如:防止长期占用一个队列,消息不消费的情况。
>
>
>
#### 7.3 redis
1. redis的使用场景(>5)
使用自动过期策略存放token
热点数据存放redis
利用原子性自增计数器
分布式锁
2. redis为什么比数据库快(>6)
一.纯内存操作
二.单线程反而避免了多线程的频繁上下文切换问题
3. redis5个基本数据类型(>6)
string,list,map,set,zset
4. redis雪崩 击穿 穿透(>8)
5. 雪崩 击穿 穿透的解决办法 (>9)
一 缓存雪崩:大量key同时失效,大量请求发送到db上,导致db宕机。
解决办法:设置key过期时间时,使用随机数
二 缓存穿透:大量请求请求一个缓存中没有的key,这些请求直接怼到db上,造成宕机。如发送为负数的入参时。(一般为黑客侵入)
解决办法:1.加入入参的验证,防止非法入参。
2.nginx加入拦截,防止同一个ip大量的请求。
3.使用布隆过滤器判断数据库是否存在,不存在直接返回。
一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网安视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
三、精品网安学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、网络安全源码合集+工具包
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、网络安全面试题
最后就是大家最关心的网络安全面试题板块

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)