5 changed files with 111 additions and 0 deletions
Binary file not shown.
@ -0,0 +1,50 @@ |
|||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
public class Cache<K, V> { |
||||
|
private final Map<K, V> cache; |
||||
|
|
||||
|
public Cache() { |
||||
|
this.cache = new HashMap<>(); |
||||
|
} |
||||
|
|
||||
|
public void put(K key, V value) { |
||||
|
cache.put(key, value); |
||||
|
} |
||||
|
|
||||
|
public V get(K key) { |
||||
|
return cache.get(key); |
||||
|
} |
||||
|
|
||||
|
public boolean containsKey(K key) { |
||||
|
return cache.containsKey(key); |
||||
|
} |
||||
|
|
||||
|
public void remove(K key) { |
||||
|
cache.remove(key); |
||||
|
} |
||||
|
|
||||
|
public void clear() { |
||||
|
cache.clear(); |
||||
|
} |
||||
|
|
||||
|
public int size() { |
||||
|
return cache.size(); |
||||
|
} |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
Cache<String, Integer> studentCache = new Cache<>(); |
||||
|
|
||||
|
studentCache.put("张三", 18); |
||||
|
studentCache.put("李四", 20); |
||||
|
|
||||
|
System.out.println("张三的年龄:" + studentCache.get("张三")); |
||||
|
System.out.println("缓存是否包含王五:" + studentCache.containsKey("王五")); |
||||
|
|
||||
|
studentCache.remove("李四"); |
||||
|
System.out.println("移除李四后缓存大小:" + studentCache.size()); |
||||
|
|
||||
|
studentCache.clear(); |
||||
|
System.out.println("清空后缓存大小:" + studentCache.size()); |
||||
|
} |
||||
|
} |
||||
Binary file not shown.
@ -0,0 +1,46 @@ |
|||||
|
public class Pair<K, V> { |
||||
|
private K key; |
||||
|
private V value; |
||||
|
|
||||
|
public Pair(K key, V value) { |
||||
|
this.key = key; |
||||
|
this.value = value; |
||||
|
} |
||||
|
|
||||
|
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; |
||||
|
} |
||||
|
|
||||
|
public void swap() { |
||||
|
Object temp = key; |
||||
|
key = (K) value; |
||||
|
value = (V) temp; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "Pair{" + |
||||
|
"key=" + key + |
||||
|
", value=" + value + |
||||
|
'}'; |
||||
|
} |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
Pair<String, Integer> pair = new Pair<>("年龄", 20); |
||||
|
System.out.println("交换前:" + pair); |
||||
|
pair.swap(); |
||||
|
System.out.println("交换后:" + pair); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
为什么Java泛型不支持基本类型? |
||||
|
|
||||
|
核心原因是Java泛型的类型擦除机制,以及基本类型和引用类型的存储方式差异,具体分为以下几点: |
||||
|
|
||||
|
1. 类型擦除导致的兼容问题 |
||||
|
Java泛型在编译后会被擦除为 Object (或上界类型),而基本类型(如 int 、 double )不是 Object 的子类,无法直接赋值给 Object 。如果允许泛型使用基本类型,擦除后的代码会出现类型不匹配的问题。 |
||||
|
|
||||
|
2. 自动装箱/拆箱的本质 |
||||
|
虽然我们可以用 List<Integer> 间接实现“存储int”的效果,但这并不是直接支持基本类型,而是利用了自动装箱(autoboxing)机制:编译器会自动将 int 转换为 Integer (包装类),本质上存储的还是引用类型。 |
||||
|
|
||||
|
3. 内存模型差异 |
||||
|
基本类型存储在栈中,占用固定大小的内存(如 int 占4字节);而引用类型存储在堆中,栈中仅保存对象的引用。如果泛型直接支持基本类型,JVM需要为每个基本类型生成不同的类实现,会导致类爆炸,违背了泛型“一份代码,多种类型”的设计初衷。 |
||||
|
|
||||
|
4. 历史兼容考虑 |
||||
|
Java泛型是在JDK 1.5引入的,为了兼容之前的非泛型代码(如 ArrayList ),采用了擦除实现。如果直接支持基本类型,会打破这种向后兼容性,导致旧代码无法运行。 |
||||
Loading…
Reference in new issue