Collection),Java 语言的一个重要特性就是自动内存管理,主要体现在垃圾回收机制上。GC 是 Java 中的自动内存管理系统,它的主要任务是识别并回收不再使用的对象所占用的内存空间,以防止内存泄漏并优化内存使用效率。有了 GC,程序员无需手动管理内存的分配和释放,从而能够更专注于代码逻辑本身。
在 Java 中,当一个对象不再被任何引用指向时,它就成为了一个垃圾对象。GC 通过一系列算法来检测和回收这些垃圾对象,这些算法包括可达性分析和引用计数等。GC 运行在后台,不影响应用程序的正常执行,但在特定时刻可能会暂停应用程序(也称为“stop-the-world”事件)来进行垃圾回收。
GC 的存在使得 Java 开发者可以编写更加简洁、易于维护的代码,但同时也会带来一定的性能开销。因此,理解 GC 的工作原理和调优策略对于开发高性能的 Java 应用至关重要。
1. **abstract class 和 interface 的区别**
- 抽象类(abstract class)可以包含抽象方法和非抽象方法,可以有构造函数,但不能实例化。
- 接口(interface)只能包含抽象方法(Java 8 以后可以有默认方法和静态方法),没有构造函数,不能实例化,主要用于多继承。
- 抽象类可以提供部分实现,而接口则完全依赖于实现类来提供方法的实现。
- 类可以实现多个接口,但只能继承一个抽象类。
2. **heap 和 stack 的区别**
- 栈(stack)是线程私有的,存储局部变量、方法参数、返回地址等,遵循 LIFO(后进先出)原则。
- 堆(heap)是所有线程共享的,主要用于存储对象实例,进行动态内存分配,是垃圾收集的主要区域。
3. **forward 和 redirect 的区别**
- forward 是服务器内部重定向,客户端浏览器地址栏不会改变,请求的资源直接由服务器处理并返回。
- redirect 是服务器向客户端返回一个 HTTP 状态码,指示浏览器重新发起一个新的请求,地址栏会显示新的 URL。
4. **EJB 与 JAVA BEAN 的区别**
- Java Bean 是普通的 Java 类,可复用,通常具有无参构造器,实现序列化接口,用于组件间通信。
- EJB(Enterprise Java Beans)是企业级的组件,运行在应用服务器中,支持分布式计算,提供事务、安全性和并发控制等高级功能。
5. **Static Nested Class 和 Inner Class 的不同**
- Static Nested Class 是静态内部类,可以独立于外部类实例存在,可以直接通过类名访问。
- Inner Class 是非静态内部类,必须依附于外部类实例,不能直接通过类名访问,可以访问外部类的非静态成员。
6. **JSP 中动态 INCLUDE 和静态 INCLUDE 的区别**
- 动态INCLUDE(jsp:include)在每次请求时都会检查被包含页面的内容,适合包含动态内容。
- 静态INCLUDE(%@ include file%)在编译时合并,仅包含一次,适用于静态内容。
7. **assert 的使用**
- 断言(assert)用于在开发和测试阶段确保代码的正确性,通过断言表达式,当表达式为假时,程序会停止并提示错误信息。
这些面试题涵盖了 Java 核心概念、面向对象设计、内存管理、Web 开发等多个方面,理解这些知识点对于 Java 开发者来说非常重要。在面试中,能够深入地讨论这些问题将有助于展示候选人的专业技能和解决问题的能力。