Java—Set

目录

3. Set

3.1Set集合概述和特点

3.2 哈希值

3.3常见数据结构之哈希表

案例:HashSet集合存储学生对象并遍历

3.4LinkedHashSet集合概述和特点

3.5TreeSet集合概述和特点

3.6自然排序Comparable的使用

3.7比较器排序Comparator的使用


3. Set

3.1Set集合概述和特点

Set集合特点
        不包含重复元素的集合
        没有带索引的方法,所以不能使用普通for循环遍历

HashSet对集合的迭代顺序不做保证

package zyy07;

import java.util.HashSet;
import java.util.Set;

public class Demo {
    public static void main(String[] args) {
        //创建集合对象
        Set<String> s=new HashSet<>();
        //添加元素
        s.add("zyy");
        s.add("and");
        s.add("jw");
        s.add("zyy");
        for(String s1: s){
            System.out.println(s1);
        }
    }
}

3.2 哈希值

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

Object类中有一个方法可以获取对象的哈希值
        public int hashCode():返回对象的哈希码值

对象的哈希值特点
        同一个对象多次调用hashCode)方法返回的哈希值是相同的
        默认情况下,不同对象的哈希值是不同的。而重写hashCode0方法,可以实现让不同对象的哈希值相后

package zyy07;

import java.util.HashSet;
import java.util.Set;

public class Demo {
    public static void main(String[] args) {
        //创建集合对象
        HashSet<String> h=new HashSet<>();
        h.add("zyy");
        h.add("and");
        h.add("kiki");
        for(String s: h){
            System.out.println(s);
        }
    }
}

3.3常见数据结构之哈希表

                重复元素不存储

案例:HashSet集合存储学生对象并遍历

需求:创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
        要求:学生对象的成员变量值相同,我们就认为是同一个对象

思路:

        定义学生类
        创建HashSet集合对象

        创建学生对象
        把学生添加到集合

        遍历集合(增强for)
        在学生类中重写两个方法
                hashCode()和equals()自动生成即可

学生类:

package com.test;

public class student {
    //成员变量
    private String name;
    private int age;

    //构造方法
    public student(){
    }
    public student(String name,int age){
        this.name=name;
        this.age=age;
    }

    //成员方法
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return age;
    }
    //为了保证元素的唯一性要重写equals和hashcode两个方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        student student = (student) o;

        if (age != student.age) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
}

测试类:

package com.test;

import java.util.HashSet;

public class studentdemo {
    public static void main(String[] args) {
        //创建对象
        HashSet<student> a=new HashSet<>();
        //创建学生对象
        student s1=new student("zyy",14);
        student s2=new student("jwei",18);
        student s3=new student("hwj",14);
        student s4=new student("hwj",14);
        //把学生添加到集合
        a.add(s1);
        a.add(s2);
        a.add(s3);
        a.add(s4);
        //增强for
        for(student s: a){
            System.out.println(s.getName()+","+s.getAge());
        }
    }
}

3.4LinkedHashSet集合概述和特点

LinkedHashSet集合特点
        哈希表和链表实现的Set接口,具有可预测的迭代次序
        由链表保证元素有序,也就是说元素的存储和取出顺序是一致的

        由哈希表保证元素唯一,也就是说没有重复的元素

LinkedHashSet集合练习
        存储字符串并遍历

package zyy07;

import java.util.LinkedHashSet;

public class Demo {
    public static void main(String[] args) {
        //创建集合对象
        LinkedHashSet<String> h=new LinkedHashSet<>();
        //添加元素
        h.add("zyy");
        h.add("and");
        h.add("kiki");
        h.add("kiki");
        //遍历集合
        for(String s: h){
            System.out.println(s);
        }
    }
}

3.5TreeSet集合概述和特点

TreeSet集合特点
        1、元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
                TreeSet):根据其元素的自然排序进行排序
                TreeSet(Comparatorcomparator):根据指定的比较器进行排序

       2、 没有带索引的方法,所以不能使用普通for循环谝历

       3、由于是Set集合,所以不包含重复元素的集合

TreeSet集合练习
        存储整数并遍历

package zyy07;


import java.util.TreeSet;

public class Demo {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet<Integer> h=new TreeSet<>();
        //添加元素
        h.add(12);
        h.add(11);
        h.add(16);
        h.add(14);
        h.add(14);
        //遍历集合
        for(Integer s: h){
            System.out.println(s);
        }
    }
}

3.6自然排序Comparable的使用

存储学生对象并遍历,创建TreeSet集合使用无参构造方法
        要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

结论
        用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的

        自然排序,就是让元素所属的类实现Comparable接口重写compareTo(To)方法

        重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

学生类:

package com.test;

public class student implements Comparable<student> {
    //成员变量
    private String name;
    private int age;

    //构造方法
    public student(){
    }
    public student(String name,int age){
        this.name=name;
        this.age=age;
    }

    //成员方法
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return age;
    }

    @Override
    public int compareTo(student o) {
        //return 0;返回0认为相同元素,所以不添加
        //return 1;返回正数按升序存储
        //return -1;返回复数按降序存储
        int num= this.age-o.age;//升序
        //int num1=o.age-this.age;//降序
        int num2=num==0?this.name.compareTo(o.name):num;
        return num2;
    }
}

测试类:

package com.test;


import java.util.TreeSet;

public class studentdemo {
    public static void main(String[] args) {
        //创建对象
        TreeSet<student> a=new TreeSet<>();
        //创建学生对象
        student s1=new student("zyy",14);
        student s2=new student("jwei",18);
        student s3=new student("hwj",13);
        student s4=new student("kiki",12);
        //把学生添加到集合
        a.add(s1);
        a.add(s2);
        a.add(s3);
        a.add(s4);
        //增强for
        for(student s: a){
            System.out.println(s.getName()+","+s.getAge());
        }
    }
}

3.7比较器排序Comparator的使用

存储学生对象并遍历,创建TreeSet集合使用带参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

结论
        用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
        比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(To1To2)方法

        重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

学生类:

package com.test;

public class student implements Comparable<student> {
    //成员变量
    private String name;
    private int age;

    //构造方法
    public student(){
    }
    public student(String name,int age){
        this.name=name;
        this.age=age;
    }

    //成员方法
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age=age;
    }
    public int getAge(){
        return age;
    }

    @Override
    public int compareTo(student o) {
        //return 0;返回0认为相同元素,所以不添加
        //return 1;返回正数按升序存储
        //return -1;返回复数按降序存储
        int num= this.age-o.age;//升序
        //int num1=o.age-this.age;//降序
        int num2=num==0?this.name.compareTo(o.name):num;
        return num2;
    }
}

测试类:

package com.test;


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

public class studentdemo {
    public static void main(String[] args) {
        //创建对象
        TreeSet<student> a=new TreeSet<student>(new Comparator<student>() {
            @Override
            public int compare(student o1, student o2) {
                int num=o1.getAge()-o2.getAge();
                int num2=num==0?o1.getName().compareTo(o2.getName()):num;
                return num2;
            }
        });
        //创建学生对象
        student s1=new student("zyy",14);
        student s2=new student("jwei",18);
        student s3=new student("hwj",13);
        student s4=new student("kiki",12);
        //把学生添加到集合
        a.add(s1);
        a.add(s2);
        a.add(s3);
        a.add(s4);
        //增强for
        for(student s: a){
            System.out.println(s.getName()+","+s.getAge());
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值