互联网大厂Java面试:核心知识大考验
面试官:请简要介绍一下Java中的多线程,以及它在实际业务场景中的应用。
王铁牛:多线程就是一个程序中同时运行多个线程嘛。在实际业务场景中,比如电商系统里,下单操作和库存更新就可以用多线程来同时处理,提高效率。
面试官:那如何创建一个线程呢?
王铁牛:可以通过继承Thread类或者实现Runnable接口来创建线程。
面试官:很不错,回答正确。接下来问一下线程池相关的问题,在高并发场景下,使用线程池有什么好处?
王铁牛:线程池可以复用线程,减少线程创建和销毁的开销,还能控制线程数量,避免资源耗尽。
面试官:很好。第一轮面试结束。
接下来进入第二轮面试。面试官:请详细说说JVM的内存结构。
王铁牛:JVM内存结构包括堆、栈、方法区等。堆用来存储对象实例,栈存放局部变量等,方法区存储类信息等。
面试官:那对象在堆中的内存布局是怎样的?
王铁牛:对象头、实例数据、对齐填充。
面试官:JVM的垃圾回收机制是怎样的?
王铁牛:就是把不再使用的对象回收掉,有标记清除、标记整理、复制算法等方式。
面试官:第二轮面试结束。
最后一轮面试。面试官:说说Spring框架的核心特性。
王铁牛:依赖注入、面向切面编程这些吧。
面试官:Spring Boot和Spring相比,有哪些优势?
王铁牛:Spring Boot更简单,自动配置很方便,能快速搭建项目。
面试官:MyBatis的工作原理是什么?
王铁牛:大概就是通过SQL映射文件来操作数据库吧。
面试官:面试结束了,回去等通知吧。
答案
- 多线程创建方式:
- 继承Thread类:创建一个类继承Thread类,重写run方法,然后创建该类的实例并调用start方法启动线程。示例代码:
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程执行");
}
}
MyThread thread = new MyThread();
thread.start();
- 实现Runnable接口:创建一个类实现Runnable接口,重写run方法,然后创建Thread类的实例并将实现Runnable接口的类的实例作为参数传递给Thread类的构造函数,最后调用start方法启动线程。示例代码:
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程执行");
}
}
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
- 线程池好处:
- 复用线程:避免频繁创建和销毁线程,降低系统开销。
- 控制线程数量:可以根据系统资源和业务需求合理设置线程数量,防止资源耗尽。
- 提高响应速度:线程池中的线程已经创建好,当有任务到来时可以快速执行,提高系统响应速度。
- JVM内存结构:
- 堆(Heap):是JVM中最大的一块内存区域,用于存储对象实例。可以分为新生代(又分为Eden区、From Survivor区和To Survivor区)、老年代。
- 栈(Stack):每个线程都有自己独立的栈空间,用于存储局部变量、方法调用等。
- 方法区(Method Area):存储类信息、常量、静态变量等。
- 程序计数器(Program Counter Register):记录当前线程执行的字节码指令地址。
- 对象在堆中的内存布局:
- 对象头(Object Header):包含对象的哈希码、对象分代年龄、锁状态标志等信息。
- 实例数据(Instance Data):存储对象的成员变量。
- 对齐填充(Padding):由于对象的大小需要是8字节的整数倍,所以可能会有对齐填充部分。
- JVM垃圾回收机制:
- 标记清除算法(Mark-Sweep):先标记出所有需要回收的对象,然后统一回收掉。缺点是会产生内存碎片。
- 标记整理算法(Mark-Compact):先标记出需要回收的对象,然后将存活对象向一端移动,最后清理掉边界以外的内存。
- 复制算法(Copying):将内存分为两块,每次只使用其中一块,当这块内存使用完后,将存活对象复制到另一块内存,然后清理原来的内存。适用于新生代。
- Spring框架核心特性:
- 依赖注入(Dependency Injection):通过控制反转(IoC)容器将对象之间的依赖关系注入到对象中,降低对象之间的耦合度。
- 面向切面编程(Aspect-Oriented Programming, AOP):可以将横切关注点(如日志、事务等)与业务逻辑分离,提高代码的可维护性和复用性。
- IoC容器:管理对象的创建、销毁和依赖关系,提供了一种松耦合的对象管理方式。
- Spring Boot优势:
- 自动配置:Spring Boot通过自动配置功能,根据项目引入的依赖自动配置相关的Bean,极大地简化了项目的配置过程。
- 快速搭建项目:提供了各种starter依赖,能够快速构建一个完整的项目框架,减少了开发人员手动配置的工作量。
- 内嵌服务器:可以直接内嵌Tomcat、Jetty等服务器,无需再单独部署服务器,方便开发和部署。
- MyBatis工作原理:
- 读取配置文件:MyBatis首先读取配置文件,配置文件中包含了数据源、映射文件等信息。
- 创建SqlSessionFactory:根据配置文件创建SqlSessionFactory,它是MyBatis的关键对象,用于创建SqlSession。
- 创建SqlSession:通过SqlSessionFactory创建SqlSession,SqlSession是执行SQL操作的接口。
- 执行SQL:通过SqlSession执行SQL语句,MyBatis会根据映射文件中的SQL语句和参数进行SQL的组装和执行。
- 结果映射:将SQL执行结果映射到Java对象上,MyBatis通过映射文件中的resultMap等配置来完成对象关系映射。