List集合及新特性引用


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 asList = stringStream.collect(Collectors.toList());

使用流的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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM