29、HashSet简介

Set的特点

Set里面存储的元素不能重复,没有索引,存取顺序不一致。

package com.monkey1024.set;

import java.util.HashSet;

/**
 * Set的特点:元素不能重复,没有索引,存取顺序不一致
 *
 */
public class HashSetTest01 {

    public static void main(String[] args) {

        HashSet<String> hs = new HashSet<>();
        boolean b1 = hs.add("a");
        // 当向set集合中存储重复元素的时候返回为false
        boolean b2 = hs.add("a");
        hs.add("b");
        hs.add("c");
        hs.add("d");
        System.out.println(hs);
        System.out.println(b1);
        System.out.println(b2);
        //可以使用增强for循环或者迭代器进行遍历
        //只要能用迭代器遍历就能使用增强for循环遍历
        for (String string : hs) {
            System.out.println(string);
        }
    }

}

向HashSet中添加自定义的Person对象

package com.monkey1024.bean;

/**
 * Person类
 *
 */
public class Person {

    private String name;
    private int age;

    public Person() {

    }

    public Person(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;
    }

    // 重写toString方法
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }

    //重写equals方法
    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;
        }
        if(obj instanceof Person){
            Person p = (Person)obj;
            if(this.name.equals(p.getName()) && this.age == p.getAge()){
                return true;
            }
        }

        return false;
    }

}

测试类

package com.monkey1024.set;

import java.util.HashSet;

import com.monkey1024.bean.Person;

/**
 * Set的特点:元素不能重复,没有索引,存取顺序不一致
 * 向HashSet中添加自定义类
 *
 */
public class HashSetTest02 {

    public static void main(String[] args) {

        HashSet<Person> hs = new HashSet<>();
        hs.add(new Person("张三", 20));
        hs.add(new Person("张三", 20));
        hs.add(new Person("李四", 22));
        hs.add(new Person("李四", 22));
        hs.add(new Person("李四", 22));

        for (Person p : hs) {
            System.out.println(p);
        }
    }

}

通过上面代码可以发现打印结果中并没有去除Person中name和age相同的对象,而且equals方法也没有被调用。重写一下Person中的hashcode方法,让eclipse自动生成:

@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;
}

然后再执行测试类时,发现打印的结果中已经去除重复的了。
这里需要注意:在向HashSet中存放自定义类型对象时,一定要重写hashCode和equals方法

 

posted @ 2018-12-17 20:26  追风的小蚂蚁  阅读(198)  评论(0编辑  收藏  举报