Set集合

Set元素不可以重复,是无序的。
Set 接口的方法和Collection一致。
|——-HashSet:
内部数据结构是哈希表,是不同步的。
是通过HashCode和equals方法来完成判断对象的唯一性。
如果对象的hashcode值不同,不用判断equals方法。
如果对象的hashcode值相同,则判断equals方法是否为true。
如果为true,视为元素相同,不存。如果为false,那么视为元素不同,就进行存储。
【注意】
1、如果元素要存储到HashSet集合中,就必须覆盖hashCode方法和equals方法。建立判断对象是否相同的依据。
2、如果想保证存入的元素有序,改用LinkedSet集合进行存储。
|——–TreeSet:
可以对元素进行排序,内部数据结构是二叉树,是不同步的,
判断元素唯一性的方法:就是根据比较方法的返回结果是否为0,是0,就是相同,不存。
TreeSet对元素进行排序的方式—:
让元素自身具备比较性,(元素对应的类要实现Comparable)接口。覆盖compare方法。
TreeSet对元素进行排序的方式二:
让集合自身具备比较功能,定义一个实现Comparator接口,覆盖compare方法。
将该类对象作为参数传递给TreeSet集合的构造函数。
【注意】
如果在集合的构造函数中传入了比较器。那么自动屏蔽元素自身具备的比较方法。
这里写图片描述
为了提高二叉树的查找效率,在在存入新的元素之前,对已有的有序元素进行折半,再确定新元素的位置。

代码演示:
1.创建要在集合中添加的类

public class Person implements Comparable{
 private int age;
 private String name;

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

public int getAge() {
    return age;
}

public String getName() {
    return name;
}


@Override
public int compareTo(Object o) {
    //强制类型转换
    Person temp=(Person)o;
    int flag=this.age-temp.age;
    return flag==0?this.name.compareTo(temp.getName()):flag;
}

}

2.创建一个比较器类

import java.util.Comparator;

public class CompareByName implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        Person p=(Person)o1;
        Person p1=(Person)o2;
        int flag=p1.getName().compareTo(p.getName());
        return flag==0?p1.getAge()-p.getAge():flag;
        //根据二叉树的特性,如果想要元素有序存储,只需要更改返回值即可。
        //例如:正序return 1;逆序return -1;
    }

}

3.测试类

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

public class TreeSetDemo {
    public static void main(String[] agrs)
    {
        //创建一个TreeSet对象
        TreeSet ts=new TreeSet(new CompareByName());
        ts.add(new Person(16,"zhangsan"));
        ts.add(new Person(20,"lisi"));
        ts.add(new Person(20,"wangwu"));
        ts.add(new Person(19,"zhouqi"));
        Iterator it=ts.iterator();
        while(it.hasNext())
        {
            Person p=(Person)it.next();
            System.out.println(p.getAge()+"==="+p.getName());
        }
    }
}

测试结果:
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值