ArrayList就是動態數組,也是一個對象。
創建一個ArrayList對象,該對象存放在堆內存中,且是一個內存連續的內存區域。
1、ArrayList是用數組實現的,這個數組的內存是連續的,不存在相鄰元素之間還隔着其他內存。
2、索引ArrayList時,速度比原生數組慢是因為你要用get方法,這是一個函數調用,而數組直接用[ ]訪問,相當於直接操作內存地址,速度當然比函數調用快。
3、新建ArrayList的時候,JVM為其分配一個默認或指定大小的連續內存區域(封裝為數組)。
4、每次增加元素會檢查容量,不足則創建新的連續內存區域(大小等於初始大小+步長),也用數組形式封裝,並將原來的內存區域數據復制到新的內存區域,
然后再用ArrayList中引用原來封裝的數組對象的引用變量引用到新的數組對象:
elementData = Arrays.copyOf(elementData, newCapacity);
5.集合的訪問方式:
java集合類中元素的訪問分為隨機訪問和順序訪問。
隨機訪問一般是通過index下標訪問,行為類似數組的訪問。
而順序訪問類似於鏈表的訪問,通常為迭代器遍歷。
以List接口及其實例為例。ArrayList是典型的隨機訪問型,而LinkedList則是順序訪問型。
List接口既定義了下標訪問方法又定義了迭代器方法。
所以其實例既可使用下標隨機訪問也可以使用迭代器進行遍歷。但這兩種方式的性能差異很明顯。
ArrayList和LinkedList隨機訪問的區別
ArrayList是數組結構,隨機訪問具有常量時間。
LinkedList是鏈表結構,隨機訪問分為兩步:
- 首先根據index查找Node,通常是一個for循環查找index對應的Node
- 然后返回Node中存儲的元素
ArrayList的下標遍歷性能遠高於LinkedList的下標遍歷。
總結:ArrayList 查詢快,增刪慢;LinkedList查詢慢,增刪快。
將list集合作為一個數據源轉為其他類型的集合;jdk1.8的新特性list.stream();
使用源調用方法collect(Collector<? super T,A,R> collector),使用Collector對此流的元素
執行mutable reduction Collector ;例如:
Map<String, ThirdHotelExpandInfoTemp> dbMap = dbList.stream().collect(
Collectors.toMap( a -> a.getSourceId()+":"+a.getThirdHotelId(), a -> a) );
以下將將字符串累加到ArrayList中:
List
使用流的filter方法,過濾特定的數據;
// 過濾無效酒店信息
thirdHotelInfoList = thirdHotelInfoList.stream()
.filter(o -> o.getName() != null && !o.getName().toString().equals(""))
.filter(o -> o.getCityName() != null && !o.getCityName().toString().equals(""))
.filter(o -> o.getLangitude() != null && !o.getLangitude().toString().equals(""))
.filter(o -> o.getLatitude() != null && !o.getLatitude().toString().equals(""))
.collect(Collectors.toList());
//ArrayList里面的removeIf方法就接受一個Predicate參數,采用如下Lambda表達式就能把,所有null元素刪除
list.removeIf(e -> e == null);