四、设计模式相关问题(必问):
- 单例模式,注意线程安全
- 工厂模式
- 适配器模式,在于兼容,允许因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中
- 装饰器模式,在于增强,原有的不能满足现有的需求,对原有的进行增强
- 代理模式,在于隔离,同一个类而去调用另一个类的方法,不对这个方法进行直接操作
- 观察者模式
设计原则:
- 单一职责原则:一个接口一个功能
- 里氏替换原则:父类出现的地方子类就可以出现
- 依赖倒置原则:面向接口编程
- 接口隔离原则:接口中的方法尽量少(功能聚合),和单一职责原理有点互斥,需要平衡
- 迪米特法则:低耦合
- 开闭原则:扩展开放,修改关闭
五、数据库相关问题,针对Mysql(必问):
- 有没有SQL优化经验。
避免查询全表,避免返回无用字段 - 事务的特性和隔离级别
原子性、一致性、隔离性、持久性
1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle、sql server、postgresql 默认的
3)repeatable read:重读读取:可以解决脏读 和 不可重复读 —mysql默认的
4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读—相当于锁表 - mysql分页优化
用主键排序后,再分页
同步保存一张联合索引表 - 悲观锁、乐观锁
悲观:操作前都得加锁
乐观:操作时去检查,大多是基于数据版本(一个对比字段) - SQL关键字的执行顺序
from、on、join、where、group by、having、select、distinct、union、order by - 什么时候该(不该)建索引。
where查询多的字段该
用于两表连接的字段该
更新频繁的字段不该
image,text等复杂字段不该 - Mysql索引的数据结构
B+Tree,只有叶子节点存放数据(数据索引),其他结点中有多个有序key,因叶子结点是顺序排列,再因操作系统磁盘会进行预读,所以磁盘查询效率最好。 - mysql的索引分类:B+,hash;什么情况用什么索引
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长 - Explain包含哪些列
id:select识别符,值越大越先执行
select_type:select 类型,SIMPLE、SUBQUERY、DERIVED、UNION
table:对应行正在访问的表
type:表示表的连接类型,更准确的说法是访问类型——换言之就是mysql决定如何查找表中的行,ALL, index, range, ref, eq_ref, const, system, NULL,从左到右,性能从最差到最好
possible_keys: 表示查询时,可以使用的索引列
key: mysql决定采用的索引来优化对该表的访问
key_len: 列显示了在索引字段中可能的最大长度,而不是表中数据使用的实际字节数
ref:显示了之前的表在key列记录的索引中查找值所用的列或常量
rows:表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
Extra:包含不适合在其他列中显示但十分重要的额外信息 - Explain的Type列有哪几种值
- ALL:这就是所谓的全表扫描
- index:这个跟全表扫描一样,只是mysql扫描表时按索引次序而不是行
- range:范围扫描就是一个有限制的索引扫描
- ref:这是一种索引访问(有时也叫做索引查找),它返回所有匹配某个单个值的行,然而,它可能会找到多个符合条件的行
- eq_ref:使用这种索引查找,mysql知道最多只返回一条符合条件的记录
- const,system:当mysql能对查询的某部分进行优化并将其转换成一个常量时,他就会使用这些访问类型
- null:这种访问方式意味着mysql能在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或者索引
当表中仅有一行是type的值为system是最佳的连接类型;
当select操作中使用索引进行表连接时type的值为ref;
当select的表连接没有使用索引时,经常会看到type的值为ALL,表示对该表进行了全表扫描,这时需要考虑通过创建索引来提高表连接的效率。
六、Spring
- 怎么理解IOC?其初始化过程?要你实现Spring IOC你会注意哪些问题?
IoC 不是一种技术,只是一种思想,对象的创建和管理交给第三方,由第三方注入需要依赖的对象,使依赖解耦。
xml文件的解析,bean保存,java反射的运用,工厂模式的运用 - 怎么理解AOP?请问怎么实现的?各种术语,之间怎么互相工作的?
在核心业务代码前后,需要处理一些附加的内容,最好是把这些内容抽离出来,则会用到AOP
实现方式:动态代理,Cglib
横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
连接点(joinpoint):被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
切入点(pointcut):对连接点进行拦截的定义
通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
目标对象:代理的目标对象
织入(weave):将切面应用到目标对象并导致代理对象创建的过程
引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段 - Spring注入bean的方式
属性注入、构造函数注入、工厂方式注入、注解 - Spring Bean 的生命周期
1)Bean自身的方法:这个包括了Bean本身调用的方法和通过配置文件中的init-method和destroy-method指定的方法
2)Bean级生命周期接口方法:这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法
3)容器级生命周期接口方法:这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器” - Spring Bean如何被管理的?
Map<String,Object>,非单例模式不管理,每次都直接创建 - Spring Bean 的加载过程是怎样的
Bean的建立–>Setter注入—>BeanNameAware的setBeanName()—>BeanFactoryAware的setBeanFactory()—>ApplicationContextAware的setApplicationContext()—>BeanPostProcessors的processBeforeInitialization()—>InitializingBean的afterPropertiesSet()—>Bean定义的init-method–>BeanPostProcessors的processAfterInitialization()—>DisposableBean的destroy()—>Bean定义的destroy-method - BeanFactory 和 ApplicationContext?
BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。
ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能,如国际化、资源访问、事件传递
BeanFactory为懒加载,ApplicationContext启动时全部初始化 - BeanFactory 和 FactoryBean?
BeanFactory是个Factory,也就是IOC容器或对象工厂,生产Bean
FactoryBean是个泛型接口,能够获取到生产对象的工厂实例 - Spring 是如何管理事务的,事务管理机制?
aop实现,xml和注解方式,事务有传播性、超时、隔离级别、回滚 - Spring 的不同事务传播行为有哪些,干什么用的?
播行为类型 说明 PAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择 PAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行 PAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常 PAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起 PAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 PAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常 PAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作 - Spring事务隔离级别和传播性
别 含义 LATION_DEFAULT 使用后端数据库默认的隔离级别 LATION_READ_UNCOMMITTED 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读 LATION_READ_COMMITTED 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生 LATION_REPEATABLE_READ 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生 LATION_SERIALIZABLE 最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的 - Spring 中用到了那些设计模式?
工厂模式、单例模式、代理模式(AOP)、观察者模式(Listener)、模版方法、策略模式 - Spring MVC 的工作原理?
1)用户发送请求至前端控制器DispatcherServlet。
2)DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3)处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4)DispatcherServlet调用HandlerAdapter处理器适配器。
5)HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6)Controller执行完成返回ModelAndView。
7)HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8)DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9) ViewReslover解析后返回具体View。
10)DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11) DispatcherServlet响应用户。 - Spring 循环注入的原理?
构造器注入和prototype类型的field注入发生循环依赖时都无法初始化,因为几个对象都同时处于一个正在创建的状态
通过setter注入没有问题,但非单例模式会有问题,因为没有提前暴露实例 - Spring 如何保证 Controller 并发的安全?
Controller类本身为单例,可修改为多例,但要注意多线程编码 - Spring是单例还是多例,怎么修改。
可设置,在配置文件的bean中添加scope="prototype"为多例
七、Mybatis
- Hibernate和Mybatis的区别
H比较庞大和完善,M比较容易上手
H对于SQL已经做了比较完善的封装,开发者只需关心对象的状态
H缓存分为一二级,M缓存需自己去配置到具体的方法,出错隐患大
M可以进行更为细致的SQL优化,可以减少查询字段,H为全字段查询
H可方便迁移不同数据库 - 介绍下Mybatis/Hibernate的缓存机制。
一级缓存session中的缓存在session连接关闭并被连接池回收时清理,或者手动清理
Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是哪种缓存。MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。 - Mybatis的mapper文件中#和KaTeX parse error: Expected 'EOF', got '#' at position 7: 的区别。 #̲方式能够很大程度防止sql注入…方式无法防止Sql注入。
$方式一般用于传入数据库对象,例如传入表名、字段名 - Mybatis的mapper文件中resultType和resultMap的区别
resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
resultMap维持一个属性名称对应关系,来进行映射 - Mybatis中DAO层接口没有写实现类,Mapper中的方法和DAO接口方法是怎么绑定到一起的,其内部是怎么实现的
动态代理,getMapper方法把本次调用的class参数传入,底层根据class信息,找到对应xml里命名空间一直的类和方法
八、Netty
- IO、BIO、NIO和AIO
阻塞IO、非阻塞、异步非阻塞 - Netty 的各大组件
- Netty的线程模型
- TCP 粘包/拆包的原因及解决方法
- 了解哪几种序列化协议?包括使用场景和如何去选择
- Netty的零拷贝实现
- Netty的高性能表现在哪些方面
九、分布式相关
- Dubbo的底层实现原理和机制
rpc框架,soa框架
典型的provider和cusomer模式
zookeeper为注册中心 - 描述一个服务从发布到被消费的详细过程
spring生成bean,经过xml的配置解析把类生成url和参数列表注册到注册中心,并转换为Invoker对象,再经过代理转为Exporter对象。
根据xml配置找到相应的代理类,并得到调用类,进行调用 - 分布式系统怎么做服务治理
- 接口的幂等性的概念
多次调用的返回结果相同
分布式锁(zookeeper)、乐观锁、数据库锁 - 消息中间件如何解决消息丢失问题
放入时丢失,事务回滚,或配置confirm确认已接受
中间件丢失,持久化
消费者丢失,手动消费完毕后再调用offset - Dubbo的服务请求失败怎么处理
超时和重连机制 - 重连机制会不会造成错误
超时立马重试可能会存在重复业务问题
某业务点异常导致的重连,调用方再继续调用,会继续重试,会造成服务器雪崩 - 对分布式事务的理解
两阶段提交协议 2PC:某结点问其他结点是否可操作,记录操作日志,主结点发从正式提交,从结点完成后回调,住结点完成事物
全局事务(DTP模型)、基于可靠消息服务的分布式事务、最大努力通知(定期校对)、TCC(两阶段型、补偿型) - 如何实现负载均衡,有哪些算法可以实现?
- Zookeeper的用途,选举的原理是什么?
数据的垂直拆分水平拆分。
zookeeper原理和适用场景
zookeeper watch机制
redis/zk节点宕机如何处理
分布式集群下如何做到唯一序列号
如何做一个分布式锁
用过哪些MQ,怎么用的,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗
MQ系统的数据如何保证不丢失
列举出你能想到的数据库分库分表策略;分库分表后,如何解决全表查询的问题
zookeeper的选举策略
全局ID
分布式锁的实现。
分布式session存储解决方案:http://www.cnblogs.com/scwanglijun/p/3763975.html
十、其他遇到问题:
-
介绍下栈和队列。
先进先出,先进后出 -
IO和NIO的区别。
阻塞和非阻塞 -
接口和抽象类的区别
抽象类可以有构造函数,但不能new -
int和Integer的自动拆箱/装箱相关问题
当i>=-128&&i<=127时,不会new新的Integer对象,直接引用常量池中的Integer对象,大于则new。赋值时调用ValueOf()方法。 -
常量池相关问题。
节省内存,快速比较 -
==和equals的区别
Integer小于128时是用value比较 -
重载和重写的区别
重写是继承时发生的,重载随时可以 -
String和StringBuilder、StringBuffer的区别。
线程安全,String为特殊类,存在常量池 -
静态变量、实例变量、局部变量线程安全吗,为什么。
局部变量线程安全 -
try、catch、finally都有return语句时执行哪个。
finally return语句都会执行 -
介绍下B树、二叉树、红黑树。
二叉树:每个结点都最多只有两个子结点的树
B树:下层节点内的关键字取值总是落在由上层节点关键字所划分的区间内
红黑树:平衡二叉树扩展,每个红色节点的两个子节点都是黑色,用于统计 -
ajax的4个字母分别是什么意思。
异步 JavaScript 和 XML -
xml全称是什么。
可扩展标记语言 -
常用的linux命令。
-
tcp三次握手和四次挥手
-
http状态码的含义
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
400 - 客户端请求的语法错误,服务器无法理解