阿里Java 200题深度解析:从基础到架构,面试通关必备
四、Java并发
4.1 线程与进程
4.1.1 创建线程的新方式
在Java 8及以后,我们可以使用Lambda表达式更简洁地创建线程:
// 使用Lambda表达式实现Runnable接口
Thread thread4 = new Thread(() -> {
System.out.println("线程 " + Thread.currentThread().getName() + " 正在运行");
});
thread4.start();
// 使用ExecutorService线程池创建线程
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
System.out.println("线程池中的线程正在执行任务");
});
executor.shutdown();
4.2 线程池
4.2.1 线程池的创建与使用
Java 8引入了更灵活的线程池创建方式,推荐使用ThreadPoolExecutor的构造函数来创建线程池:
// 创建一个自定义线程池
ExecutorService customExecutor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60, // 线程空闲时间
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100), // 任务队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
// 提交任务到线程池
customExecutor.execute(() -> {
System.out.println("自定义线程池执行任务");
});
// 关闭线程池
customExecutor.shutdown();
4.2.2 CompletableFuture异步编程
Java 8引入的CompletableFuture提供了强大的异步编程能力:
// 创建异步任务
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "任务1完成";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "任务2完成";
});
// 组合多个异步任务
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
// 所有任务完成后执行操作
allFutures.thenRun(() -> {
try {
System.out.println(future1.get());
System.out.println(future2.get());
System.out.println("所有任务都已完成");
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
});
// 主线程继续执行其他操作
System.out.println("主线程继续执行");
4.3 原子类
Java 8引入了更多的原子类,如LongAdder、DoubleAdder等,它们在高并发场景下比AtomicLong性能更好:
// 使用LongAdder进行计数器操作
LongAdder counter = new LongAdder();
// 模拟多线程环境下的计数操作
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 1000; i++) {
executorService.execute(() -> {
counter.increment();
});
}
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.SECONDS);
System.out.println("计数器值:" + counter.sum());
五、JVM
5.1 JVM内存模型
Java 8对JVM内存模型进行了优化,永久代(PermGen)被元空间(Metaspace)取代:
// JVM参数示例 - 设置元空间大小
// -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
5.2 垃圾回收机制
Java 11引入了ZGC(Z Garbage Collector),这是一种可伸缩的低延迟垃圾收集器:
// JVM参数示例 - 启用ZGC
// -XX:+UseZGC
5.3 类加载机制
Java 9引入了模块系统(Jigsaw),改变了传统的类加载机制:
// 模块定义文件module-info.java示例
module com.example.myapp {
requires java.base;
requires java.sql;
exports com.example.myapp.api;
opens com.example.myapp.internal to java.reflect;
}
六、Spring与Spring Boot
6.1 Spring Boot 2.x新特性
6.1.1 响应式编程支持
Spring Boot 2.x引入了对响应式编程的支持,使用WebFlux替代传统的Servlet API:
// 响应式WebFlux控制器示例
@RestController
@RequestMapping("/api")
public class ReactiveController {
@GetMapping(value = "/items", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<Item> getItems() {
return Flux.interval(Duration.ofSeconds(1))
.map(i -> new Item("Item-" + i, "Description-" + i));
}
}
6.1.2 函数式端点
Spring Boot 2.x支持函数式端点,提供了一种替代注解式控制器的方式:
// 函数式端点示例
@Configuration
public class RouterConfig {
@Bean
public RouterFunction<ServerResponse> route(HandlerFunction<ServerResponse> handler) {
return RouterFunctions.route(GET("/api/functional"), handler);
}
}
@Component
public class ItemHandler implements HandlerFunction<ServerResponse> {
@Override
public Mono<ServerResponse> handle(ServerRequest request) {
return ServerResponse.ok().body(Mono.just(new Item("Functional Item", "Description")), Item.class);
}
}
6.2 Spring Cloud Alibaba
Spring Cloud Alibaba是阿里巴巴开源的微服务解决方案:
// 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
// 配置文件application.yml
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
sentinel:
transport:
dashboard: 127.0.0.1:8080
七、数据库
7.1 MySQL 8新特性
7.1.1 窗口函数
MySQL 8引入了窗口函数,提供了强大的数据分析能力:
-- 使用窗口函数计算每个部门的工资排名
SELECT
emp_name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank
FROM employees;
7.1.2 隐藏索引
MySQL 8支持隐藏索引,可以在不删除索引的情况下测试索引的效果:
-- 创建隐藏索引
CREATE INDEX idx_name ON employees(name) INVISIBLE;
-- 查看索引状态
SHOW INDEX FROM employees;
-- 启用隐藏索引
ALTER INDEX idx_name ON employees VISIBLE;
7.2 MyBatis-Plus
MyBatis-Plus是MyBatis的增强工具,简化了开发流程:
// 实体类
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
// Mapper接口
public interface UserMapper extends BaseMapper<User> {
}
// Service层使用
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> listUsers() {
return userMapper.selectList(null);
}
@Override
public User getUserById(Long id) {
return userMapper.selectById(id);
}
@Override
public boolean saveUser(User user) {
return userMapper.insert(user) > 0;
}
}
八、分布式与微服务
8.1 服务注册与发现
8.1.1 Nacos
Nacos是阿里巴巴开源的服务注册与发现、配置管理平台:
// 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
// 启用服务发现
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class, args);
}
}
// 配置文件application.yml
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
8.2 服务熔断与限流
8.2.1 Sentinel
Sentinel是阿里巴巴开源的流量控制、熔断降级组件:
// 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
// 定义资源和限流规则
@Service
public class OrderService {
public String createOrder(String productId) {
// 定义资源
try (Entry entry = SphU.entry("createOrder")) {
// 业务逻辑
return "订单创建成功";
} catch (BlockException e) {
// 处理限流或熔断
return "系统繁忙,请稍后再试";
}
}
}
// 配置文件application.yml
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080
port: 8719
8.3 分布式事务
8.3.1 Seata
Seata是阿里巴巴开源的分布式事务解决方案:
// 添加依赖
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</dependency>
// 配置文件application.yml
seata:
application-id: ${
spring.application.name}
tx-service-group: my_test_tx_group
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
registry:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
// 服务提供者配置
@GlobalTransactional
public void business() {
// 业务逻辑
orderService.createOrder();
inventoryService.reduceStock();
accountService.reduceBalance();
}
九、高性能与高并发
9.1 异步编程
9.1.1 Project Loom
Java 19引入了Project Loom,提供了轻量级线程(虚拟线程)支持:
// 使用虚拟线程示例
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
try (executor) {
IntStream.range(0, 10_000).forEach(i -> {
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
});
});
} // executor.close() is called implicitly, and waits
9.2 响应式编程
9.2.1 Reactor
Reactor是Spring生态系统中推荐的响应式编程库:
// Flux示例 - 处理多个元素
Flux<Integer> numbers = Flux.range(1, 5)
.map(i -> i * 2)
.filter(i -> i > 5);
numbers.subscribe(
num -> System.out.println("元素: " + num),
error -> System.err.println("错误: " + error),
() -> System.out.println("完成")
);
// Mono示例 - 处理单个元素
Mono<String> message = Mono.just("Hello Reactor")
.map(msg -> msg + "!")
.delayElement(Duration.ofSeconds(1));
message.subscribe(
msg -> System.out.println("消息: " + msg),
error -> System.err.println("错误: " + error),
() -> System.out.println("消息处理完成")
);
9.3 缓存
9.3.1 Caffeine
Caffeine是Java 8及以上版本的高性能缓存库:
// 创建Caffeine缓存
Cache<String, Object> cache = Caffeine.newBuilder()
.maximumSize(100) // 最大缓存数量
.expireAfterWrite(10, TimeUnit.MINUTES) // 写入后10分钟过期
.build();
// 放入缓存
cache.put("key1", "value1");
// 从缓存获取
Object value = cache.getIfPresent("key1");
System.out.println("缓存值: " + value);
// 获取缓存,若不存在则通过指定方法加载
value = cache.get("key2", k -> {
// 模拟从数据库或其他数据源加载数据
return "value2";
});
System.out.println("加载后缓存值: " + value);
十、面试技巧与经验分享
10.1 面试准备策略
- 系统学习:建立完整的知识体系,从基础到高级,包括Java语言特性、集合框架、并发编程、JVM、数据库、框架等。
- 实战项目:参与实际项目开发,积累解决问题的经验,特别是高并发、高性能、分布式系统等方面的经验。
- 刷题与总结:刷面试题,不仅要知道答案,还要深入理解原理,总结解题思路和技巧。
- 模拟面试:进行模拟面试,提前适应面试节奏和压力,提高表达能力和应变能力。
10.2 常见面试问题回答技巧
- 问题理解:确保理解问题的含义,如有不清楚的地方,及时向面试官提问确认。
- 结构化回答:采用STAR法则(Situation情境、Task任务、Action行动、Result结果)来回答问题,使回答更加清晰、有条理。
- 深入原理:不仅要回答问题的表面答案,还要深入解释原理,展示自己的技术深度。
- 案例分享:结合实际项目经验,分享自己在项目中遇到的问题及解决方案,增强说服力。
10.3 面试后的复盘与提升
- 总结经验:面试后及时总结经验,分析自己的优点和不足,思考哪些问题回答得好,哪些问题回答得不够理想。
- 查漏补缺:针对面试中暴露的知识盲区,进行有针对性的学习和补充,完善自己的知识体系。
- 持续学习:技术在不断发展,保持持续学习的态度,关注行业动态和新技术,不断提升自己的技术水平。
文章中结合了Java 8/9/11/17/19等版本的新特性,以及Spring Boot 2.x、Spring Cloud Alibaba、MySQL 8等新技术,并给出了相应的实操代码和示例。你可以根据实际需求,深入学习和实践这些技术。
Java 面试题,阿里面试,Java 基础,Java 架构,面试通关,实操指南,Java 开发,面试技巧,Java 核心知识,架构设计,程序员面试,Java 高频考点,面试必备,Java 编程,阿里 Java 面试
资源地址:
https://pan.quark.cn/s/14fcf913bae6