美文网首页
Java 基础 36 Set集合特点和HashSet集合类

Java 基础 36 Set集合特点和HashSet集合类

作者: 小熊先生很不开心 | 来源:发表于2018-02-03 10:50 被阅读98次

    1.1 Set集合的特点

    • Set:元素唯一,存储元素无序
      • 一个不包含重复元素的 collection
    • HashSet:
      • 它不保证 set 的迭代顺序;
      • 特别是它不保证该顺序恒久不变 。

    1.1.1 案例代码

    package com.itheima_01;
    
    import java.util.HashSet;
    import java.util.Set;
    
    /*
     * Set:
     *      一个不包含重复元素的 collection
     * 
     * HashSet:
     *      它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变
     */
    public class SetDemo {
        public static void main(String[] args) {
            //创建集合对象
            Set<String> set = new HashSet<String>();
            
            //添加元素
            set.add("hello");
            set.add("world");
            set.add("java");
            //唯一
            set.add("world");
            
            //遍历集合
            for(String s : set) {
                System.out.println(s);
            }
            
        }
    }
    

    1.2 HashSet集合类

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

    1.2.1 HashSet保证元素唯一性的原理

      HashSet保证元素唯一性的原理?

      通过查看add方法的源码,我们知道了添加功能的执行过程中,是进行了数据的判断的。

      这个判断的流程是:

    • 首先比较对象的哈希值是否相同,这个哈希值是根据对象的hashCode()计算出来的。
    • 如果哈希值不同,就直接添加到集合中
    • 如果哈希值相同,继续执行equals()进行比较,
      • 返回的是true,说明元素重复,不添加。
      • 返回的是false,说明元素不重复,就添加。

    注意:

      如果我们使用HashSet集合存储对象,你要想保证元素的唯一性,就必须重写hashCode()和equals()方法。

    1.2.1.1 案例代码

    package com.itheima_02;
    
    import java.util.HashSet;
    
    /*
     * HashSet保证元素唯一性的原理?
     * 
     * 通过查看add方法的源码,我们知道了添加功能的执行过程中,是进行了数据的判断的。
     * 这个判断的流程是:
     *      首先比较对象的哈希值是否相同,这个哈希值是根据对象的hashCode()计算出来的。
     *          如果哈希值不同,就直接添加到集合中
     *          如果哈希值相同,继续执行equals()进行比较,
     *              返回的是true,说明元素重复,不添加。
     *              返回的是false,说明元素不重复,就添加。
     * 
     * 如果我们使用HashSet集合存储对象,你要想保证元素的唯一性,就必须重写hashCode()和equals()方法。
     */
    public class HashSetDemo {
        public static void main(String[] args) {
            //创建集合对象
            HashSet<String> hs = new HashSet<String>();
            
            //添加元素
            hs.add("hello");
            hs.add("world");
            hs.add("java");
            hs.add("world");
            
            //遍历集合
            for(String s : hs) {
                System.out.println(s);
            }
        }
    }
    

    1.2.2 HashSet集合的练习存储自定义对象并遍历

    HashSet集合存储自定义对象并遍历

    提示:

      自定义一个学生类,给出成员变量name和age。遍历集合的时候,在控制台输出学生对象的成员变量值。

    • 两种方式遍历
      • 迭代器
      • 增强for

    1.2.2.1 案例代码

    package com.itheima_03;
    
    public class Student {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            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;
        }
    }
    
    
    package com.itheima_03;
    
    public class Student {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            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;
        }
    }
    
    
    
    package com.itheima_03;
    
    import java.util.HashSet;
    import java.util.Iterator;
    
    /*
     * HashSet集合存储自定义对象并遍历
     * 提示:自定义一个学生类,给出成员变量name和age。遍历集合的时候,在控制台输出学生对象的成员变量值。
     * 两种方式遍历
     *      迭代器
     *      增强for
     */
    public class HashSetTest {
        public static void main(String[] args) {
            //创建集合对象
            HashSet<Student> hs = new HashSet<Student>();
            
            //创建元素对象
            Student s1 = new Student("林青霞",30);
            Student s2 = new Student("张曼玉",35);
            Student s3 = new Student("王祖贤",33);
            
            //把元素添加到集合
            hs.add(s1);
            hs.add(s2);
            hs.add(s3);
            
            //遍历
            //迭代器
            Iterator<Student> it = hs.iterator();
            while(it.hasNext()){
                Student s = it.next();
                System.out.println(s.getName()+"---"+s.getAge());
            }
            System.out.println("------------------");
            
            //增强for
            for(Student s : hs) {
                System.out.println(s.getName()+"---"+s.getAge());
            }
        }
    }
    

    1.2.3 HashSet 集合的练习存储自定义对象保证元素唯一性

      HashSet集合存储自定义对象并遍历

      要求:如果对象的成员变量值相同,就认为是同一个元素。
    提示:
    自定义一个学生类,给出成员变量name和age。遍历集合的时候,在控制台输出学生对象的成员变量值。

    • 两种方式遍历
      • 迭代器
      • 增强for

      注意

      因为我们存储的元素所属的类没有重写hashCode()和equals()方法,所以保证不了元素的唯一性。
    而我想保证,怎么办呢?重写这两个方法就可以了。
    如何重写呢?自动生成就可以了。

    1.2.3.1 案例代码

    package com.itheima_04;
    
    public class Student {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            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 int hashCode() {
            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;
        }
    
    
    package com.itheima_04;
    
    import java.util.HashSet;
    
    /*
     * HashSet集合存储自定义对象并遍历
     * 要求:如果对象的成员变量值相同,就认为是同一个元素。
     * 提示:自定义一个学生类,给出成员变量name和age。遍历集合的时候,在控制台输出学生对象的成员变量值。
     * 两种方式遍历
     *      迭代器
     *      增强for
     * 
     * 因为我们存储的元素所属的类没有重写hashCode()和equals()方法,所以保证不了元素的唯一性。
     * 而我想保证,怎么办呢?重写这两个方法就可以了。
     * 如何重写呢?自动生成就可以了。
     */
    public class HashSetTest {
        public static void main(String[] args) {
            //创建集合对象
            HashSet<Student> hs = new HashSet<Student>();
            
            //创建元素对象
            Student s1 = new Student("林青霞",30);
            Student s2 = new Student("张曼玉",35);
            Student s3 = new Student("王祖贤",33);
            Student s4 = new Student("林青霞",30);
            Student s5 = new Student("张曼玉",35);
            
            //把元素添加到集合
            hs.add(s1);
            hs.add(s2);
            hs.add(s3);
            hs.add(s4);
            hs.add(s5);
            
            //遍历集合
            //增强for
            for(Student s : hs) {
                System.out.println(s.getName()+"---"+s.getAge());
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Java 基础 36 Set集合特点和HashSet集合类

          本文链接:https://www.haomeiwen.com/subject/zdfuzxtx.html