一个不可变的类会保存内存吗?

时间:2011-08-12 07:39:06

标签: java immutability

我自己实现的不可变类是否会节省内存?也就是说,如果两个引用需要引用相同的实例,即使有两个单独的尝试来分配对象,它们也将引用相同的实例。这是一个Java问题。

3 个答案:

答案 0 :(得分:4)

不是不变的,但是你的设计使两个引用引用相同的实例是“节省”内存。不变性与该决定无关。

答案 1 :(得分:1)

首先:如果你没有告诉我们将它与之进行比较,很难判断它是否能节省内存。

一般来说:不,不是自动的。不可变类不会自动保存内存,它们甚至可能导致内存压力增加,因为每次想要更改内容时都需要实例化一个新内存。

话虽如此,你可以从中获得一些内存节省,如果你分享很多实例:因为它们是不可变的你可以避免做一个防御性拷贝只是使用它。 可以提高内存使用率。

总而言之:通常,不可变类本身不会使用更多或更少的内存。实际节省的是你如何使用它们。

答案 2 :(得分:0)

你是混乱的概念。类是不可变的这一事实并不意味着您将“重用”以前的对象。

例如,如果我这样做

ImmutableClass myImmu = new ImmutableClass(5);
ImmutableClass myImmu2 = new ImmutableClass(5);

我创建了两个不同的对象(即使它们的equals()实现返回true)。

另一件事是池化/缓存,在这里你保存一个创建的实例列表,而不是调用构造函数,你调用一个Factory方法,它可以获得一个以前缓存的实例。不可变类更易于池/​​缓存,因为它们的状态仅取决于构造函数,因此您确定它没有更改。

private static Map<Integer, InmutableClass> pool = ...

public static InmutableClass getInstance(int param) {
  InmutableClass returnValue = pool.get(param);
  if (returnValue == null) {
    returnValue = new InmutableClass(param);
    pool.put(param, returnValue);
  }
  return returnValue;
}

当然,如果您的实例很少被重用,那么您最终将使用此架构使用更多内存。