java set hashcode_Java-hashCode和hashSet

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 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 void print(Set s) {

Iterator it = s.iterator();

while(it.hasNext()){

T name = it.next();

System.out.println(name);

}

System.out.println("------------------------");

}

//遍历方法2

public static void print1(Set s) {

for (T x : s) {

System.out.println(x);

}

System.out.println("------------------------");

}

//遍历方法3

public static void print2(Set s) {

s.forEach(new Consumer() {

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

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值