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 个元素整体移到后面
Hash 碰撞是指:不同 key 经哈希函数计算后,得到相同结果。
Hash 碰撞解决方案:
关键优化:
Java 程序的执行流程经历了从编译到字节码的生成,再到类加载和 JIT 编译的过程,最终在 JVM 中执行。并且在程序运行过程中,JVM 负责内存管理、垃圾回收和线程调度等工作。
主要流程如下:
.java 源码文件。.java 文件编译为 .class 文件(字节码)。.class 文件到内存。
0xCAFEBABE)。static int a 初始化为 0)。static{})和静态变量赋值(如 static int a = 1;)。HelloWorld 的类名、方法定义、常量池)。String 对象)。main() 方法的栈帧(局部变量、操作数栈等)。invokestatic 调用 System.out.println)。启动快,执行效率低。native 方法(如 Object.clone()),通过 JNI 执行本地库(C/C++)代码。