集合框架之Set集合

目录

1.集合特点 

1.1.无序 

1.2.唯一 

1.3.集合存储对象,验证Set集合唯一性

 2.遍历方式

2.1.foreach

 2.2.迭代器

3.常见实现类

3.1.HashSet

3.2.LinkedHashSet

3.3.TreeSet 


 Set集合继承与Collection接口,是一个不允许出现重复元素,并且是没有顺序的集合,主要有HashSet和TreeSet两大实现类

1.集合特点 

1.1.无序 

Set集合添加数据的顺序和取出是不一致的

 

      Set set=new HashSet();
      set.add(1);
      set.add(2);
      set.add(5);
      set.add(6);
      set.add(4);
      System.out.println(set);
1.2.唯一 

相对于List集合Set集合是不允许添加重复数据的

    Set set=new HashSet();
    set.add(1);
    set.add(2);
    set.add(5);
    set.add(6);
    set.add(4);
    set.add(4);
    System.out.println(set);
1.3.集合存储对象,验证Set集合唯一性

给Set集合添加User对象

   Set<User> set=new HashSet();
   set.add(new User(1,"hh",18));
   set.add(new User(2,"zz",19));
   set.add(new User(3,"hh",17));
   set.add(new User(3,"hh",17));
   set.forEach(System.out::println);

输出结果:在存储相同属性的User对象时,Set集合并没有去除重复的属性,集合没有满足唯一性的要求

把User类中的toString注释后,输出了每个对象的域名,并且是不相同的

//com.zking.test.User@74a14482
//com.zking.test.User:类的全路径名
//74a14482:十六进制的内存地址
User u=new User();
u.equals(null);//按住Ctel键,跳到equals方法中查看源码

 在判断重复元素时,Set集合会调用HashCode()和equals()方法来实现,在没有调用equals前默认比较的是Object(引用类型),实际上比较的就是内存地址。

这里我们去User类中重写equals和HashCode方法(快捷键 alt+inset,没有的话可以右键生成)

 @Override
    public boolean equals(Object o) {
        //true:存在相同的元素
        //false:不存在相同的元素
        //当前用户对象是否与传入的用户对象相同
        if (this == o) return true;
        //传入的对象是null或者当前用户对象的类对象不同于传入的学生对象的类对象
        if (o == null || getClass() != o.getClass()) return false;
        //将o强转为User
        User user = (User) o;

//        if (uid != user.uid) return false;
//        if (uage != user.uage) return false;
//        return Objects.equals(uname, user.uname);
        //判断当前的用户姓名与传入的用户姓名是否相同
        if(uname.equals(user.uname)){

            return true;
        }else{
            return false;
        }

    }

    @Override
    public int hashCode() {
        int result = uid;
        result = 31 * result + (uname != null ? uname.hashCode() : 0);
       // result = 31 * result + uage;
        return result;
    }

重写完equals和HashCode方法后,在输出已经可以去除重复的对象属性了,当然以存在的对象信息不是被覆盖了,而是新的对象信息被过滤了。

小结:先比较hashcode值是否相同,在比较equals 

 2.遍历方式

因为Set是无序的,所以不支持for循环(有下标)

2.1.foreach
Set<String> set=new HashSet<String>();
set.add("zs");
set.add("ls");
set.add("ww");
for (String value : set) {
     System.out.println(value);
}
 2.2.迭代器
Set<String> set=new HashSet<String>();
set.add("zs");
set.add("ls");
set.add("ww");
Iterator<String> it = set.iterator();
while(it.hasNext())
System.out.println(it.next());

3.常见实现类

3.1.HashSet
  • 它不允许出现重复元素
  • 不保证集合中的元素顺序
  • 允许包含为null的元素,但最多只有一个
  • HashSet的实现是不同步的
3.2.LinkedHashSet
  • 哈希表和链表实现Set接口,有可预测的迭代次序
  • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的
  • 没有重复的元素
3.3.TreeSet 

TreeSet是一个有序的集合,基于TreeMap实现的,支持两种排序方式:

  • 自然排序
  • 创建TreeSet时提供的Comparator进行排序
  1. java.lang.Comparable:自然比较接口 
public class User implements Comparable<User> {
	private int id;
	private String name;
    ...
	@Override
	public int compareTo(Student b) {
		return this.id-b.id;
    }
}

    2. java.util.Comparator:比较器

public class NameComparator implements Comparator<User> {
    @Override
    public int compare(User a, User b) {
        
      return a.getUname().hashCode()-b.getUname().hashCode();
    }
}

今天就到这里鲁 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值