面试官:请简要介绍一下Java中的多线程。
王铁牛:多线程就是多个线程同时运行呗,能提高程序效率。
面试官:那如何创建一个线程呢?
王铁牛:可以继承Thread类或者实现Runnable接口。
面试官:回答得不错。那说说线程池的原理和作用吧。
王铁牛:线程池就是预先创建一些线程,当有任务来的时候从线程池里拿线程去执行任务,能减少线程创建和销毁的开销。
第一轮结束。
面试官:讲讲JVM的内存结构。
王铁牛:JVM内存结构包括堆、栈、方法区这些。
面试官:那对象在堆中的存储方式是怎样的?
王铁牛:嗯……大概就是按一定结构存着吧。
面试官:HashMap的底层实现原理呢?
王铁牛:就是数组加链表,好像还有红黑树啥的。
第二轮结束。
面试官:Spring框架的核心特性有哪些?
王铁牛:依赖注入、面向切面编程这些吧。
面试官:Spring Boot的优点是什么?
王铁牛:能快速搭建项目,很方便。
面试官:MyBatis的工作原理是什么?
王铁牛:通过SQL映射文件啥的来操作数据库。
第三轮结束。
面试官:今天的面试就到这里,回去等通知吧。
多线程:
- 创建线程方式:
- 继承Thread类:定义一个类继承Thread类,重写run方法,然后创建该类实例调用start方法启动线程。
- 实现Runnable接口:定义一个类实现Runnable接口,实现run方法,然后通过Thread类构造函数传入该实例创建线程并启动。
- 线程池原理:
- 线程池预先创建一定数量的线程。
- 当有任务提交时,从线程池中获取线程来执行任务。
- 如果线程池中的线程都在忙碌,任务会被放入任务队列中排队等待。
- 当任务队列满了且线程池中的线程数量未达到最大线程数时,会创建新的线程来执行任务。
- 线程池有核心线程数、最大线程数、任务队列等参数来控制线程池的行为。
JVM内存结构:
- 堆:存放对象实例,是垃圾回收的主要区域。
- 栈:存放局部变量、方法调用等。
- 方法区:存储类信息、常量、静态变量等。
HashMap底层实现原理:
- 初始是一个数组。
- 当往HashMap中插入键值对时,通过键的哈希值计算出在数组中的索引位置。
- 如果该位置为空,则直接插入新节点。
- 如果该位置不为空,则会形成链表或红黑树(当链表长度达到一定阈值会转换为红黑树),新节点会插入到链表或红黑树的头部。
- 在进行查询时,同样通过键的哈希值计算索引位置,然后在对应的链表或红黑树中查找。
Spring框架核心特性:
- 依赖注入:通过IoC容器将对象之间的依赖关系进行管理和注入,降低对象之间的耦合度。
- 面向切面编程:可以在不修改原有代码的基础上,动态地添加功能,比如日志、事务管理等。
Spring Boot优点:
- 快速搭建项目:提供了很多默认配置,能让开发者快速创建一个可用的项目。
- 自动配置:根据项目引入的依赖自动配置相关的组件和功能。
- 内嵌服务器:可以直接在项目中启动一个Web服务器,方便开发和部署。
MyBatis工作原理:
- 读取SQL映射文件:配置了SQL语句和参数映射等信息。
- 根据SQL映射文件和参数构建SQL语句:通过动态SQL等功能生成最终要执行的SQL。
- 执行SQL:利用JDBC等方式与数据库进行交互,执行SQL语句并获取结果。
- 结果映射:将数据库返回的结果按照SQL映射文件中的配置映射成Java对象。