金三银四面试题来一波,持续更新

这篇博客汇总了近期在上海的面试中遇到的问题,涉及Java、数据库、Spring框架、缓存、前端等多个技术领域。包括ES搜索引擎的原理、数据存储与搜索、事务处理、Spring注解、AOP理解、数据库优化、异常处理等核心知识点,适合面试复习。
摘要由CSDN通过智能技术生成

坐标上海,朋友面试的问题,我这边做一个分享;

2019.02.21

这个面试是一个朋友分享给我的,大佬梅先生。首先感谢下梅先生的分享,下面一个个问题去剖析;
3
1

1,es 搜索引擎 实现搜索和储存的原理是什么?

1、储存数据
无非就是数据的写入过程,当然回答 索引库导入 并没有什么意思。
来讲下些数据的过程如下,
request
—》node (该node 就是协调节点coordinating node)
-----》分发到primary node
------》primary node 进行处理,同步到 replication node
--------》 协调节点 监听 【类似于 redis 集群的sentinal 一样,监听】 监听primary node 和 replication node 都同步完成以后,返回信息给客户端,es写数据完成;

原理如下:
1、先到 buffer 同时写入 translog 中;
2、

2、搜索数据

2.1、就是从 es 中读取数据了,也就是读原理,和写数据的原理类似:

----》请求的id 到 document ,document 生成文档ID ,通过 hash 一致性算法分发到某一个 shard 上;【该处模糊,不清晰---------】

request
-----》请求到某一个 node ,该node 就是协调节点 coordinating node ;
-------》协调节点 对 document 进行请求分发,分发到对应的 node ,robin轮询 primary node 和 replication node 【读数据可以从replica node 进行读取】
--------》node 返回 document 给 协调节点,由 协调节点 返回给 client 端;

2.2、 es数据的搜索主要 靠 全文检索和倒排索引

全文检索:
request
----》协调节点 ,协调节点 转发请求到所有的 shard (分片) 对应的 primary shard 和 replica shard ,
------》 每一个 shard 就查询 documentID 出来
-------》由 协调节点 根据 documentID 来查询 所以的 document ,返回给 client 端;

倒排索引:


2、事务
@Transactional


3、多线程
线程并发问题:


4、spring的注解:

@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@Scope用于指定scope作用域的(用在类上)
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier(“personDaoBean”) 存在多个实例配合使用
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载
@Async异步方法调用
// @Resource 是J2EE 的注解,不要说错了;默认按名称装配,当找不到与名称匹配的bean才会按类型装配。


5、AOP 的理解:

面向切面编程,ok ,怎么吹呢?参考我曾写的一篇 AOP基础的博客,
/
AOP 底层是基于 动态代理实现的,JDK 和 CGLib 两种方式,JDK 面向接口编程的,使用相对多一些;

6、 前端传递过来的参数 使用 valide 进行校验、

7、MAP 集合使用,

MAP 储存KV 健值对,主要用于关系映射【举栗子: 书本的每一页都对应的一篇文章,类似这种就是关系映射,越是简单越是难以表达】
Set 集合, 不重复,无序;
List 集合,底层数组;

8、 数据量大时候

mysql 主从,或者读写分离,加入 redis 数据库;
首先说 mysql 数据库 主从架构, 也就是主从复制原理;参考我的博文:
https://blog.csdn.net/weixin_42323802/article/details/85838007
binlog 复制主要有3 个线程完成;
redis 高并发 高性能,可以参考一下博文:
https://blog.csdn.net/weixin_42323802/article/details/85114249
https://blog.csdn.net/weixin_42323802/article/details/85621241

9、 string 、stringbuilder 和 stringBuffer

运行速度 :StringBuilder > StringBuffer > String
string 是字符常常量,stringBuilder 和stringBuffer 是字符串变量,对变量操作 不重新创建对象 ,所以操作速度较快、
另外 线程安全问题,strinBuffer 是线程安全的线程;

10、threadLocal 使用

11、mybatis 的 一级缓存和 二级缓存 有什么区别?

一级缓存: 是针对 同一个 sqlSession 来讲的,是默认开启的
二级缓存: 是Application级别的缓存, 2 级缓存默认是不开启的
并且实现 mybatis 的二级缓存时候,返回的POJO 需要实现序列化接口【实现Serializable接口】 ,在XML 配置文家中配置,如下:

<!--
        eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。
        (1) LRU,最近最少使用的,一处最长时间不用的对象
        (2) FIFO,先进先出,按对象进入缓存的顺序来移除他们
        (3) SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象
        (4) WEAK,弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。这里采用的是LRU,
                移除最长时间不用的对形象
       flushInterval:刷新间隔时间,单位为毫秒,这里配置的是100秒刷新,如果你不配置它,那么当
        SQL被执行的时候才会去刷新缓存。
        size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。
        这里配置的是1024个对象
        readOnly:只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有
        办法修改缓存,他的默认值是false,不允许我们修改
    -->
 <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024"/>

