《編寫高質(zhì)量Java》(七)

六十、性能考慮,數(shù)組是首選

基本類型是在棧內(nèi)存中操作的,而對象則是在對內(nèi)存中操作的。棧內(nèi)存的特點是速度快,容量小,對內(nèi)存的特點是速度慢,容量大。
注意:性能要求較高的場景中使用數(shù)組替代集合。

六十一、若有必要,使用變長數(shù)組

數(shù)組擴(kuò)容代碼如下:

public static <T> T[] expandCapacity(T[] datas, int newLen){
    newLen = newLen < 0 ? 0 : newLen;

    return Arrays.copyOf(datas, newLen); 
}

六十二、 警惕數(shù)組的淺拷貝

通過copyOf產(chǎn)生的數(shù)組是一個淺拷貝,這與序列化的淺拷貝完全相同:基本類型是直接拷貝值,其他都是拷貝引用地址。需要說明的是數(shù)組的clone方法也是與此相同,也都是淺拷貝,集合的clone方法也都是淺拷貝。

六十三、在明確的場景下,為集合指定初始容量

ArrayList初始長度為10,當(dāng)容量不夠用時則自動擴(kuò)容,每次擴(kuò)充1.5倍。
Vector則提供了遞增步長,代表每次數(shù)組擴(kuò)容時要增加的長度,不設(shè)置此值則是容量翻倍。

六十四、多種最值算法,適時選擇

求最大值為例,可以有兩種方法:

  • 自行實現(xiàn),快速查找最大值
  • 先排序,后取值。

但是如果要查找僅次于最大值的元素,該如何處理呢?要注意,數(shù)組的元素是可以重復(fù)的,最大值可能有多個。這時就需要一個特殊的排序算法了,先要剔除重復(fù)數(shù)據(jù),然后再排序。數(shù)組不能剔除重復(fù)數(shù)據(jù),但是Set集合可以,而且Set集合的子類TreeSet還能自動排序。代碼如下:

public static int getSecond(Integer[] data){
    List<Integer> dataList = Arrays.asList(data);
    TreeSet<Integer> ts = new TreeSet<Integer>(dataList);
    return ts.lower(ts.last());
}

注意:最值計算時,使用集合最簡單,使用數(shù)組性能最優(yōu)。

六十五、避開基本類型數(shù)組轉(zhuǎn)換列表陷阱

原始類型數(shù)組不能作為asList的輸入?yún)?shù),否則會引起程序邏輯混亂。

六十六、asList方法產(chǎn)生的List對象不可更改

六十七、不同的列表選擇不同的遍歷方法

列表遍歷不是那么的簡單,其中很有“學(xué)問”, 適時選擇最優(yōu)的遍歷方式,不要固話為一種。

六十八、 頻繁插入和刪除時用LinkedList

在修改操作上,LinkedList要比ArrayList要慢很多,特別是要進(jìn)行大量的修改時,兩者完全不在一個數(shù)量級上 。其底層是數(shù)組實現(xiàn)的。
LinkedList刪除和插入效率高,因為其底層是雙向鏈表實現(xiàn)的。
兩者在增加元素上基本上沒有什么區(qū)別。

六十九、列表相等只需關(guān)心元素數(shù)據(jù)

只要所有的元素相等,并且長度也相等就表明兩個List是相等的,與具體容量類型無關(guān)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容