Effective Java之避免建立不必要的物件(五)
阿新 • • 發佈:2019-02-20
1.對於不可變類(immutable),他始終可以被重用。
如:String類
String s = new String(“string”);
這種方法建立了兩個String物件,因為傳入String構造器的引數本身就是一個String例項,new再建立一個物件,由s指向它,事實上這樣做浪費了兩倍記憶體。
所以應該這樣:
String s = “string”;
又如:Integer類等包裝類
Integer比較特殊,也是面試中坑點之一:
先來看一個簡單的例子:
Integer i1 = new Integer(127)
Integer i2 = new Integer (127)
Integer i3 = 127
System.out.println(i1 == i2);
System.out.println(i1 == i3);
這兩個判斷跟String原理一樣,都是false;
再來
int i1 = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println(i1 == i2);
System.out.println(i1 == i3);
答案都是true,很簡單,基本型別和裝箱型別比較,裝箱型別會自動拆箱,兩個int比較當然是true。
最後一波坑
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2);
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);
答案第一個true,第二個false,原因是Integer常量池只存了-128-127的數,所以Integer i3 = 128,相當於建立了一個新的Integer物件!
2.除了重用不可變物件,還可以重用那些不可修改的可變物件。
比如jdbc的driver,connection中,如果你在每個sql操作中,都建立新的物件,那麼代價回非常非常大。
常用的解決方法是把這些不可修改的可變物件放在靜態程式碼塊中或者構造方法中。其實就是餓漢式載入和懶漢式載入的問題。jdbc採用的是維護一個
3.避免建立不必要的物件不等於避免建立物件
對於現代jvm來說,對於小物件的回收和建立的動作是非常廉價的,建立小的物件來提升程式清晰性,簡潔性,通常是好事。
有的人為了避免建立物件,維護自己的物件池,需要時只需要從物件池中取出,這樣避免了建立很多物件。但是這種方法通常不可行,通常會把程式碼弄的難以理解,難以維護,有時候還不如jvm直接建立回收來的快。
但是jdbc的連線執行緒池不同,每個資料庫連線都是非常珍貴的,重用這些物件價值很大。