面试题.04
1. hashmap插入键是类的时候有什么问题?
如果未重写hashcode方法和equals方法,会导致两个完全相同的对象在hashmap中会被视为不同的key,因为hashcode方法和equals方法在Object类中的默认实现是通过地址的形式生成/比较的,所有会导致任何两个对象都会被视为两个不同的对象。
2. maven的依赖优先级原则
“最近优先”原则,在依赖树中,如果多个版本的同一依赖存在,Maven 会使用离当前项目最近的版本。
例如现在有个项目A , 项目A依赖项目B和jar包x,同时项目B也依赖jar包x,此时项目A可以选择的x有两条路径:
A -- B -- x
A -- x
显然下面的路径更短,所以会使用下面的x
3. 如果HashMap桶中只有一个元素,会走equals判断吗
会,假设使用了put方法,找到对应哈希桶时发现只有一个元素,但这个元素与put的key可能只是hashcode相同但并不是同一个对象,所以需要使用equals方法判断是否是同一个对象
4. 数据库的四个特性
- 原子性 (Atomicity):事务中的操作要么全部成功,要么全部失败。即使在系统崩溃的情况下,事务也不会只完成部分操作。
- 一致性 (Consistency):事务的执行必须使数据库从一个一致的状态变为另一个一致的状态。数据在事务执行前后的完整性约束必须得到维护。
- 隔离性 (Isolation):事务的执行应当独立于其他事务。一个事务的执行不应受其他事务的干扰,直到该事务完成并提交。常见的隔离级别包括读未提交、读已提交、可重复读和串行化。
- 持久性 (Durability):一旦事务被提交,其对数据库的修改将永久保存,即使系统崩溃也不会丢失。
5. Springboot的启动流程
- 加载启动类:当springboot项目启动时会在当前工作目录下寻找@SpringBootApplication注解标识的类,并把这个类作为应用程序的入口点。如果找不到这样的主类,则会打印错误信息并退出。
- 加载配置文件:springboot会自动扫描resource目录,并加载其中的application.properties或application.yml等配置文件。这些配置文件中包含了应用程序的各种参数,例如数据库连接信息、日志级别等等。
- 初始化上下文:创建SpringApplication对象,并调用SpringApplication的run方法初始化ApplicationContext对象。这个过程会读取配置文件中的参数,并将它们转换成Environment对象中的属性。同时还会扫描当前项目中所有的Bean并注册到ApplicationContext中
- 启动Web服务器:根据配置文件中的信息自动创建Tomcat等Web容器,并将Spring容器注册到Web容器中,使得SpringBoot应用程序可以直接以Web应用程序的形式运行。
- 启动应用程序:根据创建好的Spring容器以及Web服务器,启动响应线程进行服务处理
- 监听应用程序的状态:SpringBoot会监听应用程序的状态,并根据需要进行相应的操作。例如,当应用程序退出时,它会打印出详细的日志信息,并将应用程序的上下文环境恢复到初始状态。
6. 介绍Java内存模型JMM
jmm是一种抽象的概念,用于定义多线程程序如何与内存进行交互
- 主内存:所有变量都存储在主内存中,主内存是共享的。
- 工作内存:每个线程都有自己的工作内存,工作内存中保存了主内存中变量的副本。线程对变量的所有操作(读取、写入)都在工作内存中进行,最后再将结果同步回主内存。
工作内存指的是CPU的寄存器和缓存,比起内存来说,访问速度是快得多的,引入工作内存可以减少内存访问延迟,提高程序的执行效率。但同时也引入了内存可见性问题