集合00_Java集合框架
阿新 • • 發佈:2018-09-29
增強 list 參數表 避免 next() toarray sum() ole ast
集合類概述
1.繼承樹
2.集合和數組
區別如下:
- 數組可以存儲基本數據類型,也可以存儲引用類型;而集合只能存儲引用類型(比如存儲int,它會自動裝箱成Integer)
- 數組長度固定,集合長度可變
3.List和map
- 相同
- 都是集合類,都是接口
- 區別
- List存儲單列元素,Map存儲鍵值對
- List允許元素重復,Map不允許key重復(重復則覆蓋)
- List存儲有序,Map存儲無序
- 無論是List還是Map,它們實現動態增長都是有性能消耗的。在初始化集合的時候先估算數據量並分配合理的容量會減少動態增長時的消耗。
4.Collection基礎功能
Collection接口定義的操作集合的方法有:
- int size()
- boolean add(Object o)
- boolean addAll(Collection c)
- void clear()
- boolean contains(Object o)
- boolean containsAll(Object o)
- Iterator iterator()
- boolean isEmpty()
- boolean remove(Object o)
- boolean removeAll(Collection c)
- boolean retainAll(Collection c)
- Object[] toArray()
集合遍歷
1.forEach方法
Java8為Iterator接口新增的forEach默認方法
import java.util.Collection; import java.util.HashSet; public class CollectionTest { public void each() { Collection<String> books = new HashSet<>(); books.add("aaaaaa"); books.add("bbbbbb"); //1.使用Collection提供的方法 books.forEach(str -> System.out.println(str));
2.使用叠代器Iterator
每個集合都以內部類的方式實現了Iterator接口,Iterator替代了Enumeration,其更加安全,因為其遍歷集合時會阻止其他線程修改集合
ListIterator繼承了Iterator接口,它用於遍歷List集合的元素,由於是雙向遍歷,不僅可以刪除元素,還可以添加和修改元素
Java8增強的Iterator提供的方法如下:
- boolean hasNext()
- Object next()
- void remove()
void forEachRemaining(Consumer action)
//2使用iterator的方法 Iterator<String> iterator = books.iterator(); while (iterator.hasNext()) { //需要強制轉換 String str = (String) iterator.next(); if("aaaaaa".equals(str)) iterator.remove(); } //3.使用lambda表達式遍歷 iterator.forEachRemaining(str -> System.out.println(str)); } }
集合過濾
- Java8為Collection新增的removeIf(Predicate filter)方法,可以批量刪除符合filter條件的元素。使用lambda表達式做參數表述為
books.removeIf(str -> ((String)str).length() < 10);
- 使用Java8新增的Stream流來操作集合
- 包含Stream、InStream、LongStream、DoubleStream等流式API,獨立使用步驟如下:
public void stream() { //1.使用流的builder類方法創建對應的Builder //2.重復調用add()方法向流中添加元素 //3.調用builder的build()方法獲取對應的Stream IntStream is = IntStream.builder() .add(1) .add(2) .add(3) .add(5) .build(); //4.調用Stream的聚集方法(很多),每次只能調用一個,調用完流即不可用 //如System.out.println(is.sum()); //將is映射成新的newIs流 IntStream newIs = is.map(ele -> ele * 2 + 1); //使用方法引用的方式遍歷集合元素 newIs.forEach(System.out::println); }
- 使用Collection接口提供的stream()默認方法,返回對應集合的流,進而進行聚集操作,簡化了集合編程。使用如下:
public void preStream() { Collection<String> books = new HashSet<>(); books.add("java"); books.add("myjava"); books.add("JAVA"); System.out.println(books.stream().filter(ele -> ((String)ele).contains("java")).count()); //1.先調用Collection對象的stream方法將集合轉換為Stream //2.再調用Stream的mapToInt方法獲取原有的Stream對應的IntStream //3.再調用forEach方法遍歷IntStream中的元素 books.stream().mapToInt(ele -> ((String)ele).length()).forEach(System.out::println); }
fail-fast機制
- 簡介
fail-fast機制是java容器(Collection和Map都存在fail-fast機制)中的一種錯誤機制。在遍歷一個容器對象時,當容器結構被修改(remove方法除外),很有可能會拋出ConcurrentModificationException,產生fail-fast。 - 原理
每次初始化一個叠代器都會執行int expectedModCount = modCount;
,modCount表示修改次數,叠代器會通過checkForComodification()方法判斷modCount和expectedModCount 是否相等,如果不相等就表示已經有線程修改了集合結構。 - 如何避免
使用java.util.concurrent包下的類去取代java.util包下的類。Java1.5並發包含有線程安全集合類,允許在叠代時修改集合,比如ConcurrentHashMap。
集合00_Java集合框架