5 changed files with 131 additions and 0 deletions
@ -0,0 +1,18 @@ |
|||||
|
一、存在问题 |
||||
|
线程不安全 |
||||
|
底层使用HashMap,多线程环境下并发操作会导致数据丢失、死循环等问题。 |
||||
|
空值风险 |
||||
|
允许key和value为null,业务中易引发NullPointerException,且无法区分 “键不存在” 和 “值为 null”。 |
||||
|
无缓存淘汰机制 |
||||
|
数据永久驻留内存,无过期 / 清理策略,长期运行会造成内存泄漏。 |
||||
|
功能单一 |
||||
|
缺少判断键是否存在、获取所有键 / 值等实用方法。 |
||||
|
二、优化建议 |
||||
|
保证线程安全 |
||||
|
将HashMap替换为ConcurrentHashMap,无需加锁即可支持高并发。 |
||||
|
禁止空值存入 |
||||
|
在put方法中增加非空校验,拒绝null键 / 值。 |
||||
|
完善工具方法 |
||||
|
新增containsKey、isEmpty等方法,提升实用性。 |
||||
|
增加基础防御 |
||||
|
对get/remove传入null键时直接返回null,避免异常。 |
||||
@ -0,0 +1,62 @@ |
|||||
|
package com.homework; // 必须和你的项目包结构一致
|
||||
|
|
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
public class Cache<K, V> { |
||||
|
// 用 HashMap 存储键值对,key 和 value 都是泛型
|
||||
|
private Map<K, V> cacheMap; |
||||
|
|
||||
|
// 构造方法:初始化 HashMap
|
||||
|
public Cache() { |
||||
|
cacheMap = new HashMap<>(); |
||||
|
} |
||||
|
|
||||
|
// 存数据:把 key 和 value 放到缓存里
|
||||
|
public void put(K key, V value) { |
||||
|
cacheMap.put(key, value); |
||||
|
} |
||||
|
|
||||
|
// 取数据:根据 key 从缓存里拿 value
|
||||
|
public V get(K key) { |
||||
|
return cacheMap.get(key); |
||||
|
} |
||||
|
|
||||
|
// 删除数据:根据 key 删除缓存里的 value
|
||||
|
public void remove(K key) { |
||||
|
cacheMap.remove(key); |
||||
|
} |
||||
|
|
||||
|
// 清空缓存
|
||||
|
public void clear() { |
||||
|
cacheMap.clear(); |
||||
|
} |
||||
|
|
||||
|
// 获取缓存大小
|
||||
|
public int size() { |
||||
|
return cacheMap.size(); |
||||
|
} |
||||
|
|
||||
|
// 主方法:测试用
|
||||
|
public static void main(String[] args) { |
||||
|
// 创建缓存:key 是学生姓名(String),value 是分数(Integer)
|
||||
|
Cache<String, Integer> scoreCache = new Cache<>(); |
||||
|
|
||||
|
// 测试存数据
|
||||
|
scoreCache.put("小明", 90); |
||||
|
scoreCache.put("小红", 95); |
||||
|
System.out.println("缓存大小:" + scoreCache.size()); |
||||
|
|
||||
|
// 测试取数据
|
||||
|
System.out.println("小明的分数:" + scoreCache.get("小明")); |
||||
|
System.out.println("小红的分数:" + scoreCache.get("小红")); |
||||
|
|
||||
|
// 测试删除数据
|
||||
|
scoreCache.remove("小红"); |
||||
|
System.out.println("删除小红后,缓存大小:" + scoreCache.size()); |
||||
|
|
||||
|
// 测试清空缓存
|
||||
|
scoreCache.clear(); |
||||
|
System.out.println("清空后,缓存大小:" + scoreCache.size()); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,51 @@ |
|||||
|
package com.homework; // 你的包声明,必须和你的目录结构一致
|
||||
|
|
||||
|
public class Pair<K, V> { |
||||
|
private K key; |
||||
|
private V value; |
||||
|
|
||||
|
// 构造方法
|
||||
|
public Pair(K key, V value) { |
||||
|
this.key = key; |
||||
|
this.value = value; |
||||
|
} |
||||
|
|
||||
|
// Getter & Setter
|
||||
|
public K getKey() { |
||||
|
return key; |
||||
|
} |
||||
|
|
||||
|
public void setKey(K key) { |
||||
|
this.key = key; |
||||
|
} |
||||
|
|
||||
|
public V getValue() { |
||||
|
return value; |
||||
|
} |
||||
|
|
||||
|
public void setValue(V value) { |
||||
|
this.value = value; |
||||
|
} |
||||
|
|
||||
|
// 作业要求的 swap 方法:交换 key 和 value
|
||||
|
public Pair<V, K> swap() { |
||||
|
return new Pair<>(this.value, this.key); |
||||
|
} |
||||
|
|
||||
|
// 重写 toString,方便打印
|
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "key: " + key + ", value: " + value; |
||||
|
} |
||||
|
|
||||
|
// 主方法:测试用
|
||||
|
public static void main(String[] args) { |
||||
|
// 测试 Pair<String, Integer>
|
||||
|
Pair<String, Integer> pair = new Pair<>("年龄", 20); |
||||
|
System.out.println("交换前:" + pair); |
||||
|
|
||||
|
// 调用 swap 方法
|
||||
|
Pair<Integer, String> swappedPair = pair.swap(); |
||||
|
System.out.println("交换后:" + swappedPair); |
||||
|
} |
||||
|
} |
||||
|
After Width: | Height: | Size: 388 KiB |
|
After Width: | Height: | Size: 363 KiB |
Loading…
Reference in new issue