面试题

编程

基础

JVM内存模型(堆、方法区、本地方法栈、JVM栈、程序计数器)

GC回收方式(计数器、可达性分析等)

类加载器(AppClassLoader、ExtClassLoader、BootstrapClassLoader)

OSI七层模型(物理层->数据链路层->网络层->传输层->会话层->表现层->应用层)

设计模式(单例模式、观察者模式、装饰者模式、工厂模式、代理模式)

HashMap实现原理(JDK1.8)

分布式调度任务流程(XX-JOB):任务注册->任务下发->监控->日志信息收集

算法题(斐波那契数列、杨辉三角形、字符串123变为数字123)

多线程

1.validate

实现原理:将缓存的最新值更新到内存中,同时通知其他处理器,从内存中重新取值,此时其他处理器的缓存值失效

应用场景:插入内存屏障,防止指令重排序

目的:实现共享变量的可见性

2.transient

目的:防止不必要的变量序列化

3.syncronized

实现原理:反编译源码中存在监控计数器,线程获取锁时->计数器+1,锁释放时->计数器-1.当其他线程得知计数器为0时,线程可以进入,否则,线程需要等待.

应用场景:锁(可重入)

备注:reetrantLock是jdk5引入的并发包,作用类似于syncronized,但是比syncronized粒度更细,同时可以获取锁的状态

4.实现多线程的方式(thread,runnable,callable,fork/join框架)

无返回值,推荐runnable,理由:因为java是单继承的,但是可以同时实现多个接口,同时thread内部实现也是runnable

有返回值,推荐callable

5.线程池的参数解析(单线程池、固定线程池、可缓存线程池、定时器线程池)

核心线程数、最大线程数、空闲线程存活时间、时间单位、队列、拒绝策略

Spring

1.AOP

实现原理:通过JDK动态代理实现,也可以通过CGLIB代码

应用场景:事务、日志

目的:方法的横向增强

2.IOC

实现原理:JAVA反射(代码运行期间,动态地获取类或者对象的方法和属性)

目的:实现代码的松耦合

控制反转+依赖注入:以前调用方法需要new对象,现在调用方法直接从spring容器中获取,由主动变被动

3.@resource和@autowired区别

@resource是JDK自带的,@autowired是spring自带的

@resource是先根据名称匹配,再根据类型匹配,若第一次没匹配到,则会匹配第二次.@autowired是根据类型匹配,效率更高一些

@autowired一般配合@qualifier使用,区别同一接口的不同实现类

4.springMVC请求流程

5.事务的四种隔离级别,七种传播机制

6.核心组件

core、context、bean、spel、aop、web等

7.事务种类

声明式事务(注解)->推荐

编程式事务(手写)

8.springboot优点

配置更简单

部署更简单

监控更简单

博客源码GITHUB地址

9.filter和interceptor区别

A.filter基于函数回调,interceptor基于java反射

B.filter依赖servlet容器,只初始化一次

C.执行顺序(生命周期):filter->interceptor->业务逻辑代码->interceptor->filter

MyBatis

1.分页方式

逻辑分页(推荐)->sql处理分页,例如page插件

物理分页->程序处理分页,例如将全表结果返回再做处理,效率低

2.延迟加载

实现原理:

A.使用CGLIB创建代理对象

B.通过拦截器处理参数回填

目的:查询不必要的对象属性,提升查询效率

3.执行器(三种)

A.执行完,关闭

B.执行完,放入缓存,继续用

C. 批量执行

4.自定义插件步骤

A.自定义执行器

B.创建SQL处理器

C.设置参数

D.返回结果集处理

消息中间件MQ(RabbitMQ)

1.流程

producer->routeKey->exchange->bingKey->queue->consumer

2.消息一致性

关闭ACK自动提交为手动提交,通过成功或者失败函数处理

3.避免消费重复方式

A.幂等性:以消息ID作为关键字,缓存redis或者中间表,以此作为过滤条件

B.DB设置属性为唯一约束,防止重复插入

Redis

1.常用数据类型以及应用场景

string,hash,list,set,zset

2.用途

存储热点数据,缓存数据用的,这里要区别mongodb(mongodb是文档型数据库,不是缓存)

3.常见问题

A.缓存穿透:查询对象一直为null,会每次都查询数据库,造成IO浪费

解决办法:将null对象缓存起来

B.缓存雪崩:同一时间点,大量缓存失效,造成DB压力

解决办法:将缓存值的过期时间hash散列开,尽可能使缓存过期时间不一致

C.keys方法为什么被禁用:因为redis是单线程的,所以大量缓存的时候,会消耗时间,导致大量缓存失效,从而造成缓存雪崩,redis2.8使用scan解决,有分页

4.持久化方式以及区别

A.RDB:存储redis所有数据的文件

B.AOF:存储redis所有指令的文件,类似于MySQL的binlog文件

MySQL

1.分库分表如何做

A.主表id取余数,分成N段

B.批量插入小表(N代表段),伪代码如下:

INSERT INTO TABLEN SELECT * FROM TABLE WHERE ID%N=ID

备注:表应该单一,链接操作最好不要超过3个(阿里巴巴手册),这样有利于表水平扩展

2.不停机地给表增加一个字段如何实现

A.创建一个新加字段的临时表

B.将数据分批导入临时表,采取问题1的方式

C.表重新命名,伪代码如下:

RENAME TABLE A TO B

3.MyIsAM和InnoDB区别

A.InnoDB支持事务

B.InnoDB支持行锁,锁粒度更细,而MyIsAM只支持表锁

4.锁

主观上:乐观锁、悲观锁

粒度上:表锁、行锁、页锁(基于表、行锁之间)

再细分:共享锁、独占锁、排他锁,其实就是读操作共享,写操作锁住表

锁实现方式:MVCC

时间匆忙,若以上有问题,请留言,轻点喷!

以上是 面试题 的全部内容, 来源链接: utcz.com/z/512540.html

回到顶部