Set集合

Set子接口

  • 特点:无序(和程序顺序无关)、无下标、元素不可重复
  • 方法:全部继承Collection中的方法

Set 实现类

  • HashSet:
  1. 基于HashCode实现元素不重复
  2. 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入
  • TreeSet:
  1. 基于排列顺序实现元素不重复
  2. 实现了SortedSet接口,对集合元素自动排序
  3. 元素对象的类型必须实现Comparable接口,指定排序规则
    4.通过ComparaTo方法确定是否为重复元素
public class HelloWorld {
    public static void main(String[]  args) {
        //1.创建集合
        Set<String> set=new HashSet<>();
        //2.添加数据
        set.add("苹果");
        set.add("华为");
        set.add("小米");
        System.out.println("数据个数:"+set.size());
        System.out.println(set.toString());
        //3.删除数据
        set.remove("苹果");
        //4.遍历
           //1.增强For
        for (String s : set) {
            System.out.println(s);
        }
          //2.迭代器
        Iterator<String> it=set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        //5.判断
        set.contains("华为");
        }
    }

HashSet

  • 存储结构:哈希表(数组+链表+红黑树)
  • 存储过程(重复依据):
  1. 根据hashcode计算保存的位置,如果此位置为空则直接保存
  2. 位置不为空,执行equals方法。equals方法为true,则认为是重复,否则形成链表

在这里插入图片描述

public class HelloWorld {
    public static void main(String[]  args) {
        //1.新建集合
    HashSet<String> hashSet=new HashSet<>();
       //2.添加元素
        hashSet.add("刘德华");
        hashSet.add("梁朝伟");
        hashSet.add("林志玲");
        hashSet.add("周润发");
        //3.删除数据
        hashSet.remove("刘德华");
        //4.遍历】
           //1.增强for
           //2.迭代器
        Iterator<String> iterator = hashSet.iterator();
        //5.判断
        hashSet.contains("郭富城");
    }
    }

public class HelloWorld {
    public static void main(String[]  args)  {
        //1.创建集合
     HashSet<Person> persons=new Hash  Set<>();
       //2.添加元素
        Person p1=new Person("刘德华",20);
        Person p2=new Person("郭富城",22);
        Person p3=new Person("梁朝伟",18);
persons.add(p1);
persons.add(p2);
persons.add(p3);
//persons.add(p3); //重复
persons.add(new Person("梁朝伟"25));
       

    }
        }
========================================
 @Override
  public int hashCode(){
   int n1=this.name.hashCode();
   int n2=this.age;
   return n1+n2;
}
 //hashCode一样但equals还是false,仍会形成链表 
 ================================
 @Override
  public boolean equals(Object obj){
  if(this==obj){
  retrurn true;
  }
  if(obj==null){
return false;
}
if(obj instance of Person){
Person p=(Person)obj;
if(this.name.equals(p.getName())&&(this.age==p.getAge()){
return true;
 }
}
return false;
       
  • 补充:
    hashCode重写中的31作用:
    (1)31是一个质数,能减少散列冲突,使数据放在不同位置
    (2)31能提高执行效率:31*i=(i<<5)-i

TreeSet

  • 存储结构:红黑树
  • 要求:元素必须实现Comparable接口,comparaTo()方法的返回值为0,认为是重复元素
    在这里插入图片描述
public class HelloWorld {
    public static void main(String[]  args) {
        //1.创建集合
    TreeSet<String> treeSet=new TreeSet<>();
       //2.添加元素
        treeSet.add("xaa");
        treeSet.add("abb");
        treeSet.add("hcc");
        //3.删除元素
        treeSet.remove("xaa");
        //4.遍历
           //增强for
          //迭代器
        Iterator<String> iterator = treeSet.iterator();
        //5.判断
        treeSet.contains("abc");
    }

    }
  • 不能用下面的创建方法创建复杂的类型
  • 原因:没有二叉树大小比较的标准

public class HelloWorld {
    public static void main(String[]  args)  {
        //1.创建集合
     TreeSet<Person> persons=new TreeSet<>();
       //2.添加元素
        Person p1=new Person("刘德华",20);
        Person p2=new Person("郭富城",22);
        Person p3=new Person("梁朝伟",18);
persons.add(p1);
persons.add(p2);
persons.add(p3);
     //3.删除元素
     persons.remove(new Person("梁朝伟",18));//这样是可以删除的,不用equals

  • 添加比较规则
//先按姓名比,然后再按年龄比
    public  class Person implements Comparable<Person>  {
  
    @Override
    public int compareTo(Person o) {
        int n1=this.gatName().compareTo(o.getName());
        int n2=this.age-o.getAge();
        return n1==0?n2:n1;
    }
}
    }
  • Comparator(比较器):实现定制比较
  • Comparable:可比较的
public class HelloWorld {
    public static void main(String[]  args) {
        //创建集合并指定比较规则
 TreeSet<Person>treeSet=new TreeSet<>(new Comparator<Person>() {
     @Override
     public int compare(Person o1, Person o2) {
         int n1=o1.getAge()-o2.getAge();
         int n2=o1.getName().comparaTo(o2.getName());
         return  n1==0?n2:n1;
     }
 });
         Person p1=new Person("刘德华",20);
        Person p2=new Person("郭富城",22);
        Person p3=new Person("梁朝伟",18);
persons.add(p1);
persons.add(p2);
persons.add(p3);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值