当前位置: 首页 > news >正文

算法题目记录

数据空间研究院-后端试题

  • 题目一:线程安全的链表
    • 描述:
    • 实现
    • 题目二:自定义注解与反射
      • 描述:
      • 实现
    • 题目三:简化的消息队列
      • 描述
      • 实现

题目一:线程安全的链表

描述:

实现一个线程安全的链表类 ThreadSafeLinkedList,支持以下操作:

  1. add(T element) - 在链表末尾添加元素。
  2. remove(T element) - 移除链表中的指定元素。
  3. contains(T element) - 检查链表中是否包含指定元素。
    要求:
    • 使用 Java 内置的同步机制实现线程安全。
    • 不能使用 Java 内置的同步容器类(如 Collections.synchronizedList 或 CopyOnWriteArrayList)。

实现

package threadsafelist;import java.util.Objects;/*** 实现一个线程安全的链表类 threadsafelist.ThreadSafeLinkedList,支持以下操作:* 1.	add(T element) - 在链表末尾添加元素。* 2.	remove(T element) - 移除链表中的指定元素。* 3.	contains(T element) - 检查链表中是否包含指定元素。* @param <T>*/
public class ThreadSafeLinkedList<T> {private static class Node<T> {T value;Node<T> next;Node(T value) {this.value = value;}}private final Node<T> head;private final Node<T> tail;public ThreadSafeLinkedList() {head = new Node<>(null);tail = new Node<>(null);head.next = tail;}public synchronized void add(T element) {Node<T> newNode = new Node<>(element);Node<T> current = head;while (current.next != tail) {current = current.next;}current.next = newNode;newNode.next = tail;}public synchronized boolean remove(T element) {Node<T> prev = head;Node<T> current = head.next;while (current != tail) {if (Objects.equals(element, current.value)) {prev.next = current.next;return true;}prev = current;current = current.next;}return false;}public synchronized boolean contains(T element) {Node<T> current = head.next;while (current != tail) {if (Objects.equals(element, current.value)) {return true;}current = current.next;}return false;}
}

测试代码

