欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 深入淺出掌握Collection單列集合Set

 更新時(shí)間:2021年11月11日 14:48:44   作者:?jiǎn)贪途鷥? 
Collection集合類是單列集合類的根接口,用來存儲(chǔ)一系列符合某種規(guī)則的元素。List接口和Set接口是Collection集合類的子接口,其中List接口的常用實(shí)現(xiàn)類有ArrayList類、Vector類和LinkedList類;Set接口的常用實(shí)現(xiàn)類有HashSet類和TreeSet類

前言

Hello!上一期我大致講解了關(guān)于Collection單列集合以及它的子接口List集合的概述、特點(diǎn)和遍歷等,今天我為大家講解關(guān)于Collection集合的另一個(gè)子接口-->Set集合的相關(guān)知識(shí)點(diǎn)。

Set集合

Set概述

【1】Set集合類似于一個(gè)集裝箱,程序可以依次將這些貨物(多個(gè)對(duì)象)裝運(yùn)進(jìn)此集裝箱,而Set集合往往不能記住裝運(yùn)這些貨物的順序(元素的添加順序),且不允許裝運(yùn)相同的貨物。

【2】Set集合不允許包含相同的元素,如果試圖把兩個(gè)相同元素加入同一個(gè)Set集合中,則添加操作失敗,add()方法返回false,且新元素不會(huì)被加入。

Set特點(diǎn)

  • 元素存取無序
  • 沒有索引、只能通過迭代器或增強(qiáng)for循環(huán)遍歷
  • 不能存儲(chǔ)重復(fù)元素
public class SetDemo_01 {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
 
        //添加元素
        set.add("Hello");
        set.add("World");
        set.add("Java");
        set.add("Hello");//Set不包含重復(fù)元素的集合,(相同的,只輸出一個(gè))
 
        //Set沒有索引、只能通過迭代器或增強(qiáng)for循環(huán)遍歷且元素存取無序
        //迭代器遍歷
        Iterator<String> it = set.iterator();
        while(it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
 
        //增強(qiáng)for
        for (String s : set) {
            System.out.println(s);
        }
    }
}

HashSet集合

HashSet概述

HashSet是Set接口的典型實(shí)現(xiàn),大多數(shù)時(shí)候使用Set集合時(shí)就是使用這個(gè)實(shí)現(xiàn)類。HashSet按Hash算法來存儲(chǔ)集合中的元素,因此具有很好的存取和查找性能。底層數(shù)據(jù)結(jié)構(gòu)是哈希表。

哈希值:

哈希值簡(jiǎn)介:是JDK根據(jù)對(duì)象的地址或者字符串或者數(shù)字算出來的int類型的數(shù)值

如何獲取哈希值:Object類中的public int hashCode():返回對(duì)象的哈希碼值

哈希值的特點(diǎn):(1)同一個(gè)對(duì)象多次調(diào)用hashCode()方法返回的哈希值是相同的;(2)默認(rèn)情況下,不同對(duì)象的哈希值是不同的。而重寫hashCode()方法,可以實(shí)現(xiàn)讓不同對(duì)象的哈希值相同

HashSet特點(diǎn)

  • 底層數(shù)據(jù)結(jié)構(gòu)是哈希表
  • 對(duì)集合的迭代順序不作任何保證,也就是說不保證存儲(chǔ)和取出的元素順序一致
  • 沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷
  • 由于是Set集合,所以不包含重復(fù)元素的集合
public class HashSetDemo_01 {
    public static void main(String[] args) {
        //創(chuàng)建集合對(duì)象
        HashSet<String> hs = new HashSet<>();
 
        //添加元素
        hs.add("Hello");
        hs.add("World");
        hs.add("Java");
        hs.add("Java");//由于是Set集合,所以是不包含重復(fù)元素的集合.相同的元素,只輸出一個(gè)
 
        //沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷
        //迭代器方式
        Iterator<String> it = hs.iterator();
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
        System.out.println("----------------");
 
        //增強(qiáng)for
        for (String s : hs) {
            System.out.println(s);
        }
    }
}

HashSet集合保證元素唯一性源碼分析

