package com.test;
import java.util.HashSet;
public class Demo7 {
public static void main(String[] args) {
/*
* Set:无序的,不可重复的
* HashSet:底层是哈希表,线程是不安全的
* TreeSet:底层是二叉树,线程不安全的
*
* hashSet实现不重复的原理:
* 是通过元素内部的hashCode和equals方法实现的去重,首先调用的是hashCode的方法,比较两个元素的哈希值,如果哈希值不同,就认为是两个对象,不在去调用equals,
* 如果哈希值相同再去调用equals方法进行比较,返回true认为是一个对象,返回false认为是两个对象.
*
* 使用HashSet实现对Person1类的对象的保存并去保存
* 分析:重写Person1的hashCode和equals的方法
*
* 注意:
* 1.hashSet本身不能实现排序.
* 2.对于自定义的类,要想实现去重,必须手动重写hashCode和equals方法
*/
HashSet set = new HashSet<>();
//在add()内部实现的去重功能,默认调用hashCode和equals方法,进行去重
//在string中重写了hashCode和equals方法
set.add("java1");
set.add("java2");
set.add("java3");
set.add("ja4");
set.add("ja5");
set.add("java3");//去除重复的后输出
System.out.println(set);//随便放的,去除重复的后输出[java3, java2, java1, ja4, ja5]
HashSet set1=new HashSet<>();
//在add()内部实现的去重功能,默认调用hashCode和equals方法,进行去重
set1.add(new Person("bingbing1", 20));
set1.add(new Person("bingbing2", 200));
set1.add(new Person("bingbing1", 20));
set1.add(new Person("bingbing4", 203));
System.out.println(set1);
}
}
class Person1{
String name ;
int age ;
public Person1 (String name ,int age){
super();
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "Person1 [name=" + name + ", age=" + age + "]";
}
//重写hashCode方法
//按照人的年龄和姓名比较,只要年龄和姓名一致就认为是一个人
public int hashCode (){
return name.hashCode()+age*10000;
}
//重写equals方法
//按照人的年龄和姓名比较,只要年龄和姓名一致就认为是一个人
public boolean equals(Object obj){
if (!(obj instanceof Person1)) {
throw new ClassCastException();
}
//向下转型
Person1 person= (Person1)obj;
return this.age==person.age && this.name.equals(person.name);
}
}
HashSet
最新推荐文章于 2024-07-17 10:09:49 发布