import threadsafelist.ThreadSafeLinkedList;public class Main {public static void main(String[] args) {ThreadSafeLinkedList<String> list = new ThreadSafeLinkedList<>();// 线程1添加元素new Thread(() -> {list.add("A");list.add("B");}).start();// 线程2检查元素new Thread(() -> {System.out.println(list.contains("A")); // 可能输出true或false}).start();}}

执行结果

“true”

题目二:自定义注解与反射

描述:

编写一个自定义注解 @LogExecutionTime,并实现一个注解处理器,当标记有该注解的方法被调用时,记录方法的执行时间并输出。
要求:

  1. 创建 @LogExecutionTime 注解。
  2. 编写一个代理类或使用 AOP(如 Spring AOP)来拦截方法调用,记录并输出方法执行时间。
  3. 提供一个示例类和方法,展示注解的实际应用效果。
  4. 需要考虑跨线程透传问题

实现

功能代码如下:

package anotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}
package anotation;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;public class PerformanceHandler implements InvocationHandler {private final Object target;private static final ConcurrentMap<String, Long> methodStats = new ConcurrentHashMap<>();public PerformanceHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//获取当前时间long start = System.currentTimeMillis();try {return method.invoke(target, args);} finally {long end = System.currentTimeMillis();//计算执行时间long executionTime = end - start;// 获取方法签名String methodSignature = method.getDeclaringClass().getName() + "." + method.getName();// 记录当前方法执行时间methodStats.put(methodSignature, executionTime);// 输出执行时间(支持跨线程)System.out.printf("[%s] Method %s executed in %d ms%n", // ms 而不是 nsThread.currentThread().getName(),methodSignature,executionTime);}}public static Map<String, Long> getMethodStats() {return new HashMap<>(methodStats);}
}

测试代码如下:

package anotation;import java.lang.reflect.Proxy;public class ProxyFactory {public static <T> T createProxy(Class<T> interfaceClass, T target) {Object proxy = Proxy.newProxyInstance(interfaceClass.getClassLoader(),new Class<?>[]{interfaceClass},new PerformanceHandler(target));// 运行时类型检查if (interfaceClass.isInstance(proxy)) {return interfaceClass.cast(proxy);}throw new ClassCastException("Generated proxy does not implement interface: " + interfaceClass.getName());}
}
package anotation;public interface ExampleService {void processData();String fetchData(String key);
}
package anotation;public class ExampleServiceImpl implements ExampleService{@Override@LogExecutionTimepublic void processData() {try {Thread.sleep(500); // 模拟处理耗时} catch (InterruptedException e) {Thread.currentThread().interrupt();}}@Override@LogExecutionTimepublic String fetchData(String key) {try {Thread.sleep(200); // 模拟网络请求} catch (InterruptedException e) {Thread.currentThread().interrupt();}return "Data for " + key;}
}
package anotation;public class Main {public static void main(String[] args) throws InterruptedException {ExampleService service = ProxyFactory.createProxy(ExampleService.class, new ExampleServiceImpl());// 主线程调用service.processData();// 多线程调用Thread thread1 = new Thread(() -> service.fetchData("key1"));Thread thread2 = new Thread(() -> service.fetchData("key2"));thread1.start();thread2.start();thread1.join();thread2.join();// 查看统计数据System.out.println("\nMethod execution statistics:");PerformanceHandler.getMethodStats().forEach((k, v) ->System.out.printf("Method %s last time: %d ms%n", k, v));}
}

执行结果:

[main] Method anotation.ExampleService.processData executed in 504 ms
[Thread-2] Method anotation.ExampleService.fetchData executed in 213 ms
[Thread-1] Method anotation.ExampleService.fetchData executed in 213 ms
Method execution statistics:
Method anotation.ExampleService.processData last time: 504 ms
Method anotation.ExampleService.fetchData last time: 213 ms

题目三:简化的消息队列

描述

实现一个简化的消息队列类 SimpleMessageQueue,支持以下操作:

  1. send(T message) - 发送消息。
  2. receive() - 接收消息,若队列为空,阻塞直到有消息可接收。
    要求:
    • 使用 java.util.concurrent 包中的工具类来实现。
    • 需要保证 send 和 receive 操作的线程安全。
    • 提供单元测试,验证消息队列的正确性。

实现

功能代码

package simplemessagequeue;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;public class SimpleMessageQueue<T> {private final BlockingQueue<T> queue = new LinkedBlockingQueue<>();// 发送消息public void send(T message) {try {queue.put(message);} catch (InterruptedException e) {Thread.currentThread().interrupt();throw new RuntimeException("Send interrupted", e);}}// 接收消息,若队列为空则阻塞public T receive() {try {return queue.take();} catch (InterruptedException e) {Thread.currentThread().interrupt();throw new RuntimeException("Receive interrupted", e);}}
} 

测试代码

package simplemessagequeue;public class SimpleMessageQueueTest {public static void main(String[] args) throws InterruptedException {SimpleMessageQueue<String> queue = new SimpleMessageQueue<>();// 测试单线程收发queue.send("hello");assert "hello".equals(queue.receive());// 测试多线程收发Thread sender = new Thread(() -> {for (int i = 0; i < 5; i++) {queue.send("msg" + i);}});Thread receiver = new Thread(() -> {for (int i = 0; i < 5; i++) {String msg = queue.receive();System.out.println("Received: " + msg);}});sender.start();receiver.start();sender.join();receiver.join();System.out.println("All tests passed.");}
} 

运行结果

Received: hello
Received: msg0
Received: msg1
Received: msg2
Received: msg3
All tests passed.

http://www.dtcms.com/a/266466.html

相关文章:

  • OTC机器人焊机节气设备
  • EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
  • web3钱包的运作原理
  • Type-C PD快充协议智能芯片S312L详解
  • GO 语言学习 之 结构体
  • mysql索引:索引应该选择哪种数据结构 B+树 MySQL中的页 页主体 页目录 索引分类
  • C++学习笔记一
  • Mac获取终端历史
  • Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
  • Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
  • Rust+Blender:打造高性能游戏引擎
  • 宽表设计(Wide Table) 与 子表 + 类型 + 属性表设计(EAV 模型或“属性表”模型)
  • golang 中当 JSON 数据缺少结构体(struct)中定义的某些字段,会有异常吗
  • 【Modbus学习笔记】stm32实现Modbus
  • 类图+案例+代码详解:软件设计模式----单例模式
  • AI智能体革命:从ChatGPT到自主决策的技术演进
  • 143.在 Vue 3 中使用 OpenLayers 调节地图的明亮度、对比度、饱和度
  • 焊接机器人结构设计cad【16张】三维图+设计说明书+绛重
  • (超详细)数据库项目初体验:使用C语言连接数据库完成短地址服务(本地运行版)
  • C++11 forward_list 从基础到精通:原理、实践与性能优化
  • 【C++】list 简介与模拟实现(详解)
  • TM56M152A 十速工业级32位闪存MCU控制器芯片 外设接口+硬件加密引擎
  • 跨平台ZeroMQ:在Rust中使用zmq库的完整指南
  • JDK8升级为JDK21
  • error MSB8041: 此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。
  • CSS之布局详解指南
  • 深度学习洪水推演:Python融合多源卫星数据可视化南方暴雨灾情
  • bpftrace统计mmap调用时延
  • 应急响应靶场——web3 ——知攻善防实验室
  • 怎么限制某些IP访问服务器?