1
0

更新 Java_3-5.md

This commit is contained in:
8ga 2025-09-11 10:10:26 +08:00
parent 58d7e4017c
commit 3b7b25e851

View File

@ -1,7 +1,5 @@
### 问题1考察多线程
**问题内容**
假设你现在需要写1个电商APP的用户订单详情接口这个详情页包含
- 关联的商品信息,比如商品名称、尺码、图片、文字介绍等等
@ -22,37 +20,14 @@
> 如果没反应过来,引导一下:比如说用 CompletableFuture、Future 或者 FutureTask 说一下关键,要调用哪几个函数。
```
Runnable task1 = () -> System.out.println("Task 1");
Runnable task2 = () -> System.out.println("Task 2");
Runnable task3 = () -> System.out.println("Task 3");
```
<p style="color: green">
方案一、使用 CompletableFuture 的 runAsync 函数包装3个task。再通过 allOf 函数添加3个task调用 get 函数阻塞等待3个任务执行完毕。
</p>
```
CompletableFuture<Void> cf1 = CompletableFuture.runAsync(task1);
CompletableFuture<Void> cf2 = CompletableFuture.runAsync(task2);
CompletableFuture<Void> cf3 = CompletableFuture.runAsync(task3);
CompletableFuture.allOf(cf1, cf2, cf3).get();
```
<p style="color: green">
方案二、使用Future把3个task提交给1个自定义线程池并接收Future对象再使用get函数等待3个任务执行完毕
</p>
```
ExecutorService executor = Executors.newFixedThreadPool(3);
Future<Void> f1 = executor.submit(task1);
Future<Void> f2 = executor.submit(task2);
Future<Void> f3 = executor.submit(task3);
f1.get();
f2.get();
f3.get();
```
**如果回答的是CompletableFuture继续延伸以下问题**
<p style="color: red">CompletableFuture的默认线程池是什么</p>
@ -63,3 +38,15 @@ f3.get();
<p style="color: green">答案自定义一个IO密集型的线程池</p>
### 问题2考察对Mybatis-Plus或者Mybatis框架的熟练度
假设现在需要针对用户表里的**手机号、身份证号码**加密存储,业务上还需要根据*手机号后4位*和*身份证号后6位*的筛选。
<p style="color: red">
提问:请基于 Spring Boot 和 Mybatis 或 Mybatis Plus说一下*手机号*和*身份证号*写入时加密,查询时解密,并且支持*手机号后4位*和*身份证号后6位*的筛选的实现思路。
</p>
<p style="color: green">
答案:声明一个自定义注解,修饰实体类里的*手机号和身份证号码*。
创建一个类,实现 Mybatis Plus 的 MetaObjectHandler 接口,覆写 **insertFill****updateFill** 处理数据的加密。
再创建一个类,实现 Mybatis 的 Interceptor 接口,拦截 ResultSetHandler 的 handleResultSets 函数,处理数据的解密。
</p>