六十、性能考慮,數(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)。