面试
JavaCore 面试
- Java 基础面试一 💯
- Java 基础面试二 💯
- Java 基础面试三 💯
- Java 容器面试一 💯
- Java 容器面试二 💯
- Java 容器面试三 💯
- Java 并发面试一 💯
- Java 并发面试二 💯
- Java 并发面试三 💯
- Java 虚拟机面试一 💯
- Java 虚拟机面试二 💯
判断 Java 对象是否可以被回收有两种方法:
引用计数算法(Reference Counting)的原理是:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。
引用计数算法简单高效,但是存在循环引用问题——两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。
顾名思义,线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。
池化技术想必大家已经屡见不鲜了,线程池、数据库连接池、HTTP 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。
线程池提供了一种限制和管理资源(包括执行一个任务)的方式。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。
在 Java 中,锁可以按照 多个维度 进行分类,不同维度的锁适用于不同的并发场景。以下是详细的分类:
按锁的公平性划分
锁类型 | 特点 | 实现类/关键字 |
---|---|---|
公平锁 | 严格按照线程请求顺序(FIFO)分配锁,避免线程饥饿,但性能较低。 | ReentrantLock(true) |
非公平锁 | 允许插队,新请求的线程可能直接抢到锁,吞吐量高,但可能导致线程饥饿(默认方式)。 | ReentrantLock(false) 、synchronized |
Java 泛型是什么?
泛型允许在类、接口、方法上使用类型参数(如 <T>
),使代码能适应多种数据类型,同时保证类型安全。
Java 泛型有什么用?
private
只允许当前类可以访问。protected
只允许当前类、子类和同一个包中的类访问。public
允许任意类和对象访问。(1)对象是用来描述客观事物的一个抽象。一个对象由一组属性和对这组属性进行操作的一组服务组成。
Java 容器类主要位于 java.util
包,分为 Collection 和 Map 两大类:
Collections
工具类常用方法:
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 个元素整体移到后面
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+) | 仅链表 |
类加载→内存分配→执行引擎运行→GC 回收内存,通过 JNI 与外部交互。
JVM(Java 虚拟机)主要由以下核心部分组成: