2020-10-22--集合

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


image.png

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é)果:


image.png

這里是想要把所有帶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)換


image.png

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


image.png

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);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容