Set
代表無序、不可重復(fù)的集合;List
代表有序、重復(fù)的集合;Map
則代表具有映射關(guān)系的集合;Queue
代表一種隊列集合;Java集合類主要是由兩個接口派生而出:Collection
和Map
數(shù)組:
長度不可變;
無法保存具有映射關(guān)系的數(shù)據(jù);
數(shù)組元素可以是基本類型(byte,short,int,long,float,double,boolean,char)的值,也可以是對象(實際上保存的是對象的引用變量)
集合類:
可以保存長度不確定的數(shù)據(jù);
可以保存具有映射關(guān)系的數(shù)據(jù);
集合里保存的是對象(實際上保存的是對象的引用變量)
//programming=["Java","Python","C#","C++"]
programming.forEach(obj ->System.out.println("迭代集合元素:" + obj));
2.使用Iterator循環(huán)遍歷Collection//programming=["Java","Python","C#","C++"]
var it = programming.iterator(); // 獲取programming集合對應(yīng)的迭代器
while (it.hasNext()){// it.next返回的是數(shù)據(jù)類型是Object類型,因此需要強制類型轉(zhuǎn)換
var p = (String) it.next();
System.out.println(p);
}
3.使用foreach循環(huán)遍歷Collection//programming=["Java","Python","C#","C++"]
for (var program : programming){var p = (String) program;
System.out.println(p);
}
三、使用Predicate操作集合public class temp {public static void main(String[] args) {var programming = new HashSet<>();
programming.add("Java");
programming.add("Python");
programming.add("C#");
programming.add("C++");
programming.add("JavaScript");
programming.add("Vue");
System.out.println(calculate(programming, ele ->((String) ele).length() == 3));
System.out.println(calculate(programming, ele ->((String) ele).contains("C")));
}
public static int calculate(Collection objs, Predicate p) {int total = 0;
for (var obj : objs) { // 使用Predicate的test()方法判斷該對象是否滿足Predicate指定的條件
if (p.test(obj)) {total++;
}
}
return total;
}
}
四、使用Stream操作集合獨立使用stream的步驟如下:
public static void main(String[] args) {var is = IntStream.builder().add(3).add(1).add(2).add(9).build();
System.out.println("is所有元素是否都是偶數(shù):" + is.allMatch(ele ->ele % 2 == 0));
var is1 = IntStream.builder().add(3).add(1).add(2).add(9).build();
var newIs = is1.map(ele ->ele * 3 + 5);
newIs.forEach(System.out::println);
// is.forEach(ele ->System.out.println(ele % 2));
}
Stream提供了大量的方法進行聚集操作,這些方法既可以是“中間的”,也可以是“末端的”。上述的allMatch就是末端操作,map是中間操作。
中間操作:允許流保持打開狀態(tài),并允許直接調(diào)用后續(xù)方法,中間方法的返回值是另外一個流;
末端方法:對流的最終操作。當(dāng)對某個Stream執(zhí)行末端方法后,該流將會被“消耗”,切不可再用。
所以上述的is流進行了allMatch末端操作后,被消耗,不可再次使用;
常用的中間操作:filter
、mapToXxx
、peek
、distinct
、sorted
、limit
等
常用的末端方法:forEach
、toArray
、reduce
、min
、max
、count
、anyMatch
、allMatch
、noneMatch
、findFirst
、findAny
等
HashSet按Hash算法來存儲集合中的元素,因此具有很好的存取和查找性能。
自然排序
自然排序的對象要實現(xiàn)Comparable接口,而且應(yīng)該是同一個類的多個實例;定制排序
在創(chuàng)建TreeSet對象時,提供一個Comparator對象與該TreeSet集合關(guān)聯(lián),由Comparator對象負責(zé)集合元素的排序邏輯;性能:EnumSet >HashSet >TreeSet
需要一個保持排序的Set:TreeSet
遍歷:LinkedHashSet >HashSet
即一般情況下選HashSet
,需要排序
選TreeSort
,強調(diào)遍歷
選LinkedHashSet
,枚舉
選EnumSet
自然排序
定制排序
Set接口下有HashSet
、LinkedHashSet
、SortedSet
、TreeSet
、EnumSet
等子接口和實現(xiàn)類;
Map接口下有HashMap
、LinkedHashMap
、SortedMap
、TreeMap
、EnumMap
等子接口和實現(xiàn)類;
Map的類和子接口中Key集的存儲形式和對應(yīng)的Set集合中的元素存儲形式完全相同;
從Java源碼來看,Java先是實現(xiàn)了Map,然后通過包裝一個所有value均為空對象的Map就實現(xiàn)了Set集合;
Map提供了一個Entry內(nèi)部類來封裝key-value對,而計算Entry存儲時則只考慮Entry封裝的key;
scores.forEach((key,value) ->System.out.println(key + "-->" + value));
4.Properties性能:EnumMap >HashMap(IdentityHashMap) >LinkedHashMap >Hashtable >TreeMap
強調(diào)排序:TreeMap >HashMap
synchronizedXxx
emptyXxx
、singletonXxx
、unmodifiableXxx
、(Java9新增的:Set、List、Map的of
方法)你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