可以参考这篇博客:
https://blog.csdn.net/weixin_42323802/article/details/85052262

12、数据库 $和#

参考我这篇博文:
https://blog.csdn.net/weixin_42323802/article/details/82425111
#号 是预编译的方式,防止SQL 注入;

13、数据库索引的创建,默认索引的

2019.02.23    23:35 更新

14、数据库优化

mysql 数据库优化 从三个方面来考虑;
1、SQL语句的优化、
2、mysql 数据库引擎的优化
3、mysql 数据库 索引的优化、遵循索引使用,创建的原则;

15、异常处理的方式:
springmvc 全局异常处理、 使用过滤器 过滤,处理异常;
具体百度、


这个是 成大佬分享的面经,4家。这三家公司地址马赛克还是要打上的。感谢下成大佬的分享;

3

2019.03.05  更新

这个是 张同学 分享给我的面经,在这里感谢下张同学;

2

下面是03.05 我的面经;
先讲一下我的经历,本来03.04 以初级去入职平安众筹的,生活总爱和你开玩笑,当天外包公司告诉我:“抱歉,你今天无法入职了,可能是因为你资料发到我晚了…”
本人:“大嘴巴一张,哦,我知道了,麻烦下次提前告诉我下哦,拜”;
下午疯狂投简历,预约了 03.05 、03.06、03.07 三天的面试,上天总喜欢和我这样笨笨的人开玩笑,额 ,无奈面一周咯。

03.05 上午 坐标上海 阴天 【平安大厦某项目组】

自我介绍下:
自己讲了基本信息,项目,负责的模块
你这个项目是几个系统
说实话,我特么也不知道几个系统,单JVM的,自己被自己蠢哭了,springCloud 做的项目 告诉我是 单JVM 的;
购物车怎么实现的?后台商品数据更新购物车中商品失效(同步)怎么处理的?
1、这个问题,当时回答是不同步,用户提交订单时候对比数据库,这个方案并不是很好,严格上说一定是被pass的方案;
2、今天细细想了下 ,搜了下,总的来讲,在数据更新时候,使用消息中间件 监听商品的 ID ,这样用户在登陆时候 对ID数据进行消费, 消费者同步;
这样做的好处:
可以有效减少 用户在提交购物车 时候 进行查库 的这种方案的计算消耗;
同时也避免了 用户体验差 ,用户在登录时候 就同步了 CART了 ,或者设置定时任务,定时查看商品是否更新;
那你们购物车数据不做SST 么
恩恩,迷了,懵逼了
说到底还是没有好好复习、
商品页面静态化,你说说怎么实现的?
商品静态化 ,我简单讲了为什么考虑使用静态,静态化的作用,实现步骤, MQ 监听哪一个id ,NIGIX 反向代理至该静态资源 不经过web server 减少服务器的压力;
然后实现过程是、、、、、、
你做过秒杀?
说实话,当时怂了,说秒杀同事做的,其实自己做的秒杀虽然惨不忍睹吧,但是过程和方向是对的,哎、、、、
list 集合排序,hashmap hashtable 以及hashmap 底层原理
还有MYSQL 的时间函数使用、MYSQL分页查询

MYSQL 时间函数,DATA() 等等、这个没常用,使用了JPA这个真的很少写,看来我需要加强了,差一步没有过;这家是我自己的原因,是的;

03.05 下午 坐标上海 雨天 【平安大厦某项目组】
面试通过

redis
常用设计模式
自己使用的设计模式
单例模式怎么实现的
服务扩展怎么扩展的?
数据库优化你做了哪些?
lock锁实现原理
分库分表 如何知道数据在哪个表中,分表使用什么规则去分表?这个答的一塌糊涂
springMVC怎么实现的AOP
动态代理的接口代理是怎么样的?
springIOC 初始化的过程

这个并没有完美的回答出来
这里我会后续进行一个总结给到大家。
找了篇博客,挺不错的;
https://singleant.iteye.com/blog/1177358

熔断降级,当然并没有直接问如何去做,给出了一个场景
JDK新特性 为什么使用lambda表达式?集合处理的变化,并发流,并发流的原理

其实这一块并不好答,尤其是并发流这块、
整体的过程,main函数加载的时候创建好容器;
扫包,配置,注入,这个没答全

你怎么没写学校啊?
我写了啊
诺,你看
啊,哦,我是…
对了,你有没有什么想问的?

2019.03.06 更新

坐标:上海普陀 上午10:30 天气:小雨

本来今天是2家面试,还好下午有一家因为特殊原因取消了,太累了,我现在感觉真的需要休息下,但是无奈自己根本停不下来,感觉在透支,停不下来,因为自己太菜了,停下来怕自己废掉,明天还有一家在我未辞职时候就预约我去面试,至现在也有2周了吧,一家银行;
好了,先说下这家学到的知识;

