程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

java 面试题和答案(java面试题目100及最佳答案)

balukai 2025-07-03 12:14:47 文章精选 3 ℃

反射机制是什么?

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 面试常见问题。若你觉得某些部分需要更深入展开,或还有其他面试方向想了解,随时和我说。

最近发表
标签列表