java对象重用_JAVA:避免重复的创建对象
在實際開發(fā)中,重復(fù)使用同一個對象要比每次需要的時候就創(chuàng)建一個對象要好的多;
作為一個比較極端的反面例子,看下面這個語句:
String s = new String("haha");
改語句每次被執(zhí)行時都會創(chuàng)建一個新的String實例,如果這種用法是在一個循環(huán)中,或者是在一個被頻繁調(diào)用的方法中,將會有成千上萬個String實例被創(chuàng)建,這樣的做法是沒有必要的,可改進(jìn)成如下這樣:
String s = “haha”;
這個版本只使用一個String實例,而不是每次被執(zhí)行的時候都創(chuàng)建了一個實例。對于在同一個虛擬中,運行的代碼,只要包含相同的字符串字面常量,則改對象就會被重用。
除了重用非可變的對象外,對于那些已知不會被修改的可變對象,也是可以重用它們,看個比較常見的例子:
1 public classPerson{2 private finalDate birthDate;3
4 publicPerson(Date birthDate){5 this.birthDate =birthDate;6 }7
8 public booleanisBabyBoomer(){9 Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));10
11 gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);12 Date boomStart =gmtCal.getTime();13
14 gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);15 Date boomEnd =gmtCal.getTime();16
17 return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;18 }19
20 }
isBabyBoomer每次被調(diào)用的時候,都會創(chuàng)建一個新的Calendar, 一個新的TimeZone,兩個新的Date對象,這是不必要的,下面的版本使用一個靜態(tài)的初始化器,避免了上面例子的低效:
1 public classPerson{2 private finalDate birthDate;3
4 publicPerson(Date birthDate){5 this.birthDate =birthDate;6 }7
8 private static finalDate BOOM_START;9 private static finalDate BOOM_END;10
11 static{12 Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));13
14 gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);15 BOOM_START =gmtCal.getTime();16
17 gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);18 BOOM_END =gmtCal.getTime();19 }20
21 public booleanisBabyBoomer(){22 return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;23 }24
25 }
改進(jìn)版本的Person類僅在初始化時刻創(chuàng)建Calendar、TimeZone和Date實例一次,而不是在每次isBadyBoomer被調(diào)用的時候創(chuàng)建它們。
摘自Effective java
總結(jié)
以上是生活随笔為你收集整理的java对象重用_JAVA:避免重复的创建对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 插入排序 链表 java_JAVA单链表
- 下一篇: Java求n以内素数_求0到n之间素数个