美文网首页
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集合类

    1.1 Set集合的特点 Set:元素唯一,存储元素无序一个不包含重复元素的 collection HashSet...

  • java基础系列06--集合(2)

    JAVA集合二 Set集合 特点:无索引,不可重复,无序,存取不一致 HashSet类 HashSet原理: 我们...

  • Java集合

    目录: Java集合APICollection 体系Set 集合HashSet 的存储机制:HashSet 还有一...

  • 培训文档

    java基础 集合List:ArrayList,LinkedListSet:HashSet,Li...

  • Java集合总结:Set集合

    Set集合(HashSet是典型实现) set集合特点:1.无序性:set集合是无序的2.不可重复:set集合是不...

  • 集合(二)~Set

    一、Set集合概述和特点 1. Set集合概述和特点 java.util.Set 接口和 java.util.Li...

  • day17

    1:登录注册案例(理解) 2:Set集合(理解) (1)Set集合的特点:无序,唯一 (2)HashSet集合(掌...

  • java常用方法

    java集合的方法:①Set set = new HashSet<>();②set.cont...

  • java常用方法

    java集合的方法:①Set set = new HashSet<>();②set.cont...

  • Java基础语法_Day19

    一、HashSet集合 Set接口的特点 Set体系的集合:A:存入集合的顺序和取出集合的顺序不一致B:没有索引C...

网友评论

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

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