1.set
1.1、set和list有一個不同點就是set不可以存放重復(fù)的元素而list可以。set如何保證這一特點。
根據(jù)源碼可以看出hashset中的add方法最后會調(diào)用hashmap中的put方法。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
首先會根據(jù)hashcode這個方法返回hash值,先判斷hash值之后在通過equals方法判斷內(nèi)容。
1.2hashset與treeset區(qū)別
1.2.1、h底層是個hash表可以存放null,treeset底層是個二叉樹不可以存null。
1.2.2、h上面說過怎么保證唯一性。treeset通過compareTo方法。
一般排序的時候使用t,因為當(dāng)需要一個有序的數(shù)據(jù)的時候散列表中存儲的時無序的數(shù)據(jù),還需要排序。treeset可以重寫comperto方法對數(shù)據(jù)進(jìn)行自定義升序排序。
2.list
2.1、list循環(huán)問題
2.1.1

list在使用for循環(huán)的時候,會生成一個iterator對集合進(jìn)行迭代,此時又對這個集合修改會出現(xiàn)ConcurrentModificationException 異常。
2.1.2
//建立一個list集合,里面有5個元素含有“a”,3個不含有“a”
List<String> list = new ArrayList<>();
list.add("abc");
list.add("anc");
list.add("amg");
list.add("agf");
list.add("omg");
list.add("aig");
list.add("gme");
list.add("wbe");
//遍歷集合,移除含有“a”的元素
for(int i = 0; i < list.size();i++){
String str = list.get(i);
if(str.contains("a")){
list.remove(i);
}
}
//打印,看結(jié)果
for (Object st : list) {
System.out.print(st+" ");
}
運行結(jié)果:

這里是想要把所有帶a的字符串刪除。但是每當(dāng)刪除的時候集合的結(jié)構(gòu)都會向前移動一位,破壞了集合的結(jié)構(gòu)導(dǎo)致邏輯錯誤。
通過迭代器中的remove方法進(jìn)行刪除得到正確的結(jié)果。
Iterator<String> iterator=list.iterator();
while (iterator.hasNext()){
if (iterator.next().contains("a")){
iterator.remove();
}
}
2.2、數(shù)組與集合的相互轉(zhuǎn)換

2.3、多線程場景下如何使用arraylist

3.list轉(zhuǎn)換成map的三種方式:
3.1、第一種通過遍歷向map中添加數(shù)據(jù)
List<Srudent> srudentList = new ArrayList<Srudent>();
srudentList.add(new Srudent(1, "張朝陽"));
srudentList.add(new Srudent(6, "朱朝陽"));
srudentList.add(new Srudent(3, "李朝陽"));
srudentList.add(new Srudent(4, "吳朝陽"));
HashMap<Integer, Srudent> integerSrudentHashMap = new HashMap<Integer, Srudent>();
Iterator<Srudent> iterator=srudentList.iterator();
int num=0;
while (iterator.hasNext()){
integerSrudentHashMap.put(++num,iterator.next());
}
for (Integer key : integerSrudentHashMap.keySet()){
System.out.println(key +"-----"+integerSrudentHashMap.get(key).toString());
}
3.2、第二種通過流的方式
Map<Integer, Srudent> integerSrudentHashMap =srudentList.stream().collect(Collectors.toMap(p->p.getAge(),(p) ->p ));
for (Integer key : integerSrudentHashMap.keySet()){
System.out.println(key+"======="+integerSrudentHashMap.get(key));
}
3.流在集合中的使用
3.1流對于list
//打印
List<Srudent> srudentList = new ArrayList<Srudent>();
srudentList.add(new Srudent(1, "張朝陽"));
srudentList.add(new Srudent(2, "朱朝陽"));
srudentList.add(new Srudent(3, "李朝陽"));
srudentList.add(new Srudent(4, "吳朝陽"));
srudentList.stream().forEach(System.out::println);
//獲取集合長度
System.out.println(srudentList.stream().count());
//去重
srudentList.distinct().forEach(System.out::println);
// 將stream流處理后的數(shù)據(jù)收集成一個集合
//去重返回一個集合
List<Srudent> collect = srudentList.stream().distinct().collect(Collectors.toList());
//過濾 , filter是滿足條件的留下,是對原數(shù)組的過濾;map則是對原數(shù)組的加工,映射成一對一映射的新數(shù)組。說人話就是改變了了長度了用filter,沒改變長度,只是對某一個或者幾個做改變用map。
arrayList.stream().filter(p -> p.contains("李")).forEach(System.out::println);
//分組,這里想要將同歲的學(xué)生分為一組
List<Srudent> srudentList = new ArrayList<Srudent>();
srudentList.add(new Srudent(24,"孫千"));
srudentList.add(new Srudent(24,"小時代"));
srudentList.add(new Srudent(33,"郭敬明"));
srudentList.add(new Srudent(34,"張大大"));
Map<Integer, List<String>> collect = srudentList.stream().collect(Collectors.groupingBy(Srudent::getAge, Collectors.mapping(Srudent::getName, Collectors.toList())));
System.out.println(collect);