6 changed files with 157 additions and 0 deletions
@ -0,0 +1,9 @@ |
|||||
|
# AI协助学习记录 |
||||
|
1. Java泛型为什么不能使用基本类型 |
||||
|
泛型底层为类型擦除,编译后全部向上转为Object。 |
||||
|
基本数据类型不属于对象,无法转为Object,仅能使用包装类。 |
||||
|
|
||||
|
2. 泛型擦除后为何反射仍可以获取泛型 |
||||
|
运行时实例化的泛型会被完全擦除。 |
||||
|
书写在类、成员变量、方法上的泛型声明会保留在字节码中。 |
||||
|
依靠反射ParameterizedType即可读取原本泛型。 |
||||
@ -0,0 +1,74 @@ |
|||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
import java.util.concurrent.Executors; |
||||
|
import java.util.concurrent.ScheduledExecutorService; |
||||
|
import java.util.concurrent.TimeUnit; |
||||
|
public class Cache { |
||||
|
private final ConcurrentHashMap<Object,CacheNode> map; |
||||
|
private final long timeOut; |
||||
|
private ScheduledExecutorService thread; |
||||
|
//无参构造永久不过期
|
||||
|
public Cache(){ |
||||
|
this(0); |
||||
|
} |
||||
|
//有参构造设置过期时间
|
||||
|
public Cache(long timeOut){ |
||||
|
map = new ConcurrentHashMap<>(); |
||||
|
this.timeOut = timeOut; |
||||
|
//定时清理过期数据
|
||||
|
thread = Executors.newSingleThreadScheduledExecutor(); |
||||
|
thread.scheduleAtFixedRate(this::clearTimeOut,2,2,TimeUnit.SECONDS); |
||||
|
} |
||||
|
//存入缓存
|
||||
|
public void put(Object key,Object value){ |
||||
|
put(key,value,timeOut); |
||||
|
} |
||||
|
//自定义过期时间存放
|
||||
|
public void put(Object key,Object value,long ttl){ |
||||
|
long endTime = ttl == 0 ? Long.MAX_VALUE : System.currentTimeMillis()+ttl; |
||||
|
map.put(key,new CacheNode(value,endTime)); |
||||
|
} |
||||
|
//获取缓存
|
||||
|
public Object get(Object key){ |
||||
|
CacheNode node = map.get(key); |
||||
|
if(node == null){ |
||||
|
return null; |
||||
|
} |
||||
|
//判断是否过期
|
||||
|
if(System.currentTimeMillis()>node.endTime){ |
||||
|
map.remove(key); |
||||
|
return null; |
||||
|
} |
||||
|
return node.value; |
||||
|
} |
||||
|
//删除缓存
|
||||
|
public void remove(Object key){ |
||||
|
map.remove(key); |
||||
|
} |
||||
|
//清理过期数据
|
||||
|
private void clearTimeOut(){ |
||||
|
map.entrySet().removeIf(e->System.currentTimeMillis()>e.getValue().endTime); |
||||
|
} |
||||
|
//关闭线程防止资源泄露
|
||||
|
public void close(){ |
||||
|
thread.shutdown(); |
||||
|
} |
||||
|
//内部存储节点
|
||||
|
private static class CacheNode{ |
||||
|
Object value; |
||||
|
long endTime; |
||||
|
public CacheNode(Object value,long endTime){ |
||||
|
this.value = value; |
||||
|
this.endTime = endTime; |
||||
|
} |
||||
|
} |
||||
|
//测试运行
|
||||
|
public static void main(String[] args) throws InterruptedException { |
||||
|
//设置5秒过期
|
||||
|
Cache cache = new Cache(5000); |
||||
|
cache.put("学号","2026001"); |
||||
|
System.out.println("存入立刻获取:"+cache.get("学号")); |
||||
|
Thread.sleep(6000); |
||||
|
System.out.println("6秒后获取(已过期):"+cache.get("学号")); |
||||
|
cache.close(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
import java.lang.reflect.Field; |
||||
|
import java.lang.reflect.ParameterizedType; |
||||
|
import java.lang.reflect.Type; |
||||
|
import java.util.List; |
||||
|
public class GenericReflect { |
||||
|
private List<String> list; |
||||
|
public static void main(String[] args) throws NoSuchFieldException { |
||||
|
//利用反射获取被擦除的泛型
|
||||
|
Field field = GenericReflect.class.getDeclaredField("list"); |
||||
|
Type type = field.getGenericType(); |
||||
|
if(type instanceof ParameterizedType){ |
||||
|
ParameterizedType parameterizedType = (ParameterizedType) type; |
||||
|
System.out.println("获取到的泛型类型:"+parameterizedType.getActualTypeArguments()[0]); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
public class Pair { |
||||
|
private Object key; |
||||
|
private Object value; |
||||
|
public Pair(Object key, Object value) { |
||||
|
this.key = key; |
||||
|
this.value = value; |
||||
|
} |
||||
|
//交换键值
|
||||
|
public Pair swap(){ |
||||
|
return new Pair(value,key); |
||||
|
} |
||||
|
public Object getKey(){ |
||||
|
return key; |
||||
|
} |
||||
|
public Object getValue(){ |
||||
|
return value; |
||||
|
} |
||||
|
@Override |
||||
|
public String toString() { |
||||
|
return "键:"+key+" 值:"+value; |
||||
|
} |
||||
|
public static void main(String[] args) { |
||||
|
Pair p1 = new Pair("姓名","张三"); |
||||
|
System.out.println("交换前:"+p1); |
||||
|
Pair p2 = p1.swap(); |
||||
|
System.out.println("交换后:"+p2); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
\# Java泛型作业 |
||||
|
|
||||
|
 文件功能 |
||||
|
|
||||
|
 1. Pair.java:泛型键值对,实现键值交换 |
||||
|
|
||||
|
 2. Cache.java:泛型缓存,支持过期自动清理、线程安全 |
||||
|
|
||||
|
 3. GenericReflect.java:反射获取被擦除的泛型 |
||||
|
|
||||
|
|
||||
|
|
||||
|
 编译运行命令 |
||||
|
|
||||
|
 编译 |
||||
|
|
||||
|
 javac Pair.java |
||||
|
|
||||
|
 javac Cache.java |
||||
|
|
||||
|
 javac GenericReflect.java |
||||
|
|
||||
|
 运行 |
||||
|
|
||||
|
 java Pair |
||||
|
|
||||
|
 java Cache |
||||
|
|
||||
|
 java GenericReflect |
||||
|
|
||||
|
After Width: | Height: | Size: 79 KiB |
Loading…
Reference in new issue