一、基础语法类
1. 谈谈你对面向对象三大特性(封装、继承、多态)的理解?
- 封装:将数据和操作封装在类中,通过访问修饰符控制外部对类内部成员的访问,提高了数据的安全性和代码的可维护性。比如将一些敏感数据设为私有,并通过公共方法来访问和修改。
- 继承:子类继承父类的属性和方法,可以减少代码重复,实现代码复用。例如,汽车类可以作为父类,轿车、卡车等可以作为子类继承汽车类的一些通用属性和方法。
- 多态:同一操作作用于不同的对象可以有不同的表现形式。分为编译时多态(方法重载)和运行时多态(方法重写)。比如,定义一个图形类,其子类有圆形、矩形等,它们都重写了图形类的计算面积方法,在调用时根据实际对象的不同表现出不同的行为。
2. 说说 final、finally、finalize 的区别?
- final:可以修饰类、方法、变量。修饰类表示该类不能被继承;修饰方法表示该方法不能被重写;修饰变量表示该变量一旦被赋值就不能被改变。
- finally:通常用在 try-catch 语句中,无论是否发生异常,finally 块中的代码都会被执行,常用于释放资源等操作。
- finalize:是 Object 类中的一个方法,在垃圾回收器确定不存在对该对象的更多引用时,由垃圾回收器在对象被回收之前调用该方法,一般不建议主动调用这个方法。
二、集合框架类
1. ArrayList 和 LinkedList 的区别是什么?
- ArrayList 基于动态数组实现,随机访问速度快,插入和删除元素时需要移动大量元素,效率较低。适合频繁查询、较少插入和删除的场景。
- LinkedList 基于双向链表实现,插入和删除元素速度快,但随机访问需要遍历链表,效率较低。适合频繁插入和删除、较少随机访问的场景。
2. HashMap 和 HashTable 的区别有哪些?
- HashMap 允许键和值为 null,非线程安全,效率较高。
- HashTable 不允许键和值为 null,线程安全,效率相对较低。
三、多线程类
1. 谈谈你对线程和进程的理解?
- 进程:是操作系统分配资源的基本单位,一个进程可以包含多个线程。比如打开一个浏览器就是一个进程。
- 线程:是 CPU 调度的基本单位,一个进程中的多个线程共享进程的资源。比如浏览器中的多个标签页可以看作不同的线程在同时运行。
2. 如何实现多线程?
- 继承 Thread 类并重写 run 方法。
- 实现 Runnable 接口,实现 run 方法,并将该实例作为参数传递给 Thread 类的构造方法来创建线程。
- 使用 Java 8 引入的 lambda 表达式简化实现 Runnable 接口的方式。
四、JVM 相关类
1. 说说 JVM 的内存结构?
- 方法区:存储类信息、常量、静态变量等。
- 堆:存储对象实例和数组,是垃圾回收的主要区域。
- 虚拟机栈:每个线程都有自己的栈,存储局部变量、方法参数、返回值等。
- 本地方法栈:用于支持 Native 方法的执行。
- 程序计数器:记录当前线程执行的字节码指令地址。
2. 什么是垃圾回收?如何判断一个对象是否可以被回收?
- 垃圾回收是 JVM 自动回收不再使用的对象所占用的内存空间的过程。
- 判断对象是否可回收通常使用可达性分析算法,通过一系列的“GC Roots”对象作为起始点,从这些节点开始向下搜索,走过的路径称为引用链。当一个对象到任何一个“GC Roots”都没有引用链相连时,则证明此对象是不可用的,可以被回收。
五、Spring Boot 相关类
1. 什么是 Spring Boot?它有哪些特点?
- Spring Boot 是一个用于快速开发基于 Spring 框架的独立应用程序的工具。它简化了 Spring 应用的搭建和开发过程,通过自动配置、起步依赖等特性,让开发者可以快速构建可运行的应用。
- 特点包括:快速创建独立的 Spring 应用、自动配置、起步依赖简化项目配置、内置服务器(如 Tomcat、Jetty)方便部署、提供生产就绪的特性(如监控、健康检查等)。
2. Spring Boot 的自动配置是如何实现的?
- Spring Boot 通过在类路径下扫描特定的条件和注解来自动配置应用。例如,当发现某个依赖在类路径中时,就会自动配置相应的组件和功能。它使用了条件注解(如 @ConditionalOnClass、@ConditionalOnProperty 等)来决定是否进行特定的配置。
3. 谈谈 Spring Boot 的起步依赖(starter)的作用?
- 起步依赖是一组预定义的依赖集合,它为特定的功能或技术领域提供了一站式的解决方案。例如,spring-boot-starter-web 包含了构建 Web 应用所需的 Spring MVC、Tomcat 等依赖,大大简化了项目的依赖管理。
4. 如何在 Spring Boot 中进行配置?
- 可以通过 application.properties 或 application.yml 文件进行全局配置,也可以通过使用 @Configuration 注解的 Java 类进行自定义配置。还可以使用环境变量、命令行参数等方式进行配置。
5. 讲讲 Spring Boot 的 actuator 模块的作用?
- actuator 模块提供了一系列用于监控和管理应用的端点。可以查看应用的健康状况、内存使用情况、线程信息等,还可以进行一些操作,如关闭应用等。它有助于在生产环境中对应用进行监控和管理。