最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單的理解java集合中的HashSet和HashTree幾個重寫方法

 更新時間:2020年10月13日 14:11:58   作者:m0_51327764  
這篇文章主要介紹了簡單的理解java集合中的HashSet和HashTree幾個重寫方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

Java中的set是無序的,但是是不可重復(fù)的

HashSet底層是哈希表,通過調(diào)用hashcode和equals方法實現(xiàn)去重

當我們HashSet里面存的是字符串時,就能默認去重了,因為String已經(jīng)重寫了hashcode和euqals方法

  public static void main(String[] args) {
    HashSet<String> set = new HashSet();
    set.add("java");
    set.add("c");
    set.add("php");
    set.add("bigdata");
    set.add("java");
    //運行結(jié)果,給去重了,而且是無序的
    System.out.println(set);//[java, c, bigdata, php]
  }
}

但是當我們有類的時候,比如Person,Cat,Dog,我們自己寫的類,但是我們想按照自己制定的規(guī)則去重,就比如Person的姓名和年齡,因為Person類是我們自己建的,如果我們沒有重寫方法,就會去找Object的hashcode方法,這樣new Person()的hashcode就會不同,這樣每個都是一個新的,都會輸出,即使年齡和姓名一樣

public class Demo1 {
  public static void main(String[] args) {
    HashSet<Person> set1 = new HashSet<>();
    set1.add(new Person("aing",50));
    set1.add(new Person("bing",10));
    set1.add(new Person("ding",20));
    set1.add(new Person("ding",20));
    //運行結(jié)果是即使名字年齡一樣,也會輸出兩個,我們?nèi)绻胍凑兆约旱囊?guī)則去重,這樣我們一定要重寫hashcode 和euqals方法
    System.out.println(set1);//[Person{name='bing', age=10}, Person{name='ding', age=20}, Person{name='aing', age=50}, Person{name='ding', age=20}]
  }
}
class Person{
  String name;
  int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  @Override
  public String toString() {
    return "Person{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
  }
}

我們重寫hashcode方法,當hashcode不一樣時,就不會比較equals,直接就是不一樣,如果hashcode一樣,再比較equals方法

public class Demo1 {
  public static void main(String[] args) {
    HashSet<Person> set1 = new HashSet<>();
    set1.add(new Person("aing",50));
    set1.add(new Person("bing",10));
    set1.add(new Person("ding",20));
    set1.add(new Person("ding",20));
    //根據(jù)年齡和姓名比較的
    System.out.println(set1);//[Person{name='ding', age=20}, Person{name='aing', age=50}, Person{name='bing', age=10}]
  }
}
class Person{
  String name;
  int age;
  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
  @Override
  public String toString() {
    return "Person{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
  }
  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return age == person.age &&
        Objects.equals(name, person.name);
  }
  //和屬性關(guān)聯(lián),根據(jù)屬性的值比較,之所以讓age*100;是因為怕有可能出現(xiàn)這個name.hashCode()+age 和 下一個name.hashCode()+age加起來的值恰好相等,所以age*100,可以避免這種情況的發(fā)生
  @Override
  public int hashCode() {
    //return Objects.hash(name, age);
    return name.hashCode()+age*100;
  }
}

TreeSet底層是二叉樹,而且TreeSet還是有序的,在String中不僅重寫了hashcode,還要調(diào)用元素的compareTo方法, String類已經(jīng)實現(xiàn)了Comparable接口,并重寫 了compareTo方法,但是如果我們自己寫類的話,比如Person來說,如果想要按照自己的規(guī)則比,就要重寫hashcode方法和實現(xiàn)Comparable接口

public class Demo2 {
  public static void main(String[] args) {
    TreeSet<String> set = new TreeSet();
    set.add("java");
    set.add("c");
    set.add("php");
    set.add("bigdata");
    set.add("java");
    System.out.println(set);//[bigdata, c, java, php]
  }
}

但是要是自己的類
會報錯cannot be cast to java.lang.Comparable,因為Person會去找compareTo的方法,但是Person類沒有實現(xiàn)它,我們要去實現(xiàn)Comparable

public class Demo2 {
  public static void main(String[] args) {
    TreeSet<Person1> set1 = new TreeSet<>();
    set1.add(new Person1("aing",50));
    set1.add(new Person1("bing",10));
    set1.add(new Person1("ding",20));
    set1.add(new Person1("ding",20));
    System.out.println(set1);
  }
}
class Person1{
  String name;
  int age;

  public Person1(String name, int age) {
    this.name = name;
    this.age = age;
  }

  @Override
  public String toString() {
    return "Person1{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
  }
}

這樣我們就可以實現(xiàn)有序了,根據(jù)我們的屬性

public class Demo2 {
  public static void main(String[] args) {
    TreeSet<Person1> set1 = new TreeSet<>();
    set1.add(new Person1("aing",50));
    set1.add(new Person1("bing",10));
    set1.add(new Person1("ding",20));
    set1.add(new Person1("ding",20));
    System.out.println(set1);
  }
}
class Person1 implements Comparable{
  String name;
  int age;