一轮笔试:
二轮技术面:
三轮项目经理面:

这家并没有问什么特别,一楼大厅,二楼开发,三楼开发;

1、笔试基础 ,还有上机实操,实操题目就是使用springboot 快速搭建一个项目,rest风格接口请求返回一个 json 串;
这里不累述;
2、技术面:
先介绍下自己吧
老套路,比比比,完事
对redis 了解么,它只是用缓存?
没给他讲redis 主从, master 和slave 主备 原理,简单明了了谈了下redis 项目中用在哪里了,什么作用,作为最贴近银弹的redis 数据库,实测性能在多少,和官方数据有多少差异;
mybatis 从来不缺席
这里也懒得累述,mybatis 的基础使用,再深一些无非就是mybatis 运行原理,当然这个运行原理我目前是答不上了,可以参考这一篇博文:

然后日常寒暄
你住哪啊,怎么啊,以前公司怎么呀
3、项目经理面:
自我介绍
比比比
你讲一下java中对象的引用和复制到区别
这个,答得的不怎么好;
我是从堆栈来说,引用类型分很多种引用,每个引用作用;虚引用到GC
复制就是对象的clone
深克隆浅克隆我并没有答,只是说没有new 建新对象;
你感觉你强在哪?
这个问题,我并没有说我强在技术,自己多少水自己知道,说了自己在非技术上的优势;
你有什么要问的?
这个问题其实比技术更能刷掉更多的人,
通过这个问题的回答,基本八九能确定是否能拿到offer 、
很多反败为胜的案例不要太多,我回答中规中矩
和面试官聊了些许,大概能判断出他想招一个PM
我并没有明确表示我想要去做PM
其他有需要问的?
没有了,给出自己想了解的地方给面试官ok 了
周五等消息
OMG 心里想,凉凉送给自己,问题出在哪里我大概是了解了;
每一次面试都是对自己的一次检验;

2019.03.07 号      周四    晴天     微风

上午9:30 坐标唐镇 兴业银行

这家已经预约很久了,今天过去面一面,先说下结果,很可惜,博主水平很渣,没有被面试官满意,被虐的很惨,大家有看过周星驰拿火柴棒打火云邪神吧,对的,我就是拿火柴棒给面试官当头一棒;

面试流程
1、笔试
2、面试

自我介绍下吧
比比比
springcloud 做的项目
消息中间件简单说下
rabbitmq和kafka
集群使用的什么模式?有几种模式?
这个集群几种模式嘞,当时真不知道什么模式
1 )普通模式:默认的集群模式。
2)镜像模式:把需要的队列做成镜像队列,存在于多个节点,属于RabbitMQ的HA方案
这个大家度娘下、、、、
生产环境几个节点?生产时候出现什么故障?
丫的,真没有出现什么故障
想了一个消息丢失场景给说了下、
redis 缓存击穿是什么?雪崩是什么?怎么解决
参考如下:
https://blog.csdn.net/weixin_42323802/article/details/85621241
redis 节点有几个,数据类型有哪些?
nginx 服务器用过?解释下什么是正向代理什么是反向代理
正向代理:
正向代理就是翻墙、
反向代理:
反向代理就是用户不知道 自己访问的是一个代理,就好比老王喝蒙了,并不知道自己进的是隔壁家门;
浏览器版本问题有遇到过么?浏览器版本哪一个?
ES6,我勒个擦,这个、、、、
hashmap 数据存储是怎么存储的?
hashcode 怎么计算的?
内心已经崩溃
LIST集合怎么用的?
多线程用过?什么场景?ThreadLocal会出现内存溢出么?
我答了个会出现、标准答案来自度娘:
1、ThreadLocal在没有线程池使用的情况下,不会存在内存泄露;
2、但是如果使用了线程池的话,就依赖于线程池的实现,如果线程池不销毁线程就会有内存泄漏,需要手动调下 ThreadLocal.remove() 手动释放防止内存泄漏、
并发包还是用过什么?
concurrentHashMap 这个使用过,逗死我了,我是菜神附身了,天啊、、、我说了个这、、、、
那你 ReentrantLock 使用过?其实现原理
还真没看过这个源码、、、
大家可以百度下
Mybatis 中 union和union all的区别
当时没答上来,SQL都写不6 ,还要什么拖拉机、、、、
这里补充上:
union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复

下午01:30 坐标徐汇 某国企

面试流程:
1、笔试
2、技术面
3、总监面
4、人事

这家面试被虐得不轻,从前到后,整个javaEE 到 web ,springCloud 到springboot ,从集群到中间件,从项目业务 到 为什么跳槽,问了1个半小时,面试官也写了一大张A4,我本人也几近崩溃,到最后SSM 都懒的解释 mybatis 工作流,spring 设计模式,以及线程并发,怎么理解并发;

技术面 (严肃的表情): 您做一个自我介绍吧
您,我心吓一跳、、、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值