集合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); } }

 

集合Collection ----Set集合

上一篇:vue中$router和$route的区别


下一篇:[源码解析] 机器学习参数服务器ps-lite 之(3) ----- 代理人Customer