网站首页 > 文章精选 正文
反射机制是什么?
Java 反射机制允许程序在运行时动态获取类的信息,包括构造函数、方法、属性等,并能动态调用类的方法、访问和修改属性。例如通过Class.forName()加载类获取Class对象,进而实现对类的动态操作,在 Spring 依赖注入、动态代理等场景广泛应用。
抽象类与接口有何区别?
对比项 | 抽象类 | 接口 |
语法 | 含普通与抽象方法,有构造函数,用extends继承 | JDK 8 后可含默认与静态方法,无构造函数,用implements实现 |
设计目的 | 抽取共性,实现代码复用,体现 “is - a” 关系 | 定义行为规范,体现 “can - do” 关系 |
继承 | 单继承 | 可实现多个 |
final、finally、finalize 分别是什么?
- final:修饰类、方法、变量,类不能被继承,方法不能被重写,变量成为常量。
- finally:try - catch - finally 语句块的一部分,无论是否发生异常,其中代码都会执行,常用于释放资源。
- finalize:Object类的方法,对象被垃圾回收前调用,用于资源清理,但因回收不确定,不建议依赖。
JDK1.8 引入了哪些新特性,Lambda 表达式是什么?
JDK1.8 引入了 Lambda 表达式、接口默认方法和静态方法、新的日期时间 API 等特性。Lambda 表达式是简洁的匿名函数,语法如(parameters) -> expression ,与函数式接口配合使用,简化代码,在集合操作等场景广泛应用,如list.sort((a, b) -> a - b) 。
如何处理 Java 集合?
Java 集合分为Collection和Map体系。Collection包括List(有序可重复)、Set(无序不可重复)、Queue ,常见操作有添加、删除、遍历;Map存储键值对,常见操作有添加键值对、获取值、遍历键值对 。
多线程中 Future 如何使用?
Future用于获取异步计算结果。FutureTask实现Future和Runnable接口,可提交任务获取Future对象,用get方法阻塞获取结果,还能通过cancel取消任务、isDone判断任务是否完成。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class FutureExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
Thread.sleep(2000);
return 42;
}
});
try {
Integer result = future.get();
System.out.println("结果: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
} finally {
executor.shutdown();
}
}
}
ConcurrentHashMap 和 HashMap 有什么不同?
- 线程安全性:HashMap 非线程安全,ConcurrentHashMap 线程安全。
- 性能:单线程下 HashMap 性能略优,多线程下 ConcurrentHashMap 并发性能更好。
- 实现原理:HashMap 基于哈希表,用链地址法解决冲突;ConcurrentHashMap 在 JDK 1.7 用分段锁,JDK 1.8 优化为类似 HashMap 结构结合synchronized 。
Lock 和 Synchronized 有何比较?
对比项 | Synchronized | Lock |
语法与使用 | Java 关键字,自动获取释放锁 | 接口,手动调用lock、unlock |
锁特性 | 可重入锁 | 可重入,有更多高级功能如定时获取锁 |
性能 | 低并发差异不大,高并发 Lock 性能更好 |
如何保证一个类在多线程下只被一个线程调用一次?
可使用AtomicBoolean或volatile修饰的标志位。以AtomicBoolean为例:
import java.util.concurrent.atomic.AtomicBoolean;
public class SingleInvocationClass {
private AtomicBoolean isInvoked = new AtomicBoolean(false);
public void doSomething() {
if (isInvoked.compareAndSet(false, true)) {
System.out.println("方法被调用");
} else {
System.out.println("方法已被调用过");
}
}
}
若 A 线程锁住资源,B 线程如何等待一段时间后自动放弃?
使用ReentrantLock的tryLock方法结合定时等待:
import java.util.concurrent.locks.ReentrantLock;
public class ThreadLockExample {
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
Thread threadA = new Thread(() -> {
lock.lock();
try {
System.out.println("线程A获取到锁");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} finally {
lock.unlock();
System.out.println("线程A释放锁");
}
});
Thread threadB = new Thread(() -> {
try {
if (lock.tryLock(2, java.util.concurrent.TimeUnit.SECONDS)) {
try {
System.out.println("线程B获取到锁");
} finally {
lock.unlock();
}
} else {
System.out.println("线程B等待2秒后放弃获取锁");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
threadA.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
threadB.start();
}
}
线程池的相关内容?
线程池通过ThreadPoolExecutor实现,构造参数有核心线程数、最大线程数、空闲线程存活时间等。使用步骤为创建线程池、提交任务(execute提交Runnable,submit提交Callable )、关闭线程池。
BIO、NIO、AIO 的区别及应用场景?
- BIO:同步阻塞,一个线程处理一个连接,适用于连接数少且固定场景。
- NIO:同步非阻塞,基于通道和缓冲区,用选择器多路复用,适用于连接数多且短的场景。
- AIO:异步非阻塞,操作系统完成 I/O 后通知线程,适用于连接数多且对响应要求高的场景。
如何理解 Redis?
Redis 是基于内存的开源数据存储系统,可用作数据库、缓存和消息中间件。支持多种数据结构,具备高性能、原子操作、持久化、主从复制、集群等特性,应用于缓存、计数器等场景。
Redis 分布式锁如何实现?
常用SETNX命令实现,获取锁时SETNX lock_key unique_value ,unique_value标识客户端,释放锁通过 Lua 脚本原子删除键,防止误删。
Redis SETNX 的原理是什么?
SETNX是原子操作,执行SETNX key value ,若key不存在,设key为value并返回 1;若key存在,不操作返回 0,适合实现锁机制。
微服务之间如何互相调用?
- RESTful API:基于 HTTP,简单易用,跨平台。
- RPC:如 gRPC、Dubbo,性能高,适合对性能要求高场景。
- 消息队列:通过 Kafka、RabbitMQ 等异步通信,适用于解耦场景。
项目自动化部署常用哪些工具?
常用 Jenkins 进行持续集成和部署,Docker 进行容器化,Kubernetes 进行容器编排。
JUNIT 有哪些常用功能?
包括测试方法标注(@Test )、断言、测试套件、测试生命周期管理(@Before、@After等注解) 。
JWT 是什么?
JWT 由头部、载荷、签名组成,用于网络应用间安全传输信息,常用于用户认证和授权,服务端验证其有效性。
以上涵盖了 Java 面试常见问题。若你觉得某些部分需要更深入展开,或还有其他面试方向想了解,随时和我说。
猜你喜欢
- 2025-07-03 Java面试题及答案最全总结(2025春招版)
- 2025-07-03 史上最全的Java并发专题面试常见问题60道
- 2025-07-03 Java面试题及答案最全总结(2025版)
- 2025-07-03 Java面试篇基础部分-Java中的异常以及异常处理
- 2025-07-03 大厂面试冲刺,Java“实战”问题三连,你碰到了哪个?
- 2025-07-03 java面试必备:七个常见的Java算法问题和示例答案
- 2025-07-03 10 个经典的 Java 集合面试题,看你能否答得上来?
- 2025-07-03 屡次拿不到offer,这10个经典的Java面试问题你答得上来吗?
- 2025-07-03 25 年 Java 开发者面试必问 TOP10 核心问题及破题攻略
- 2025-07-03 Java面试题及答案最全总结(2023版)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)