java--Set集合

Posted mo-nv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java--Set集合相关的知识,希望对你有一定的参考价值。

一、Set子接口

  特点:无序、无下标、元素不可重复

  方法:全部继承自Collection中的方法。

package com.monv.jihe;

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

/**
 * 测试Set接口
 * 特点:1、无序、没有下标 2、不能重复
 * @author Administrator
 *
 */

public class Demo6 {
    public static void main(String[] args) {
        //创建集合
        Set <String> set = new HashSet<>();
        //1.添加元素
        set.add("小米");
        set.add("苹果");
        set.add("华为");
//        set.add("华为");//不能重复  所以这个添加不上
        System.out.println("数据个数:"+set.size());
        System.out.println(set.toString());
        
        //2.删除元素
//        set.remove("华为");
//        System.out.println("删除后个数:"+set.size());
//        System.out.println(set.toString());
        
        //3.遍历【重点】
        //3.1.增强for循环
        System.out.println("-----增强for循环------");
        for (String string : set) {
            System.out.println(string);
        }
        //3.2.使用迭代器循环
        System.out.println("-----使用迭代器------");
        Iterator<String> it= set.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
        //4.判断
        System.out.println("-----判断-------");
        System.out.println(set.contains("苹果"));
        System.out.println(set.isEmpty());
    }
}

二、Set的实现类

  1、HashSet(无序的)【重点】

    1). 基于HashCode计算元素存放位置。

    2).当存入元素的哈希码相同时,会调用equals进行确认,如果结构为True,则拒绝后者存入

package com.monv.jihe;

import java.util.HashSet;
import java.util.Iterator;

/**
 * HashSet集合的使用
 * 存储结构:哈希表(数组+链表+红黑树)
 * @author Administrator
 *
 */
public class Demo7 {
    public static void main(String[] args) {
        //新建集合
        HashSet<String> hashSet = new HashSet<>();
        
        //1.添加元素
        hashSet.add("苹果");
        hashSet.add("西瓜");
        hashSet.add("香蕉");
    
        System.out.println("元素个数:"+hashSet.size());
        System.out.println(hashSet.toString());

        //2.删除
//        hashSet.remove("苹果");
//        System.out.println("删除后元素个数:"+hashSet.size());
//        System.out.println(hashSet.toString());
        
        //3.遍历
        //3.1增强for循环
        System.out.println("------增强for循环------");
        for (String string : hashSet) {
            System.out.println(string);
        }
        //3.2迭代器循环
        System.out.println("-----迭代器循环------");
        Iterator<String> it = hashSet.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        //4.判断
        System.out.println("-------判断---------");
        System.out.println(hashSet.contains("西瓜"));
        System.out.println(hashSet.isEmpty());
                
    }
}

2、HashSet的使用

  存储结构:哈希表(数组+链表+红黑树)

  存储过程(重复依据):

  (1)根据hashCode计算保存的位置,如果此位置为空,则直接保存,如果不为空则执行第二步

  (2)再执行equals方法,如果equals方法为True,则认为是重复的,否则,形成链表

  (3)重写HashCode() 和 equals()的快捷操作:Alt+Shift+S -->Generate HashCode() and equals()

package com.monv.jihe;

public class Student implements Comparable<Student>{
    private String name;
    private int age;
    
    public Student() {
        // TODO Auto-generated constructor stub
    }
        
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

    @Override
    public int hashCode() {
        //为什么用31
        //(1)31是一个质数(素数),减少散列冲突(hashCode生成的位置尽量不一样)
        //(2)31提高执行效率 31*i=(i<<5)-i
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    
    @Override
    public int compareTo(Student o) {
        int n1 = this.name.compareTo(o.getName());
        int n2 = this.age - o.getAge();
        return n1==0?n2:n1;
    }
//    @Override
//    public int hashCode() {
//        // TODO Auto-generated method stub
//        int iname = this.name.hashCode();
//        int age = this.age;
//        
//        return iname+age;
//    }
//    
//    @Override
//    public boolean equals(Object obj) {
//        //1.判断是否是同一个对象
//        if(this == obj) {
//            return true;
//        }
//        //2.判断是否为空
//        if(obj == null) {
//            return false;
//        }
//        //3.判断是否是Student类型
//        if (obj instanceof Student) {
//            Student s = (Student)obj;
//            //4.比较属性
//            if (this.name.equals(s.getName())&&this.age == s.getAge()) {
//                return true;
//            }
//        }
//        //5.不满足返回false
//        return false;
//    }
//    
}

---------------------------------------------------------------------
package com.monv.jihe;

import java.util.HashSet;
import java.util.Iterator;

/**
 * HashSet的使用
 * 存储结构:哈希表(数组+链表+红黑树)
 * 存储过程(重复依据)
 * (1)根据hashCode计算保存的位置,如果此位置为空,则直接保存,如果不为空则执行第二步
 * (2)再执行equals方法,如果equals方法为True,则认为是重复的,否则,形成链表
 * @author Administrator
 *
 */
public class Demo8 {
    public static void main(String[] args) {
        //定义集合
        HashSet<Student> students = new HashSet<>();
        //1.添加元素
        Student s1 = new Student("小明", 20);
        Student s2 = new Student("小花", 22);
        Student s3 = new Student("小亮", 21);
        
        students.add(s1);
        students.add(s2);
        students.add(s3);
//        students.add(s3);//重复
        //因为Student类中重写了hashCode方法和equals方法 所以在判断的时候 名字和年龄相同就认为是同一个对象 不会再添加了
        //没有重写hashCode方法和equals方法时,new Student("小亮", 21) 会创建一个新的对象 与s3 对象不相同 所以会添加进去
        students.add(new Student("小亮", 21));
        System.out.println("元素个数"+ students.size());
        System.out.println(students.toString());
        
        //2.删除元素
//        students.remove(s2);
//        System.out.println("删除后元素个数:"+students.size());
//        System.out.println(students.toString());
        //3.遍历
        //3.1 增强For循环
        System.out.println("-----增强for-----");
        for (Student student : students) {
            System.out.println(student.toString());
        }
        //3.2迭代器循环
        System.out.println("-----迭代器-----");
        Iterator<Student> it = students.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
        
        //4.判断
        System.out.println("-------判断---------");
        System.out.println(students.contains(s2));
        System.out.println(students.contains(new Student("小花", 22)));
        System.out.println(students.isEmpty());
        
        
    }
}

 



以上是关于java--Set集合的主要内容,如果未能解决你的问题,请参考以下文章

代码片段 - Golang 实现集合操作

laravel特殊功能代码片段集合

java set集合与List集合练习

Java Set.contains()方法:判断Set集合是否包含指定的对象

java--Set集合

Java set-List集合练习