Java 实习生池实现创建了太多临时对象

标签 java flyweight-pattern

我使用与字符串实习生相同的想法在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/

相关文章:

java - 在 Java 中,如果我的程序在没有 -ea 的情况下运行,我怎么会失败?

java - 享元设计模式如何维护不同的对象?

java - 那里有任何 Java 享元模式实现吗?

c++ - 我们可以使用子字符串的 const ref 吗?

java - Spring WebSocket 从服务器发送多个对值消息

java - 从为父类(super class)创建的链表中插入和提取子类

java - 如何从没有空格的字符串中提取某些特殊字符之间的所有单词?

java - 如果写入/关闭被对等方关闭的 java.net.Socket 会发生什么?

java - 状态和享元模式

java - 什么对创建对象的时间影响最大​​?