  public Person1(String name, int age) {
    this.name = name;
    this.age = age;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person1 person1 = (Person1) o;
    return age == person1.age &&
        Objects.equals(name, person1.name);
  }

  @Override
  public int hashCode() {
    return name.hashCode()+age*100;
  }

  @Override
  public String toString() {
    return "Person1{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
  }
  //根據(jù)類的屬性進行排序
  @Override
  public int compareTo(Object o) {
  Person1 person = (Person1)o;
  int num = name.compareTo(person.name);
  return num==0?age-person.age:num;
}
}

到此這篇關(guān)于簡單的理解java集合中的HashSet和HashTree幾個重寫方法的文章就介紹到這了,更多相關(guān)java HashSet和HashTree重寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IntelliJ IDEA 關(guān)閉多余項目的操作方法

    IntelliJ IDEA 關(guān)閉多余項目的操作方法

    這篇文章主要介紹了IntelliJ IDEA 關(guān)閉多余項目的操作方法,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • FreeMarker如何調(diào)用Java靜態(tài)方法及靜態(tài)變量方法

    FreeMarker如何調(diào)用Java靜態(tài)方法及靜態(tài)變量方法

    這篇文章主要介紹了FreeMarker如何調(diào)用Java靜態(tài)方法及靜態(tài)變量方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Springboot公共字段填充及ThreadLocal模塊改進方案

    Springboot公共字段填充及ThreadLocal模塊改進方案

    這篇文章主要為大家介紹了Springboot公共字段填充及ThreadLocal模塊改進方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • java8 如何實現(xiàn)分組計算數(shù)量和計算總數(shù)

    java8 如何實現(xiàn)分組計算數(shù)量和計算總數(shù)

    這篇文章主要介紹了java8 如何實現(xiàn)分組計算數(shù)量和計算總數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java中?${}?和?#{}?有什么區(qū)別

    java中?${}?和?#{}?有什么區(qū)別

    本文主要介紹了java中${}和#{}有什么區(qū)別,${}和#{}都是MyBatis中用來替換參數(shù)的,它們都可以將用戶傳遞過來的參數(shù),替換到MyBatis最終生成的SQL中,但它們區(qū)別卻是很大的,感興趣的小伙伴可以一起來學(xué)習下面詳細內(nèi)容
    2022-08-08
  • Java開發(fā)如何把數(shù)據(jù)庫里的未付款訂單改成已付款

    Java開發(fā)如何把數(shù)據(jù)庫里的未付款訂單改成已付款

    這篇文章主要介紹了Java開發(fā)如何把數(shù)據(jù)庫里的未付款訂單改成已付款,先介紹MD5算法,簡單的來說,MD5能把任意大小、長度的數(shù)據(jù)轉(zhuǎn)換成固定長度的一串字符,實現(xiàn)思路非常簡單需要的朋友可以參考下
    2022-11-11
  • Java將字符串寫入文本文件代碼示例

    Java將字符串寫入文本文件代碼示例

    這篇文章主要介紹了Java將字符串寫入文本文件代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • SpringBoot打印詳細啟動異常信息

    SpringBoot打印詳細啟動異常信息

    這篇文章主要介紹了SpringBoot打印詳細啟動異常信息,本文包含了詳細的過程解析與案例,概要的說明了如何去使用打印啟動異常信息,需要的朋友可以參考下
    2021-06-06
  • Java Swing實現(xiàn)JTable檢測單元格數(shù)據(jù)變更事件的方法示例

    Java Swing實現(xiàn)JTable檢測單元格數(shù)據(jù)變更事件的方法示例

    這篇文章主要介紹了Java Swing實現(xiàn)JTable檢測單元格數(shù)據(jù)變更事件的方法,結(jié)合完整實例形式分析了Swing實現(xiàn)JTable檢測單元格數(shù)據(jù)變更事件過程中出現(xiàn)的問題與相關(guān)解決方法,需要的朋友可以參考下
    2017-11-11
  • 高斯混合模型與EM算法圖文詳解

    高斯混合模型與EM算法圖文詳解

    高斯模型就是用高斯概率密度函數(shù)(正態(tài)分布曲線)精確地量化事物,將一個事物分解為若干的基于高斯概率密度函數(shù)(正態(tài)分布曲線)形成的模型
    2021-08-08

最新評論

夹江县| 耿马| 鄢陵县| 利辛县| 浦县| 利辛县| 通江县| 望江县| 秦安县| 当涂县| 宁乡县| 仁布县| 藁城市| 阿拉善右旗| 合肥市| 峡江县| 上林县| 天峨县| 得荣县| 师宗县| 沙雅县| 贵阳市| 建宁县| 沛县| 澜沧| 平武县| 兴国县| 进贤县| 滁州市| 赫章县| 湖南省| 和林格尔县| 新民市| 宜章县| 娄烦县| 安顺市| 斗六市| 太康县| 贵德县| 莱芜市| 亚东县|