跳至主要內容
Java 虚拟机面试二

Java 虚拟机面试二

垃圾收集

【困难】如何判断 Java 对象是否可以被回收?

判断 Java 对象是否可以被回收有两种方法:

  • 引用计数法
  • 可达性分析法

引用计数法

引用计数算法(Reference Counting)的原理是:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。

引用计数算法简单高效,但是存在循环引用问题——两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。


钝悟...大约 22 分钟JavaJavaCore面试JavaJavaCore面试JVM
Java 并发面试三

Java 并发面试三

Java 线程池

【简单】为什么要用线程池?

顾名思义,线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。

池化技术想必大家已经屡见不鲜了,线程池、数据库连接池、HTTP 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。

线程池提供了一种限制和管理资源(包括执行一个任务)的方式。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。


钝悟...大约 35 分钟JavaJavaCore面试JavaJavaCore面试并发
Java 并发面试二

Java 并发面试二

Java 锁

【中等】Java 中,根据不同维度划分,锁有哪些分类?

在 Java 中,锁可以按照 多个维度 进行分类,不同维度的锁适用于不同的并发场景。以下是详细的分类:

按锁的公平性划分

锁类型 特点 实现类/关键字
公平锁 严格按照线程请求顺序(FIFO)分配锁,避免线程饥饿,但性能较低。 ReentrantLock(true)
非公平锁 允许插队,新请求的线程可能直接抢到锁,吞吐量高,但可能导致线程饥饿(默认方式)。 ReentrantLock(false)synchronized

钝悟...大约 32 分钟JavaJavaCore面试JavaJavaCore面试并发
Java 基础面试三

Java 基础面试三

Java 泛型

【中等】Java 泛型的作用是什么?

Java 泛型是什么?

泛型允许在类、接口、方法上使用类型参数(如 <T>,使代码能适应多种数据类型,同时保证类型安全。

Java 泛型有什么用?


钝悟...大约 20 分钟JavaJavaCore面试JavaJavaCore面试
Java 基础面试二

Java 基础面试二

Java 面向对象

【简单】对象实体与对象引用有何不同?

(1)对象是用来描述客观事物的一个抽象。一个对象由一组属性和对这组属性进行操作的一组服务组成。

(2)类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分。

(3)对象实体与对象引用的不同之处在于:

  • new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)
  • 一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);
  • 一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。

钝悟...大约 18 分钟JavaJavaCore面试JavaJavaCore面试
Java 容器面试一

Java 容器面试一

Java 容器简介

【简单】Java 中有哪些集合类?

img
img

Java 容器类主要位于 java.util 包,分为 CollectionMap 两大类:


钝悟...大约 15 分钟JavaJavaCore面试JavaJavaCore面试容器
Java 容器面试三

Java 容器面试三

Java 容器工具类

Collections 工具类常用方法:

  • 排序
  • 查找,替换操作
  • 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合)

排序操作

void reverse(List list)//反转
void shuffle(List list)//随机排序
void sort(List list)//按自然排序的升序排序
void sort(List list, Comparator c)//定制排序,由 Comparator 控制排序逻辑
void swap(List list, int i , int j)//交换两个索引位置的元素
void rotate(List list, int distance)//旋转。当 distance 为正数时,将 list 后 distance 个元素整体移到前面。当 distance 为负数时,将 list 的前 distance 个元素整体移到后面

钝悟...大约 11 分钟JavaJavaCore面试JavaJavaCore面试容器
Java 容器面试二

Java 容器面试二

Map

【中等】HashMap 和 Hashtable 有什么区别?

HashMap 更高效且灵活,Hashtable 线程安全但过时,推荐用 ConcurrentHashMap 替代。

对比项 HashMap (JDK 1.2+) Hashtable (JDK 1.0)
线程安全 ❌ 非线程安全(需额外同步) ✅ 线程安全(方法用 synchronized 修饰)
性能 ⚡ 更高(无锁竞争) ⏳ 较低(同步开销)
Null 键/值 ✅ 允许 null 键和值 ❌ 不允许 null
迭代器 fail-fast(快速失败,并发修改抛异常) enumerator(不抛异常)
继承体系 继承 AbstractMap 继承 Dictionary(已过时)
初始容量与扩容 默认 16,扩容为 2 倍 默认 11,扩容为 2 倍 + 1
哈希冲突解决 链表 + 红黑树(JDK 8+) 仅链表

钝悟...大约 16 分钟JavaJavaCore面试JavaJavaCore面试容器
Java 虚拟机面试一

Java 虚拟机面试一

JVM 简介

【中等】JVM 由哪些部分组成?

类加载→内存分配→执行引擎运行→GC 回收内存,通过 JNI 与外部交互。

JVM(Java 虚拟机)主要由以下核心部分组成:

  • 类加载子系统:负责加载、验证、准备、解析和初始化类文件(.class)。
  • 运行时数据区
    • 方法区:存储类元数据、常量池等。
    • :存放对象实例(主 GC 区域)。
    • 虚拟机栈:存储方法调用的栈帧(局部变量、操作数栈等)。
    • 本地方法栈:为 Native 方法服务。
    • 程序计数器:记录当前线程执行的字节码位置。
  • 执行引擎:解释或编译字节码为机器码执行(含 JIT 编译器)。
    • 解释器(Interpreter):逐行解释执行字节码(启动快,执行慢)。
    • 即时编译器(JIT Compiler):将热点代码(频繁执行的代码)编译为本地机器码(如 HotSpot 的 C1、C2 编译器)。
    • 垃圾回收器(GC):自动回收堆中无用的对象(如 Serial、Parallel、G1、ZGC 等算法)。
  • 本地方法接口(JNI):调用 C/C++实现的 Native 方法。
  • 本地方法库(Native Libraries):由其他语言(如 C/C++)编写的库,供 JNI 调用(如文件操作、网络通信等底层功能)。

钝悟...大约 31 分钟JavaJavaCore面试JavaJavaCore面试JVM
Java 基础面试一

Java 基础面试一

Java 常识

【简单】Java 语言有什么优势?

  • 跨平台:【一次编写,到处执行(Write Once, Run Anywhere)】——JVM 执行字节码。
  • 自动垃圾回收:垃圾回收(GC)减少内存泄漏风险。
  • 强大生态:Spring、Hadoop、Android 等广泛支持。
  • 面向对象:支持封装、继承、多态,代码结构清晰易维护。
  • 高性能:JIT 编译优化,多线程支持高并发。
  • 健壮安全:强类型检查、异常处理、JVM 安全机制。

钝悟...大约 27 分钟JavaJavaCore面试JavaJavaCore面试
2
3
4
5
...
7