说明:实习岗,杭州中大型互联网公司
时间:2021年3月
面试题多为Spring、SpringMVC、SpringBoot相关知识,Java基础问的较少!
1、基础知识
java编程语言有啥优点?JVM、JRE和JDK的关系
https://thinkwon.blog.csdn.net/article/details/104390612
用过哪些Object类的方法?比如== 和 equals 的区别是什么?如何理解hashCode 与 equals?
protected Object clone()//创建并返回此对象的一个副本。
boolean equals(Object obj)//指示其他某个对象是否与此对象“相等”。
String toString()//返回该对象的字符串表示。
int hashCode()//返回该对象的哈希码值。
void wait()//在其他线程调用此对象的 notify() 方法或 notifyAll() //方法前,导致当前线程等待。
void notify()//唤醒在此对象监视器上等待的单个线程。
void notifyAll()//唤醒在此对象监视器上等待的所有线程。
Class<> getClass()//返回此 Object 的运行时类。
Java有那些基本数据类型?基本数据类型存储在jvm的什么区域?String是不是基本数据类型,他们有何区别?
https://blog.csdn.net/welcome_zhang/article/details/84809443
写一个方法,实现字符串的反转?能想到有几种方法?
https://blog.csdn.net/EuniBoom/article/details/80136800
java常用数据结构有哪些?各有什么特点?(list、map、set)
https://blog.csdn.net/qq_29631809/article/details/72599708
hashmap的实现原理、hash冲突如何解决HashMap和Hashtable的区别
https://blog.csdn.net/jjc120074203/article/details/78579931
Hashmap和CurrentHashMap的区别
https://blog.csdn.net/yy1098029419/article/details/79672753
Overload(重载)和Override(重写)的区别
https://blog.csdn.net/qunqunstyle99/article/details/81007712
abstract class和interface有什么区别
https://blog.csdn.net/csdn_aiyang/article/details/71171886
java 中 IO 流分为几种?
java常用设计模式你知道几种?
https://blog.csdn.net/yubujian_l/article/details/81455524
java8中的新特性了解么?
https://blog.csdn.net/yczz/article/details/50896975
jvm内存结构?
https://blog.csdn.net/welcome_zhang/article/details/88138040
线程的创建方法有哪些?
https://blog.csdn.net/scgaliguodong123_/article/details/46013283
线程的生命周期
https://blog.csdn.net/qq_41405257/article/details/80587478
--------------------------------------------------------------------------------------------------
2、MySql
2.1 mysql使用left join时,右表数据有重复数据的处理
当使用mySQL中的LEFT JOIN时,在右表中存在多条记录,即一对多的情况时,给如何处理?
https://blog.csdn.net/weixin_33894640/article/details/92413068
案例
---------------------------------------------------------------------------------------------------
3、框架知识
2.1 Spring
Spring的ioc、di是什么意思
https://blog.csdn.net/llussize/article/details/79400234
Spring的AOP实现原理
Spring 将bean注入容器4种方式
- 包扫描+组件标注注解(比如:@controller、@service注解等)
- @Bean 导入第三方包里面的组件
- @import 快速给容器注入一个组件
- 使用Spring提供的工厂Bean
2.2、 SpringMVC
SpringMVC的整个处理机制
https://blog.csdn.net/Andy_ayu/article/details/79528208
Java过滤器与SpringMVC拦截器之间的关系与区别链接
2.3、 SpringBoot
SpringBoot自动配置核心注解@SpringBootApplication组成
@SpringBootApplication该注解是SpringBoot项目的核心注解,该注解包含:
- @SpringBootConfiguration :注解就有了自动配置功能 、扫描包功能。
- @EnableAutoConfiguration : 让SpringBoot根据类路径中的jar包依赖为当前项目进行自动配置。例如,添加spring-boot-starter-web依赖,会自动添加tomcat和SpringMVC的依赖,SpringBoot 会对Tomcat和SpringMVC进行自动配置
- @ComponentScan :会自动扫描@SpringBootApplication所在类的同级包以及子包的Bean。
SpringBoot自动配置原理
我觉得我们可以从以下几个方面回答:
- 什么是 SpringBoot 自动装配?
- SpringBoot 是如何实现自动装配的?如何实现按需加载?
- 如何实现一个 Starter?(一般不用说)
答:(1)SpringBoot 自动装配就是通过少量注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能。
(2)@EnableAutoConfiguration是实现自动装配的核心注解。
自动装配的过程如下:
-@SpringBootApplication是复合注解,包含@EnableAutoConfiguration
- @EnableAutoConfiguration会导入AutoConfigurationImportSelector这个类,这个类会利用SpringFactoriesLoader组件加载jar包里面META-INF/spring.factories配置文件里面填写的配置类,将这些配置类过滤一波后,返回全类名。
- 通过@Conditional按需加载所需要的配置类
大概逻辑如图所示:
(3)如何实现一个 Starter
光说不练假把式,现在就来撸一个 starter,实现自定义线程池
第一步,创建threadpool-spring-boot-starter工程
第二步,引入 Spring Boot 相关依赖
第三步,创建ThreadPoolAutoConfiguration
第四步,在threadpool-spring-boot-starter工程的 resources 包下创建META-INF/spring.factories文件
最后新建工程引入threadpool-spring-boot-starter
2.4、 mybatis
为什么用mybatis而不是jdbc?或者问两者区别
-
从层次上看,JDBC是较底层的持久层操作方式,而MyBatis都是在JDBC的基础上进行了封装,使其更加方便程序员对持久层的操作。
-
从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据。 MyBatis是将sql语句中的输入参数和输出参数映射为java对象,放弃了对数据表的完整性控制,但是获得了更灵活和响应性能更快的优势。
-
从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式; 如果要灵活使用sql语句的话建议采用MyBatis框架。
mybatis是如何做到防止sql注入的
mybatis的缓存
答:MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有。二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置。