我使用与字符串实习生相同的想法在java中创建了一个实习生池。 简单地说,我维护一个
WeakHashMap<T, T>
每次当map包含该对象时,都会返回相同的对象,好处是可以节省java堆内存。 例如,我有一个像这样的 Person 类:
public Person() {
String name;
int age;
String employer;
@Override
public equals(Pbject obj) {
......
}
@Override
public hashCode() {
......
}
}
它没有使类唯一的字段(无主键)。 问题是,当我想检查 map 是否包含特定人员时,我需要先创建一个临时人员,以便 map.contains() 方法可以调用该人员的 equals() 方法。结果,当我运行profiler查看内存使用情况后,我可以看到GC收集了很多临时对象,这肯定会导致更多的GC和CPU使用。 有没有一种方法可以让我们在不创建太多临时对象的情况下实现实习生池的想法?
附:我从这篇文章中得到了实习生池的想法:Generic InternPool<T> in Java?
最佳答案
一个HashMap<T, T>
不是一个 Map,而是对您的 equals() 和 hashCode() 方法做了一些非常奇怪的事情。正如所评论的,创建临时的短期实例很便宜,因为垃圾收集器使用代。但你必须检查是否存在的是关键而不是对象本身。
关于Java 实习生池实现创建了太多临时对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56066761/