1. 程式人生 > >java物件的欄位/屬性中是基本型別的宣告為對應的包裝類的好處

java物件的欄位/屬性中是基本型別的宣告為對應的包裝類的好處

真實結果在末尾。

在寫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記憶體應該更少吧。。。確實是這樣,即使兩個欄位都佔用了記憶體,但是也比物件佔用要小得多。。,所以還是用回基本型別吧。。。