java物件的欄位/屬性中是基本型別的宣告為對應的包裝類的好處
阿新 • • 發佈:2019-02-14
真實結果在末尾。
在寫CRF/條件隨機場時由於遇到這樣一個問題,聲明瞭一個物件,其中的2個欄位都是int,但是現在的需求時我只需要其中一個欄位賦值,另外一個不賦值,由於宣告的是基本型別,所以無論賦不賦值都會佔用記憶體,不要小瞧這點記憶體,由於我頻繁使用這個物件,有時候記憶體中達到上千萬個這樣的物件,這樣下來白白浪費了很多記憶體,於是想到宣告為Integer,物件可以為null,基本不佔用啥記憶體,於是做了下面的測試:
@Test public void t1() { int iter = 10000000; //測試佔用記憶體308mb //SequenceNode[] emptyNodes = new SequenceNode[iter];//屬性都為null //測試佔用471mb //SequenceNode[] nodesOblyHaveNodeIndex = new SequenceNode[iter];//屬性只有nodeIndex有值 //測試佔用940mb SequenceNode[] nodesWithAllValue = new SequenceNode[iter];//屬性全部有值 for(int i = 0 ; i < iter; i++) { //emptyNodes[i] = new SequenceNode(); //nodesOblyHaveNodeIndex[i] = new SequenceNode(i); nodesWithAllValue[i] = new SequenceNode(i, i); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }
宣告為Integer後只對其中部分欄位賦值,而其他欄位為null,記憶體佔用小得多,記憶體佔用的情況我直接看的windows中的程序佔用記憶體,至少測試了2次,應該有一定的準確性。
有人可能說了,你欄位直接都用int記憶體應該更少吧。。。確實是這樣,即使兩個欄位都佔用了記憶體,但是也比物件佔用要小得多。。,所以還是用回基本型別吧。。。