set详解

一、简介

是Collection的子接口,存储无序的,不可重复的数据,使用的都是Collection中定义的方法

它的实现类有HashSet和TreeSet

二、HashSet

特点:

1.无序性:不等于随机性,它的的底层数据结构虽然是数组但是存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据哈希值。
2.不可重复性:会先根据hashcode()判断hash值是否相同,如果相同再调用equals()方法来判断元素是否相同,如果相同则不再添加进去
3.它是线程不安全的

添加元素的过程:

1、向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值
,判断数组此位置上是否已经有元素,如果此位置上没有其他元素,则元素a添加成功;

2、如果此位置上有其他元素b(或以链表形式存放的多个元素),则需要再调用元素equals()方法比较元素a和b如果返回true,元素a添加失败;否则将元素a添加到b元素所在的链表中

对于链表中的存放顺序,jdk7和jdk8有所不同

jdk7:元素a放在数组中,指向原来的元素
jdk8:原来的元素在数组中,指向元素a

总结:七上八下

HashSet 集合判断两个元素相等的标准:

两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。

HashSet的底层:数组+链表+红黑树

在这里插入图片描述

三、LinkedHashSet

它是HashSet的子类

它相比于HashSet,多了个双向链表来维护元素的次序,因此它能根据插入的顺序遍历出来。但是它实际上存储的时候还是无序的。

四、TreeSet

可以按照对象指定的属性进行排序

特点:
1.不能添加不同数据类型的数据,要求添加进来的数据类型相同
2.要求添加的数据具备比较性
3.它是根据compareTo()来判断元素是否相同的
4.它的底层是红黑数

两种方法让数据具备比较性:
1)自然排序:让类实现Comparable接口

package set.treeset;

import org.testng.annotations.Test;

import java.util.Iterator;
import java.util.TreeSet;

/**
 * Created by lenovo on 2020/11/17.
 */

class User implements Comparable
{
    int age;
    String name;

    public User() {
    }

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

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

    @Override
    public int compareTo(Object o) {
        if(!(o instanceof User))
            throw new RuntimeException("输入类型不匹配");
        User user= (User) o;
        int compare=this.name.compareTo(((User) o).name);
        if(compare==0){
            compare=Integer.compare(this.age,user.age);
        }
        return compare;
    }
}

public class TreeSetDemo {
    @Test
    public void test(){
        TreeSet set=new TreeSet();
        set.add(new User(20,"zhangsan"));
        set.add(new User(21,"lisi"));
        set.add(new User(22,"lisi"));
        set.add(new User(22,"wangwu"));
        set.add(new User(20,"zhangsan"));
        Iterator iterator=set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

执行结果:
在这里插入图片描述
2)定制排序:

package set.treeset;

import org.testng.annotations.Test;

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

/**
 * Created by lenovo on 2020/11/17.
 */

class User implements Comparable
{
    int age;
    String name;

    public User() {
    }

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

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

    @Override
    public int compareTo(Object o) {
        if(!(o instanceof User))
            throw new RuntimeException("输入类型不匹配");
        User user= (User) o;
        int compare=this.name.compareTo(((User) o).name);
        if(compare==0){
            compare=Integer.compare(this.age,user.age);
        }
        return compare;
    }
}

public class TreeSetDemo {
   
    @Test
    public void test2(){
        Comparator comparator=new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                int compare=0;
                if((o1 instanceof User)&&(o2 instanceof User)){
                    User user1= (User) o1;
                    User user2= (User) o2;
                    compare=Integer.compare(user1.age,user2.age);
                    if(compare==0){
                        compare=user1.name.compareTo(user2.name);
                    }
                }
                return compare;
            }
        };
        
        TreeSet set=new TreeSet(comparator);
        set.add(new User(20,"zhangsan"));
        set.add(new User(21,"lisi"));
        set.add(new User(22,"lisi"));
        set.add(new User(22,"wangwu"));
        set.add(new User(20,"zhangsan"));
        Iterator iterator=set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

执行结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值