小公司初面---java后端题目

1.目前有一个person类 他有两个属性 Interger id String name 现在想要通过id相同判断是否为同一个person 要怎么重写方法

import java.util.Objects;

public class Person {

private Integer id;

private String name;

// 构造方法、getter和setter省略...

@Override

public boolean equals(Object o) {

// 1. 如果两个对象是同一个引用,直接返回true

if (this == o) {

return true;

}

// 2. 如果传入对象为null,或者两个对象的类不同,返回false

if (o == null || getClass() != o.getClass()) {

return false;

}

// 3. 类型转换,比较核心字段 id

Person person = (Person) o;

// 使用 Objects.equals 可以安全地处理 id 为 null 的情况

return Objects.equals(id, person.id);

}

@Override

public int hashCode() {

// 使用 Objects.hash 方法生成哈希码,同样能处理字段为 null 的情况

// 注意:这里只使用了 id 字段,因为equals方法只比较了id

return Objects.hash(id);

}

}

2.?name='小明'&age=12 请问controller要怎么把他封装进user类中

@GetMapping("/user")

public User getUser(@RequestParam String name, @RequestParam Integer age) {

User user = new User();

user.setName(name);

user.setAge(age);

return user;

}

// URL: /user/123/小明

@GetMapping("/user/{id}/{name}")

public User getUser(@PathVariable Integer id, @PathVariable String name) {

User user = new User();

user.setId(id);

user.setName(name);

return user;

}

3.现在有个list里面有一百万条数据,现在需要实现一个分片处理方法,每一批分片可以有100条数据,<T> cutMessage(List<T> Message,Consumer<List> action) 请根据题目解答问题

public class BatchProcessor {

/**

* 分片处理方法

* @param message 原始数据列表

* @param action 对每个分片执行的操作

* @param <T> 数据类型

*/

public static <T> void cutMessage(List<T> message, Consumer<List<T>> action) {

if (message == null || message.isEmpty()) {

return;

}

int batchSize = 100; // 每批大小

int totalSize = message.size();

for (int i = 0; i < totalSize; i += batchSize) {

// 计算当前批次的结束位置

int endIndex = Math.min(i + batchSize, totalSize);

// 获取当前批次的数据

List<T> batch = message.subList(i, endIndex);

// 由于subList返回的是原列表的视图,为避免并发问题,创建新列表

List<T> batchCopy = new ArrayList<>(batch);

// 对当前批次执行操作

action.accept(batchCopy);

}

}

}

4.A与B相互注入对方,创建成功是因为什么,流程是什么,如果选择构造器注入,还能成功吗

创建流程

Spring三级缓存无法解决构造器注入的循环依赖,因为:

  1. 实例化A:Spring容器调用A的默认构造器创建A对象(此时A的属性b=null)

  2. 将A放入三级缓存:将A的早期引用(未完成属性填充的A)放入三级缓存

  3. 填充A的属性:尝试为A的b属性注入B

  4. 发现需要B ​ → 开始实例化B:调用B的默认构造器创建B对象

  5. 将B放入三级缓存:将B的早期引用放入三级缓存

  6. 填充B的属性:尝试为B的a属性注入A

  7. 从三级缓存中获取A:找到步骤2中放入的A的早期引用

  8. 完成B的属性填充:将A的早期引用注入到B的a属性

  9. 将B放入一级缓存:完成B的初始化

  10. 返回B给A:将完整的B实例注入到A的b属性

  11. 完成A的属性填充将A放入一级缓存

复制代码
**@Component
public class A {
private final B b;
@Autowired
public A(B b) { // 构造器注入
this.b = b;
}
}**

**@Component
public class B {
private final A a;
@Autowired
public B(A a) { // 构造器注入
this.a = a;
}
}**
复制代码
**构造器注入会失败的原因**:
  1. 创建A时需要B:Spring在创建A的实例时,必须先将B作为参数传入构造器

  2. 创建B时需要A:但创建B的实例时,又需要先将A作为参数传入构造器

  3. 形成死锁:A等B创建,B等A创建,形成"鸡生蛋,蛋生鸡"的问题

  4. Spring抛出异常BeanCurrentlyInCreationException

  5. 构造器注入在实例化阶段就需要完整的依赖对象

  6. 而字段/Setter注入是在实例化之后才进行属性填充

  7. Spring的三级缓存只能在属性填充阶段解决循环依赖

