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