2011-08-12 71 views
0

我自己實現的不可變類是否會節省內存?也就是說,如果兩個引用需要引用相同的實例,即使有兩次單獨的嘗試來分配對象,它們也會引用相同的實例。這是一個Java問題。將不可變類保存內存?

+0

如果你說'新',你分配新的對象。 JVM不會嘗試搜索現有對象並檢查是否完全相同。 –

+0

除了達到256的整數,如果我正確地記得] :) – SJuan76

+1

如果您使用新的Integer() - 否,它不會使用緩存。如果使用Integer.valueOf(),或者Integer i = 1(通過編譯器將其轉換爲Integer.valueOf()),則會進行隱式轉換。 – BegemoT

回答

4

不是不變的,但你的設計使兩個引用引用同一個實例就是「保存」內存。不變性獨立於該決定。

1

首先:很難判斷它是否能節省內存,如果你不告訴我們要比較的話。

一般:不,不會自動。不可變的類不會自動保存內存,它們甚至會導致內存壓力增加,因爲每次你想改變它時都需要實例化一個新內存。

話雖這麼說,你可以得到一些內存節省出來的,如果你共享實例很多:因爲它們是不可變的,你可以避免做一個防守副本,只是使用它。這可以改善內存使用情況。

所以總結一下:單獨的不可變類通常不會使用更多或更少的內存。實際節省的是你如何使用它們。

0

你是混淆概念。類不可變的事實並不意味着你將「重用」以前的對象。

舉例來說,如果我做

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

我已經創建了兩個不同的對象(即使他們實現平等的()返回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; 
} 

當然,如果你的實例很少被重用,你會在這個模式下使用更多的內存。