一、JAVA基础
1、什么是面向对象?
封装、继承、多态
2、对异常有什么看法?一般会如何做处理?(finally会用来做什么,关闭流的时候会放在哪个地方?)
- 异常是程序在编译或者运行的时候出现问题的显相;
- Throwable是所有Error(非程序问题,首要解决目标以及性能调优)和Exception(程序问题,且可处理可调式)的父类;
- 手动处理异常,可提升程序的健壮性;
3、JAVA中堆和栈的区别,说下java的内存机制。(引用类型能打印出来么?当打印一个String申明的变量时,打印出来的是什么?)
- 堆用于存放基本数据类型和对象的引用(引用类型的内存地址名)
- 栈专门用来存放引用数据类型的实际值,受JVM管理,开辟空间存放资源;
4、线程池的作用(简述单例模式的懒汉式跟饿汉式的优缺点)
- 提高线程的可管理性;
- 降低资源消耗;
- 提高响应速度;
5、垃圾回收机制的基本原理(不要讲太深,讲多了就是装13,容易被针对)
- 垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收;
- 当创建对象时,GC就开始监视这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理heap(堆)中的素有对象。通过这种方式确定哪些对象是“可达的”,哪些是“不可以达的”;
6、垃圾回收机制的优缺点
7、lambada表达式的优缺点(JDK1.8)
- 优点:语法改进、语法简洁;
- 缺点:入门理解困难,不利于JAVA初学者理解;
8、HashMap是不是有序的
9、ArrayList和LinkedList的异同点
- 相同点:
- 有序;
- 可重复;
- 都不是线程安全的;
- 不同点:
10、new ArrayList和Arrays.asList的区别
11、参数传递时,是按值传递还是引用传递;【这块我尚且存在争议,暂不写答案】
- 待确定???
12、HashMap是如何解决hash冲突的(JDK1.8)
二、中间件
1、消息队列有什么好处(用过哪些中间件,有没有遇到什么坑,举个例子)
- 提升系统响应速度;
- 生产和消费方解耦,让系统更健壮、稳定。
2、MQ消息丢失怎么办?
- 消息队列弄丢数据:持久化,非持久化的消息要及时处理,不要堆积(值得一提的是,持久化的情况下,最好要异步处理,且开启事务,不然会比较慢,数据量大的情况下容易导致连锁反应);
- 生产者弄丢数据:主流的MQ都有确认机制或者事务机制,可以保证生产者将消息送达到MQ。 比如RabbitMQ就有事务模式和confirm模式;
- 消费者弄丢数据:消费者丢数据一般是因为采用了自动确认消息模式。MQ收到确认消息后会删除消息,如果这时消费者异常了,那消息就没了。改用手动确认就能解决这个问题了;
3、MQ怎么达到顺序消费?
- 生产者保证顺序入队列,且入同一队列;
- 消费者保证消费的是一个队列,且避免多个消费者消费该队列的情况;
4、Redis用于缓存的好处,以及除了缓存外还有哪些应用场景
- 分布式锁;
- session共享;
- 消息队列;
5、Redis中,分布式锁的原理是什么
- 分布式锁是为了解决分布式/集群服务应用场景下,明明不能被创建的对象,反而被不停创建——>消耗 的问题的(有点拗口,细细体会!);
- 简单来说,分布式锁能保证同一时间只能有一个客户端对共享资源进行操作;
- 分布式锁需要满足以下几点:
- Redis提供的方法有:设置锁标志位、设置客户端唯一标识、提供锁过期时间;
- 看大神怎么玩转Redis 分布式锁的入口:https://blog.csdn.net/qq_37781649/article/details/108814474
6、如何解决Redis穿透(大致理解意思和明白解决方案便可,细究的话,需要结合实际应用来做具体分析)
7、如何解决Redis雪崩
三、主流框架技术
1、简述对spring的理解(最核心的是AOP和IOC,如果感觉面试时间较短,则可以发散讲讲 MVC 的理念)
2、简述Spring Bean生命周期
3、依赖注入的方式
- 构造方法注入;
- setter注入;
- 基于注解的注入(官方推荐);
4、@RestController和@Controller的区别
- @RestController注解,相当于@Controller+@ResponseBody两个注解的结合
- 但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
5、Spring Bean的作用域
- singleton:Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象(常用);
- prototype:每次通过spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态(常用);
- request:在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效;
- session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效;
- global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效;
6、Mybatis-plus 和 Mybatis 的区别(注意要结合项目阐述,不仅仅是以下几点区别)
- Mybatis-plus 是在 Mybatis 的基础之上做了更多的扩展;
- Plus能使用乐观锁;
- Plus具有代码生成器的功能;
- Plus可以进行 sql 执行性能分析(不建议生产环境使用);
- Plus可以进行 sql 执行分析拦截器(不建议生产环境使用);
7、resultType和resultMap的区别
- 总体而言,resultMap更强大,因为相比resultType而言,它能自由组合结果集;
- resultType是针对某一单个 VO 类进行一一映射;
- resultMap可以针对返回的结果集进行自由组合映射,不用再新建 VO 类,或者 PO类;
8、占位符#和$的区别
9、反射会花费更多的性能开销,但是Spring为什么用的那么爽
10、Spring框架中运用了哪些设计模式(很多,以下挑几个典型的模式举例论证)
- 工厂模式:创建Bean对象,IOC就是工厂模式下建造出来的一个一个解耦的流水线;
- 单例模式:Spring Bean默认的作用域就是单例的;
- 代理模式:AOP的实现,就是代理模式,另外,经常使用的切面日志也是代理模式的体现;
- 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用;
- 装饰者模式:但凡你看见的每个空的实体父类,基本都是装饰者模式,不仅仅局限于Spring;
11、dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
- 可以通信的,启动dubbo时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用;注 册中心对等集群,任意一台宕机后,将会切换到另一台;注册中心全部宕机 后,服务的提供者和消费者仍能通过本地缓存通讯。服务提供者无状态, 任一台宕机后,不影响使用;服务提供者全部宕机,服务消费者会无法使用,并无限次重连等待服务者恢复;挂掉是不要紧的,但前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的;
12、dubbo在安全机制方面是如何解决的
13、SpringBoot 核心组件
- 【常用】Spring boot Starter(核心启动器、集成了很多常见依赖包)
- 【常用】Spring boot Autoconfigure(配置Bean到spring容器中的代码实现包,这是Spring初期便有的一贯风格)
- Spring boot Cli(不常用,是一个客户端工具,结合了groovy脚本使用,有兴趣的可以了解下)
- Spring boot actuator(不常用,监控插件,有兴趣的可以了解下)
####四、数据库
五、其他
1、系统如何优化(有没有处理过系统性的问题,比如因线程问题导致的服务器宕机,或者因为没有借助缓存工具导致DB负荷较重而并发不够】
2、怎么解决高并发问题?(此问题不好回答,因为每个公司或者项目要求不一样,但主要从这几个方面来进行阐述)
3、负载平衡的意义什么?
- 提升可用性(核心就是这一条,多说无益,但可以结合自身实战经验发散阐述);
4、tomcat调优(此处主要说几个参数便可,因为tomcat调优是和硬件相关的,有实战经验的可结合曾经的案例来发散回答)
- maxThreads:可创建的最大的线程数
- acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理;
- connnectionTimeout:网络连接超时时长,单位:毫秒。设置为0表示永不 超时,这样设置有隐患的。通常可设置为30000毫秒;
- minSpareThreadsTomcat:初始化时创建的线程数;
- maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再 需要的socket线程;
- minProcessors:最小空闲连接线程数,用于提高系统处理性能,默认值为10;
- maxProcessors:最大连接线程数,即:并发处理的最大请求数,默认值为75;
- acceptCount :允许的最大连接数,应大于等于maxProcessors,默认值为100;
- enableLookups 是否反查域名,取值为:true或false。为了提高处理能力,应设置为false;
- 增加tomcat内存(主要解决 OutOfMemoryError 问题);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。