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

Java LinkedHashSet集合的底層原理和TreeSet集合

 更新時間:2024年10月22日 12:05:39   作者:CCH2024  
LinkedHashSet保證元素有序且唯一,底層通過雙鏈表實現(xiàn),TreeSet元素不重復且可排序,底層使用紅黑樹實現(xiàn)排序,自定義類型排序可通過實現(xiàn)Comparable接口或提供Comparator來定義排序規(guī)則,適用于需要大量元素快速檢索的場景

Collection集合體系:

LinkedHashSet:有序、不重復、無索引。

 看一下之前的代碼:

package cn.chang.d4_collection_set;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
/**
 * 目標:整體了解下Set集合的特點
 */
public class SetTest1 {
    public static void main(String[] args) {
        // 1. 創(chuàng)建一個Set集合的對象
        // 無序、不重復、無索引
        //Set<Integer> set = new HashSet<Integer>();  // 多態(tài) HashSet是一個實現(xiàn)類 經(jīng)典代碼
        Set<Integer> set = new LinkedHashSet<>();   // 有序 不重復 無索引
        //Set<Integer> set = new TreeSet<>();           // 排序升序  不重復  無索引
        set.add(666);
        set.add(555);
        set.add(555);      // 只顯示一個555
        set.add(888);
        set.add(777);
        System.out.println(set);   // 不支持索引操作數(shù)據(jù)   // 無序一次
    }
}

運行結果:

可見:LinkedHashSet是無序、不重復和無索引的。

LinkedHashSet底層原理:

依然是基于哈希表(數(shù)組、鏈表和紅黑樹)實現(xiàn)的。

但是,它的每個元素都額外的多了一個雙鏈表的機制記錄它前后元素的位置。

通過雙鏈表去找數(shù)據(jù),所以就是有序的。

缺點:每個節(jié)點更占內(nèi)存。

TreeSet:

特點:不重復、無索引、可排序(默認升序排序、按照元素的大小、由小到大排序)。

底層是基于紅黑樹實現(xiàn)的排序。

package cn.chang.d4_collection_set;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
/**
 * 目標: 掌握TreeSet集合的使用
 */
public class SetTest4 {
    public static void main(String[] args) {
        Set<Integer> set = new TreeSet<>();
        set.add(6);
        set.add(5);
        set.add(5);
        set.add(7);
        System.out.println(set);
    }
}

運行結果:

左根右,中序遍歷。

注意:

對于數(shù)值類型:Integer、Double,默認是按照數(shù)值本身的大小進行升序 排序。

對于字符串類型,默認按照首字符的編號升序排列。

對于自定義類型,如Student對象,TreeSet默認是無法直接排序的。

會有如下報錯。

自定義排序規(guī)則:

TreeSet集合存儲自定義類型的對象時,必須指定排序規(guī)則,支持如下兩種方式來指定比較規(guī)則:

方式一:

讓自定義類(如學生類)實現(xiàn)Comparable接口,重寫里面的compareTo方法來指定比較規(guī)則。

方式二:

通過調用TreeSet集合的有參構造器,可以設置Comparator對象(比較器對象,用于指定比較規(guī)則)。

方式一:

代碼:

package cn.chang.d4_collection_set;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
/**
 * 目標: 掌握TreeSet集合的使用
 */
public class SetTest4 {
    public static void main(String[] args) {
        Set<Student> students = new TreeSet<>();
        students.add(new Student("蜘蛛精", 23, 169.7));
        students.add(new Student("紫霞", 22, 169.8));
        students.add(new Student("至尊寶", 26, 165.5));
        students.add(new Student("牛魔王", 22, 183.5));
        System.out.println(students);
    }
}

我們可以看到牛魔王沒有了。如果大小規(guī)則的相等,就重復了,牛魔王就不存了。

方式二:

package cn.chang.d4_collection_set;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
/**
 * 目標: 掌握TreeSet集合的使用
 */
public class SetTest4 {
    public static void main(String[] args) {
        Set<Student> students = new TreeSet<>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                // 需要按照身高升序排序
                return Double.compare(s1.getHeight(), s2.getHeight());
            }
        });
        students.add(new Student("蜘蛛精", 23, 169.7));
        students.add(new Student("紫霞", 22, 169.8));
        students.add(new Student("至尊寶", 26, 165.5));
        students.add(new Student("牛魔王", 22, 183.5));
        System.out.println(students);
    }
}

運行結果:

現(xiàn)在我們有兩臺比較方案,優(yōu)先按就近原則采用方法二。

代碼的簡化:

package cn.chang.d4_collection_set;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
/**
 * 目標: 掌握TreeSet集合的使用
 */
public class SetTest4 {
    public static void main(String[] args) {
//        Set<Student> students = new TreeSet<>(new Comparator<Student>() {
//            @Override
//            public int compare(Student s1, Student s2) {
//                // 需要按照身高升序排序
//                return Double.compare(s1.getHeight(), s2.getHeight());
//            }
//        });
        Set<Student> students = new TreeSet<>((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight()));
        students.add(new Student("蜘蛛精", 23, 169.7));
        students.add(new Student("紫霞", 22, 169.8));
        students.add(new Student("至尊寶", 26, 165.5));
        students.add(new Student("牛魔王", 22, 183.5));
        System.out.println(students);
    }
}

在compare中顛倒下位置,就可以實現(xiàn)降序排列。

到此這篇關于Java LinkedHashSet集合的底層原理和TreeSet集合的文章就介紹到這了,更多相關Java LinkedHashSet和TreeSet集合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論