Javase学习记录之------set集合

我怕爱的太早我们不能终老 提交于 2019-11-26 00:24:52

Collection
1–List
有序(存储顺序和取出顺序一致),可重复

2–Set
无序(存储顺序和取出顺序不一致),唯一
虽然Set集合无需,但是,作为集合来说,他肯定有它自己的存储顺序,而你的顺序和它的存储顺序一致,这代表不了有序;
你可以多存储一些数据,就可以看到效果;

HashSet:它不可保证set的迭代顺序,特别是它不保证该顺序恒久不变,

public class Student {
    public String name;
    public int age;

    public Student(String name,int age) {
        this.name = name;
        this.age=age;
    }
    //重写
    @Override
    public int hashCode() {
        /*
        return 0;如果有10000个元素要比,会使后面相比的效率太低,所以我们尽可能让他们的哈希值不同
        因为成员变量值,影响了哈希值,所以我们把成员变量值相加即可
        return this.name.hashCode()+this.age;
        但这样也不够好,如:
        s1:name.hashCode()=40;this.age=30;
        s2:name.hashCode()=20;this.age=50;
        为尽可能的区分,我们把他们乘一些整数
         */
        return this.name.hashCode()+this.age*13;
    }
    //不管哪个对象调用这个方法,返回值都是0,那么他们的哈希值就会是一样的,就可以执行接下来的equals()方法了;


    /*
    这个方法发重写分3步
    1:提高效率的
    2:如果你不是学生的对象,那就没用必要比较了,没用可比性
    3:把你转成学生
     */

    @Override
    public boolean equals(Object obj) {
        if(this==obj){
            return true;
        }
        if(!(obj instanceof Student)){
            return false;
        }
        Student s=(Student)obj;
        return this.name.equals(s.name) && this.age==s.age;
        //比较自己想比较的属性值是否相等,如果相等,就返回true;

    }

    /*
    学完了,结果发现这2个重写不用自己写,你只要导入就可以了,eclipse和idea都有快捷键。。。。
    右键Generate 选择equals() and hashCode()就可以了
    下面是它为我们导入的


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
     */


}
import java.util.HashSet;
import java.util.Set;
public class Demo {
    public static void main(String[] args) {
        //创建集合对象
        Set<String> set=new HashSet<String>();
        //创建并添加元素
        set.add("hello");
        set.add("world");
        set.add("java");

        //增强for
        for(String s:set){
            System.out.println(s);
        }


        /*
        需求:存储自定义对象,并保证元素我唯一性;
        要求:如果两个元素的成员变量值都相等,则为同一个元素

        目前是不符合需求的,因为我们知道HashSet底层是依赖hashCode()和equals()方法;
        而这2个方法我们在学生类中没用重写,所有默认是Object类;
        而这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作
        具体可以看看源码;17.13附近那几p说了,要是忘了回去看看;
        只有哈希值相同,才能执行equals()方法;
        解决:方法重写
         */
        //创建集合对象
        HashSet<Student> hs=new HashSet<Student>();
        //创建学生对象
        Student s1=new Student("林青霞",27);
        Student s2=new Student("柳岩",22);
        Student s3=new Student("王祖贤",30);
        Student s4=new Student("林青霞",27);
        Student s5=new Student("林青霞",20);
        Student s6=new Student("范冰冰",22);
        //添加元素
        hs.add(s1);
        hs.add(s2);
        hs.add(s3);
        hs.add(s4);
        hs.add(s5);
        hs.add(s6);
        //遍历集合
        for(Student s:hs){
            System.out.println(s.name+"----"+s.age);
        }

    }
}

程序运行结果为:
world
java
hello
林青霞----20
林青霞----27
范冰冰----22
柳岩----22
王祖贤----30

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!