JAVA学习-Set集合,HashSet集合,LinkedHashSet集合,TreeSet集合

java集合如Map、Set、List等所有集合只能存放引用类型数据,它们都是存放引用类型数据的容器,不能存放如int、long、float、double等基础类型的数据

Set集合

set集合是Collection集合的子接口的一种
特点:
不包含重复元素
没有索引,不能使用for循环遍历
HashSet方法,对集合的迭代顺序不作任何保证;

哈希值

就JDK根据对象的地址或者字符串或者数字算出来的int类型的数值

获取对象的哈希值:object.hashCode()
特点:
同一个对象多次调用的哈希值是一样的;
默认情况下,不同对象的哈希值的不一样的;
通过方法重写,可以实现不同对象的哈希值是相同的;

HashSet集合特点

底层数据结构是哈希表,保证集合元素的唯一性
对数据的迭代顺序没有任何保证
没有带索引的方法,不能使用普通for方法遍历
由于是Set集合,所以是不包含重复数据的集合

常见数据结构哈希表

哈希表用 数组+链表 实现,是一个元素的链表;

运用哈希结构实现set数组的唯一性

需要在数据表中重写equals和hashcode方法;
在Generate中可以直接选择重写;

贴一下重写的实例:
构造学生类对象:

package hashset;

import java.util.Objects;

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;
    }

    @Override  //此处重写了equals方法
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        student student = (student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override //此处重写了hashCode方法
    public int hashCode() {
    
    
        return Objects.hash(name, age);
    }
}

建hashset表,并遍历

package hashset;

import java.util.HashSet;

public class hashsetdemo {
    
    
    public static void main(String[] args) {
    
    
        HashSet<student> ha = new HashSet<student>();
        student s1 = new student("haha",12);
        student s2 = new student("haaa",122);
        student s3 = new student("haaa",122);


        ha.add(s1);
        ha.add(s2);
        ha.add(s3);

        for(student hh:ha) {
    
    
            System.out.println(hh.getName()+" "+hh.getAge());
        }

    }
}

LinkedHashSet集合特点

哈希表和链表实现的Set接口,具有可预测的迭代次序。
由链表保持数组的顺序,用hashset保持数组的唯一
该实现与HashSet不同之处在于它保持双向链接列表的所有条目。

TreeSet集合

特点:元素有序,具体的排序方式取决于构造方法
无参构造方法:TreeSet()使用自然排序,就是让所属的类实现
带参构造方法:Comparator接口,就是让集合构造方法接收Comparator 的实现类对象,重写(Compare(To1,To2)方法;

扫描二维码关注公众号,回复: 16185610 查看本文章

代码实例,先按年龄排序,后按姓名排序:

package treeset;

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

public class treeset {
    
    
    public static void main(String[] args) {
    
    
        TreeSet<student> tr = new TreeSet<student>(new Comparator<student>() {
    
    
            @Override
            public int compare(student s1, student s2) {
    
    
                int num = s1.getAge() - s2.getAge();
                int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
                return num2;
            }
        });
        student s1 = new student("zzha",23);
        student s2 = new student("asds",23);

        tr.add(s1);
        tr.add(s2);
        for(student s: tr){
    
    
            System.out.println(s.getName()+" "+s.getAge());

        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_52723971/article/details/110692767