面试题一:
- redis能存储那些数据类型
- 字符串(string)—————————————->String
- 哈希(hash)———————————————->HashMap
- 列表(list)—————————————————>LinkedList
- 集合(set)—————————————————>HashSet
- 有序集合(sorted set)—————————>TreeSet
- 怎么保证redis 与数据库的一致性
- 先更新数据库,再更新缓存
- 先删除缓存,再更新数据库
- 先更新数据库,再删除缓存
- SpringMVC的执行流程
- SpringMVC对于参数的解析是怎么 对对象是怎么封装的 User
对象:@RequestBody 封装对象、@PathVariable 、@RequestParam 后面加参数
- Springmvc 的全局异常怎么处理
- HandlerExceptionResolver接口
- Spring的你看过他的源码 ?
- AOP 与 Ioc/Di
- Spring的作用域 5种 如果我想用多例怎么办
[ ] bean 的生命周期
[ ] Spring的aop用到那些场景
日志,事务,权限,异常
- Spring的事务 事务( 隔离级别 传播行为)
两种方法:
a:编程式事务
b:声明式事务 @Transactional
- islotionLevel 隔离级别
- 读未提交 read_uncommitted
- 读已提交 read_committed
- 可重复读 repeatable_read
- 串行化 serializable
| 传播行为 |
含义 | | —- | —- | | PROPAGATION_REQUIRED | (默认)表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务 | | PROPAGATION_SUPPORTS | 表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法会在这个事务中运行 | | PROPAGATION_MANDATORY | 表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常 | | PROPAGATION_REQUIRES_NEW | 表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager | | PROPAGATION_NOT_SUPPORTED | 表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager | | PROPAGATION_NEVER | 表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常 | | PROPAGATION_NESTED | 表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。注意各厂商对这种传播行为的支持是有所差异的。可以参考资源管理器的文档来确认它们是否支持嵌套事务 |
- Springcloud用到那些组件
Springcloudablibaba(Nacos、Openfein、Sentinel、RocketMQ、Seata、Ribbon)
- 分布式锁怎么锁
- OpenFien的实现原理
http
- Spring的底层是怎么实现的
aop/ioc/Di
- 动态代理 哪有几种
2种:jdk静态代理与cglib动态
动态代理,cglib和proxy区别在于是接口还是继承,有接口用jdk方式,没接口用cglib继承。
- git
Commit、pull
- 在liunx上运行Java项目的方式
Java -jar 文件名 &
https://blog.csdn.net/weixin_43919497/article/details/116456624
- Vue的路由有几种模式 2种模式
https://www.cnblogs.com/goloving/p/9147551.html
- rabbitmq有哪几种模式
简单模式、主题模式、发布订阅模式、路由模式、工作模式
面试二:
mysql 的优化
mysql 中什么时候索引失效
mysql 的事务
mysql的存入json数据
mysql 的索引
@controller与@restcontroller的区别
@spring常用的注解
Java的元注解有哪些
restcontroller里面有什么
redis 的数据结构
spring 中全局异常怎么处理的
项目中怎么用权限,权限怎么用的。(认证+授权)
面试三:
你讲讲集合
java集合就像一个容器,这些对象可以是任意的数据类型,且长度可变。集合按照其存储结构可以分为两大类,即单列集合Collection,和双列集合Map。 这两种集合特点如下: (1)Collection:单列集合接口,用于存储一系列元素。 Collection集合有两个重要的子接口,分别是List和Set。其中List集合的特点是元素有序,可重复;Set集合的特点是元素无序并且不可重复。List接口的主要实现类有ArrayList和ListedList;Set接口的主要实现类有HashSet和TreeSet。 (2)Map:双列集合的根接口,用于存储具有键(Key),值(Value)映射关系的元素。 Map集合中每个元素都包含一对键值,并且Key是唯一的,在使用Map集合时可以通过指的Key找到对应的Value。Map接口的主要实现类有HashMap和TreeMap。
list
LinkedList底层是双向链表 ==删除和增加效率比较高
Arraylist底层是数组+链表 ==因为有下标,查询效率比较快
set
- hashset:无序存储
- TreeSet:发现使用的是map集合
hashmap
- 首先,HashMap是一种数据结构,可以快速的帮我们存取数据。它的底层数据结构在1.7和1.8有了一些变化,1.7版本及以前他是数组+链表的形式,1.8及以后数组+链表+红黑树,如果链表长度大于等于8就会转化为红黑树,如果长度降至6红黑树会转化为链表。红黑树的出现解决了因为链表过长导致查询速度变慢的问题,因为链表的查询时间复杂度是O(n),而红黑树的查询时间复杂度是O(logn)。
接口和抽象类的区别
- 区别1:两者表达的概念不一样
- 区别2:抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
- 区别3:继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
- 区别4:在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
抽象类可以被实例化嘛
- 抽象类可以有自己的构造方法,但是不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。这其实用到了多态,向上转型。父类引用指向子类对象
什么样的类不能被继承
- 如果类被final修饰,那么不你能被继承
- 如果类中只有private的构造方法,那么此类不可以被继承。
重写与重载的区别
- 方法的重载:方法名一样,但参数类型和个数不一样
- -可以有不同的返回类型,只要参数列表不同就可以
- 可以有不同的访问修饰符
- -可以抛出不同的异常
- 方法的重写:参数列表必须完全与被重写的方法相同,否则不是重写而是重载
- 访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
- 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
重载可以返回类型重载嘛
- 方法重载跟返回值类型和修饰符无关,Java的重载是发生在本类中的,重载的条件是在本类中有多个方法名相同,但参数列表不同(可能是,参数个数不同,参数类型不同),跟返回值无关
说spring 相关的注解
- @SpringBootApplication启动boot的注解
- @Component:泛指各种组件
- @Controller、@Service、@Repository都可以称为@Component。
- @Controller:控制层
- @Service:业务层
- @Repository:数据访问层
- @Bean导入第三方包里面的注解
- @Import(要导入到容器中的组件);
- @Autowired、@Inject是默认按照类型匹配的,@Resource是按照名称匹配的,@Autowired如果需要按照名称匹配需要和@Qualifier一起使用,@Inject和@Name一起使用。
- @Configuration
- @ComponentScan用于对Component进行扫描;
- Spring支持AspectJ的注解式切面编程。
- @Aspect 声明一个切面
@After 在方法执行之后执行(方法上)
@Before 在方法执行之前执行(方法上)
@Around 在方法执行之前与之后执行(方法上)
@PointCut 声明切点
@Mapper注解与@Service与@Controller的区别
- @Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
- @Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
- @Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中。
事务的作用是什么
- 要么成功,要么失败
@Transaction作用是什么
- @Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
什么是事务
- 事务是指一组SQL语句的集合,集合中有多条SQL语句,可以是insert、update、select、delete,希望这些SQL语句执行是一致的,作为一个整体执行。要么都成功,要么都失败。
- 事务的特点:acid
原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
实现多线程有几种方式
- 用线程池来实现多线程
- 实现Thread
- 继承runable
- 继承
面试四:
线程
ThreadPoolExecutor
Executors
ThreadLocal
集合
集合框架体系
Collection
list:有序的、可重复的、有索引
set:无序的、不重复的
arraylist:查询快、增删慢
linkedlist:增删快,查询慢
hashset:存取效率高、底层是hashmap实现
treeset:可排序、底层是TreeMap实现
linkedhashset:有序的哈希set
map:存键值对
hashmap:无序、查询存取效率高
Treemap:根据key排序
linkedhashmap:保持顺序
哈希表
1.list与set与map三者的区别?
- list :存储的元素是有序的,可重复的
- set:存储的元素是无序的、不可重复
- map(用key来搜索的专家):使⽤键值对(kye-value)存储,类似于数学上的函数
y=f(x),“x”代表 key,”y”代表 value,Key 是⽆序的、不可重复的,value 是⽆序的、可重复
的,每个键最多映射到⼀个值。
2.Arraylist与linkedlist 的区别?
- 是否保证线程安全
- 底层数据结构
- 插⼊和删除是否受元素位置的影响: ① ArrayList 采⽤数组存储,所以插⼊和删除元素的
时间复杂度受元素位置的影响。
- 是否⽀持快速随机访问
- 内存空间占⽤
3.ArrayList 与 Vector 区别呢?为什么要⽤Arraylist取代Vector呢?
- ArrayList 是 List 的主要实现类,底层使⽤ Object[ ] 存储,适⽤于频繁的查找⼯作,线
程不安全 ;
- Vector 是 List 的古⽼实现类,底层使⽤ Object[ ] 存储,线程安全的。
4.HashMap 和 Hashtable 的区别
- 线程是否安全
- 效率
- 对 Null key 和 Null value 的⽀持
- 初始容量⼤⼩和每次扩充容量⼤⼩的不同
- 底层数据结构
5.HashMap 和 HashSet区别