1. 程式人生 > 其它 >集合Collection ----Set集合

集合Collection ----Set集合

set系列集合:新增的元素是 無序,不重複,無索引的

   ----HashSet: 無序,不重複,無索引

------LinkHashSet<>:有序不重複無索引(新增順序)

   ----LinkedHashSet: 排序(按照大小預設升序排序,是可排序集合),不重複,無索引

HashSet:不重複,無序  

  set集合去重複的流程: 1.物件呼叫hashcode() 方法獲取雜湊值進行比較 false---不重複

            2.如果為true,則進行equals比較

    總結:如果set物件認為兩個集合的內容一樣就重複,重寫hashcode()和equals方法

  set集合無序的原因是:底層採用了雜湊表儲存元素

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

class Sheep{
    private String name;
    private int age;
    Sheep(){
        
    }

    public Sheep(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; } @Override public boolean equals(Object o) { if
(this == o) return true; if (o == null || getClass() != o.getClass()) return false; Sheep sheep = (Sheep) o; return age == sheep.age && Objects.equals(name, sheep.name); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Sheep{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class HashSetDemo1 { public static void main(String[] args) { Set<Sheep> sets=new HashSet<>(); Sheep s1 = new Sheep("懶洋洋",6); Sheep s2 = new Sheep("暖羊羊",8); Sheep s3 = new Sheep("懶洋洋",6); sets.add(s1); sets.add(s2); sets.add(s3); System.out.println(sets); // [Sheep{name='暖羊羊', age=8}, Sheep{name='懶洋洋', age=6}]
// 如果沒有重寫hashcode()和equals,則輸出:[Sheep{name='暖羊羊', age=8}, Sheep{name='懶洋洋', age=6}, Sheep{name='懶洋洋', age=6}]
} }

LinkHashSet:每個元素都新增一個鏈來維護新增順序

import java.util.LinkedHashSet;
import java.util.Set;
public class LinkHashSetDemo1 { public static void main(String[] args) { Set<String> sets = new LinkedHashSet<>(); sets.add("沸羊羊"); sets.add("喜羊羊"); sets.add("暖羊羊"); sets.add("喜羊羊"); System.out.println(sets); } }

TreeSet:

  1.有值特性的元素進行升序排序

  2.String排序按照首字母的 ASCII碼值排序

3.引用資料型別(預設無法排序,所以需要定製排序的大小規則)

    a.直接為物件的類實現比較器規則介面Comparable,重寫比較方法

    b.直接為集合設定比較器Comparator物件,重寫比較方法

   總結:如果類和集合都帶有比較規則,優先使用集合自帶的比較規則

package com.day05;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;


class Wolf implements Comparable<Wolf>{
    private String name;
    private int age;

    //重寫比較方法 w1.compareTo(w)
    // 比較者:this   被比較者:w
    @Override
    public int compareTo(Wolf w){
        //比價規則!!
        //比較者大於被比較者,返回正數(1)
        //比較者小於被比較者,返回負數(-1)
        //比較者等於被比較者,返回0
//        if(this.age>w.age){
//            return 1;
//        }else if(this.age<w.age){
//            return -1;
//        }
//        return 0;
        return this.age-w.age;
    }


    Wolf(){

    }

    public Wolf(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;
    }

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

public class TreeSetDemo1 {
    public static void main(String[] args) {
//---------------第一種-------------------// Set
<Wolf> sets=new TreeSet<>(); sets.add(new Wolf("紅太狼",24)); sets.add(new Wolf("灰太狼",28)); sets.add(new Wolf("小灰灰",12)); System.out.println(sets);        //--------------第二種--------------------// Set<Wolf> setss=new TreeSet<>(new Comparator<Wolf>() { // 匿名物件 @Override public int compare(Wolf o1, Wolf o2) { return o2.getAge()-o1.getAge(); } }); setss.add(new Wolf("紅太狼",24)); setss.add(new Wolf("灰太狼",28)); setss.add(new Wolf("小灰灰",12)); System.out.println(setss); } }