HashSet集合保證元素唯一性的原理:

  • 根據(jù)對(duì)象的哈希值計(jì)算存儲(chǔ)位置( 1.如果當(dāng)前位置沒有元素則直接存入; 如果當(dāng)前位置有元素存在,則進(jìn)入第二步)
  • 當(dāng)前元素的元素和已經(jīng)存在的元素比較哈希值(1. 如果哈希值不同,則將當(dāng)前元素進(jìn)行存儲(chǔ); 如果哈希值相同,則進(jìn)入第三步)
  • 通過equals()方法比較兩個(gè)元素的內(nèi)容(1. 如果內(nèi)容不相同,則將當(dāng)前元素進(jìn)行存儲(chǔ);2.如果內(nèi)容相同,則不存儲(chǔ)當(dāng)前元素)

HashSet集合保證元素唯一性的圖解

LinkedHashSet集合

LinkedHashSet概述與特點(diǎn)

他是Set集合典型實(shí)現(xiàn)類HashSet的子類,繼承了set集合的所有功能和特點(diǎn),同時(shí)把其中的重要特點(diǎn)給修改,把無序變?yōu)橛行颉?/p>

  • 哈希表和鏈表實(shí)現(xiàn)的Set接口,具有可預(yù)測(cè)的迭代次序
  • 由鏈表保證元素有序,也就是說元素的存儲(chǔ)和取出順序是一致的
  • 由哈希表保證元素唯一,也就是說沒有重復(fù)的元素
public class LinkedHashSetDemo {
    public static void main(String[] args) {
        //創(chuàng)建LinkedHashSet集合對(duì)象
        LinkedHashSet<String> lhs = new LinkedHashSet<>();
 
        lhs.add("Hello");
        lhs.add("World");
        lhs.add("Java");
 
        //由哈希表保證元素唯一,也就是說沒有重復(fù)的元素
        lhs.add("Java");
 
        /*哈希表和鏈表實(shí)現(xiàn)的Set接口,具有可預(yù)測(cè)的迭代次序
        由鏈表保證元素有序,也就是說元素的存儲(chǔ)和取出順序是一致的*/
        //遍歷集合
        for (String s : lhs) {
            System.out.println(s);
        }
    }
}

TreeSet集合

TreeSet是SortedSet接口的實(shí)現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。

TreeSet特點(diǎn)

  • 元素有序,可以按照一定的規(guī)則進(jìn)行排序,具體排序方式取決于構(gòu)造方法
  • 沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷
  • 由于是Set集合,所以不包含重復(fù)元素的集合

TreeSet(排序方式)

TreeSet():根據(jù)其元素的自然排序進(jìn)行排序。TreeSet會(huì)調(diào)用集合元素的compareTo(Objec obj)方法來比較元素之間的大小關(guān)系,然后將集合元素按升序排列,這就是自然排序。

TreeSet(Comparator comparator) :根據(jù)指定的比較器進(jìn)行排序。

這里我給出視頻講解里的關(guān)于比較器排序Comparator的使用的案例:

  • 學(xué)生類
public class Student {
    private String name;
    private int age;
 
    public Student() {
    }
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}
  • 測(cè)試類
public class TreeSetDemo {
    public static void main(String[] args) {
        //創(chuàng)建集合對(duì)象
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //this.age - s.age
                //s1,s2
                int num = s1.getAge() - s2.getAge();
                int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
                return num2;
            }
        });
 
        //創(chuàng)建學(xué)生對(duì)象
        Student s1 = new Student("xishi", 29);
        Student s2 = new Student("wangzhaojun", 28);
        Student s3 = new Student("diaochan", 30);
        Student s4 = new Student("yangyuhuan", 33);
 
        Student s5 = new Student("linqingxia",33);
        Student s6 = new Student("linqingxia",33);
 
        //把學(xué)生添加到集合
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);
 
        //遍歷集合
        for (Student s : ts) {
            System.out.println(s.getName() + "," + s.getAge());
        }
    }
}

總結(jié)

Set和List對(duì)比:

Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會(huì)引起元素位置改變。

List:和數(shù)組類似,List可以動(dòng)態(tài)增長,查找元素效率高,插入刪除元素效率低,因?yàn)闀?huì)引起其他元素位置改變。

【1】HashSet采用哈希表的存儲(chǔ)結(jié)構(gòu)所以里面的數(shù)據(jù)是無序但是唯一的。(實(shí)現(xiàn)唯一的方式就是重寫 Hashcode和equals方法)

【2】TreeSet支持兩種排序方法:自然排序和定制排序,TreeSet默認(rèn)采用自然排序。

今日的有關(guān)Set集合內(nèi)容的分享就到這了,下期Map集合再會(huì)!(可以給個(gè)愛心嗎,友友們)

以上就是Java 深入淺出掌握Collection單列集合Set的詳細(xì)內(nèi)容,更多關(guān)于Java 單列集合的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論