2015-01-04 47 views
1

我做了一個小程序來保存我的X和Y值。這裏是我的代碼:內存分配一次或每次在java對象實例化

public class ChartData 
    { 
     private Object x, y; 

     public ChartData(Object x, Object y) 
     { 
      this.x = x; 
      this.y = y; 
     } 

     public Object getX() 
     { 
      return x; 
     } 

     public Object getY() 
     { 
      return y; 
     } 

     public boolean equals(Object obj) 
     { 
      if (obj != null && obj instanceof ChartData) 
      { 
       final ChartData other = (ChartData) obj; 
       if (this.getX().equals(other.getX()) && this.y == null && other.y == null) 
       { 
        return true; 
       } 
       else if (this.getX().equals(other.getX()) && this.y.equals(other.y)) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 

     public int hashCode() 
     { 
      int hashCode = getX().hashCode(); 
      hashCode = (y != null) ? hashCode + y.hashCode() : hashCode ; 
      return hashCode; 
     } 
    } 

我想總結的ChartData對象的值(即其持有X和Y值)。 例如: -

LinkedHashMap<ChartData, Object> datasource = new LinkedHashMap<ChartData, Object>(); 
     while(data.next()) 
     {    
      Object x = data.getValue(1); 
      Object y = data.getValue(2); 
      Double value = data.getValue(3); 
      ChartData cateVal = new ChartData(x, y); 
      Double currentValue = (Double) datasource.get(cateVal); 
      if(currentValue != null) 
      { 
       datasource.put(cateVal, currentValue + value); 
      } 
      else 
      { 
       datasource.put(cateVal, value); 
      } 
     } 

有機會創建一個新的對象相同的X和Y values.Is它實際上爲每個實例創建一個新的對象,否則它使用先前創建memory.Please給我解釋一下。

+2

我相信每次調用'new Xxxx()'時都會在堆上創建一個新對象。現在,如果你對這個對象的唯一引用是一個HashMap,並且它相當於已經在HashMap上的另一個對象,那麼我的直覺告訴我只有一個對象將駐留在Map上,另一個對象應該可用於垃圾收集/當需要出現時。 –

回答

1

您的HashMap密鑰,即ChartData cateVal = new ChartData(x, y);每次創建一個新對象 它被調用。

沒有自動內存管理,我不認爲有什麼辦法可以用HashMaps來解決這個問題,但是你不應該擔心,創建這樣的對象非常便宜。

我不知道一般情況下是否可以從(X,Y) - > Z得到一個映射,其中X和Y是任意對象,而不創建一個包含(X,Z)的對象。 Java中的地圖從單個對象到對象。如果X和Y是整數,或者可以映射爲整數,則可以創建一個由X和Y索引的數組Z [] []。在這種情況下,這意味着CharData中的x和y應該是整數,我假設你想要:

Object z = datasource[x][y]; 
if (z == null) { 
    z = new ChartData(x,y); 
    datasource[x][y] = z; 
} 
+0

謝謝阿里。有沒有機會減少對象的創建? – Sankar

+0

如果x和y可能很大,陣列會佔用很多空間。 – user949300

+0

@ user949300這是真的,數組還有另一個缺點:爲了初始化'datasource',最大值應該是已知的。但我想這是避免爲hashmap查找創建對象的唯一方法。 – Wickoo

1

如果x和y值是稀疏的,可能很大,比2D陣列更好的方法是需要的。

考慮一個Map<Integer, Map<Integer, ChartData>>作爲您的緩存。 非常骨架代碼:

Map ymap = xmap.get(theXCoordinate); 
if (ymap != null) 
    chartData = ymap.get(theYCoordinate); 

如果chartData是存在的,返回它,否則添加到緩存中創建並把內部地圖如果需要的話。

注意:除非你有很多重複ChartDatas,這可能會使用更多的內存,而不僅僅是創建重複項。現在讓讀者瞭解現在的截止位置。 :-)

V2:另一個想法我想以後:

創建Long牽着你的X和Y座標,並用其作爲重點爲Map<Long, ChartData>。如果您的xs和ys通常較小,您可以測試它們都小於2^16,並使用Integer代替。

+0

這很有趣。我想這種方法唯一的缺點是檢查空值,並啓動空映射。 – Wickoo

相關問題