5.现在有一个电商系统,订单状态有待支付,已支付,未支付,待取货,已取货,已取消,状态之中(除了已取消)只有待支付,已支付可以跳转到已取消,其他的状态就从左往右按顺序转变,那么现在请生成一个返回boolean的方法,判断传入的原始状态能否转变成目标状态,如果项目以后扩展了订单状态,那又要怎么办呢 根据问题解答

public enum OrderStatus {

UNPAID("待支付"),

PAID("已支付"),

PAYMENT_FAILED("未支付"),

PICKUP_PENDING("待取货"),

PICKED_UP("已取货"),

CANCELLED("已取消");

private final String description;

OrderStatus(String description) {

this.description = description;

}

}

public class OrderStatusValidator {

/**

* 验证订单状态是否可以流转

* @param source 原始状态

* @param target 目标状态

* @return 是否可以流转

*/

public static boolean canTransition(OrderStatus source, OrderStatus target) {

// 相同状态不能流转

if (source == target) {

return false;

}

// 已取消是终止状态,不能从已取消转到其他状态

if (source == OrderStatus.CANCELLED) {

return false;

}

// 正常的从左到右顺序流转

OrderStatus[] normalFlow = {

OrderStatus.UNPAID,

OrderStatus.PAID,

OrderStatus.PAYMENT_FAILED,

OrderStatus.PICKUP_PENDING,

OrderStatus.PICKED_UP

};

// 检查是否在正常流转路径中

for (int i = 0; i < normalFlow.length; i++) {

if (source == normalFlow[i]) {

// 在当前状态之后的所有状态都可以流转

for (int j = i + 1; j < normalFlow.length; j++) {

if (target == normalFlow[j]) {

return true;

}

}

break;

}

}

// 特殊规则:只有待支付和已支付可以跳转到已取消

if (target == OrderStatus.CANCELLED) {

return source == OrderStatus.UNPAID || source == OrderStatus.PAID;

}

return false;

}

}

本道题不展示优化后的代码,较复杂,可以将此问题发给ai自己查看

6.pubulic String readFile(String path){

return new BufferedReader(new FileReader(paht)).readline();

}这段代码运行久了以后,会报too many file的错误,请指出这段代码的错误,并改正代码

  • 没有关闭资源BufferedReader和底层的FileReader都没有被关闭

  • 文件描述符泄露:每次调用都会打开新的文件描述符但不关闭

  • 异常处理缺失:如果读取文件时发生异常,资源永远不会被关闭

public String readFile(String path) {

BufferedReader reader = null;

try {

reader = new BufferedReader(new FileReader(path));

return reader.readLine();

} catch (IOException e) {

e.printStackTrace();

return null;

} finally {

// 确保资源被关闭

if (reader != null) {

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

7.现在让你设计一个任务,这个任务每次最多同时处理四个用户,每个用户要做完至少三个子任务(上传头像等)才可以注册,不管是否成功,以最快的速度存入数据库

这里不张贴代码,ai生成的东西太多,可以自行查阅

相关推荐
鸿乃江边鸟2 小时前
Rust 的 mod(模块) 说明
开发语言·后端·rust
乄bluefox2 小时前
Redis Pipeline 实战:Spring Data Redis 批量写入最佳实践
java·redis·spring
敲代码的嘎仔2 小时前
Java后端开发——基础面试题汇总
java·开发语言·笔记·后端·学习·spring·中间件
Albert Edison2 小时前
【ProtoBuf 语法详解】enum 类型
java·linux·服务器
赵谨言2 小时前
基于YOLOv5的火灾检测研究是当前计算机视觉和消防安全领域的重要研究方向
大数据·开发语言·经验分享·python
前端 贾公子2 小时前
@uni-helper 社区:让 uni-app 拥抱 ESM 时代
开发语言·前端·javascript
弈风千秋万古愁2 小时前
常见配置文件-AI辅助
开发语言·python
不知名。。。。。。。。2 小时前
仿muduo库实现高并发服务器-----Channel模块 和 Poller模块
开发语言·前端·javascript
Singe.Chen2 小时前
C# 配置文件加密解密:最简便的实现方案
开发语言·网络协议·c#·信息与通信