Java-hashCode和hashSet
2021-01-10 本文已影响0人
hello_world_cxm
package Hello1;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
public class Test14 {
public static void main(String[] args) {
//Set接口规定元素内容不重复
//相同内容的两个对象,最终的hash码可能是不一样,所以经过对hash码换算之后的下标也有可能不一样,所以导致两个内容相同的
//对象被放在了不同的下标下,导致最终的没有去重
//如果hash码的换算结果一样的话,就会调用Studentt类中的equals方法,实现了去重
//如果想要hash码的换算结果一样,那么hashcode就得一样,可以在studentt中实现hashcode()方法,返回int
//HashSet数据结构依然是数组 但是元素不是按照顺序摆放的 看下面add的顺序,注意与打印的结果顺序对比是否一样
//如果保证所有对象hash码是相同的,那么就能保证能去重
//hashcode这种数据结构被称为 散列表 分散排列
//如果让元素分散排列?让不同对象的hash码不同,让相同对象hash码相同,尽可能保证不同对象,返回不同的hashcode,目的为了
//提高存储速度,因为要提高效率就要尽可能少用equals进行对比 目的让元素分散得更加均匀
//重点:覆盖hashCode()方法,保证相同对象返回相同的int,尽可能保证不同对象返回不同的int
//重点:覆盖equals()方法,保证相同对象返回true
Set<Studentt> s=new HashSet<>();
//学生类没有覆盖equals方法,所以默认使用object的equals方法 object 的equals方法则是比较内存地址
Studentt s1 =new Studentt("Liucy",45);
Studentt s2 =new Studentt("cxme",34);
Studentt s3 =new Studentt("kgps",45);
Studentt s4 =new Studentt("Liucy",45);
Studentt s5 =new Studentt("cfefe",45);
System.out.println(s1.hashCode()); //虚拟机 会把hash码经过换算 转为int下标
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println(s4.hashCode());
System.out.println(s5.hashCode());
s.add(s1);
s.add(s2);
s.add(s3);
s.add(s4);
s.add(s5);
print(s);
print1(s);
print2(s);
}
//遍历方法1
public static <T> void print(Set<T> s) {
Iterator<T> it = s.iterator();
while(it.hasNext()){
T name = it.next();
System.out.println(name);
}
System.out.println("------------------------");
}
//遍历方法2
public static <T> void print1(Set<T> s) {
for (T x : s) {
System.out.println(x);
}
System.out.println("------------------------");
}
//遍历方法3
public static <T> void print2(Set<T> s) {
s.forEach(new Consumer<T>() {
@Override
public void accept(T arg0) {
System.out.println(arg0);
}
});
System.out.println("------------------------");
}
}
class Studentt{
String name;
int age;
public Studentt(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Studentt [name=" + name + ", 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;
Studentt other = (Studentt) 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;
}
}