HashSet用法

HashSet是无序(输入和输出顺序不一样),不重复,底层数据结构是哈希表。

package test1;

import java.util.HashSet;
import java.util.Iterator;

class Person{
private String name;
private int age;
Person(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;
}
}
public class test {
public static void main(String[] args){
HashSet hs=new HashSet();
hs.add(new Person("li",23));//返回值类型为boolean
hs.add(new Person("li",23));
hs.add(new Person("li2",23));
Iterator it=hs.iterator();
while(it.hasNext()){
Person ps=(Person)it.next();
System.out.println(ps.getName()+"    "+ps.getAge());
}
}

}

运行输出结果:

li    23
li    23
li2    23

由结果可以发现,输出了两个相同元素,和HashSet元素不重复特点矛盾,其实不然

可以直接根据hashcode值判断两个对象是否相等吗?肯定是不可以的,因为不同的对象可能会生成相同的hashcode值。虽然不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。

两个Person对象是new出来的,哈希值不一样,就是两个对象,所以都输出来了。

HashSet判断两个对象相等的标准是,先看哈希值是否相等,若不相同,则为两个对象,若相同,再判断equals方法是否返回true。

下面重写hashCode()  equals()方法

package test1;


import java.util.HashSet;
import java.util.Iterator;


class Person{
private String name;
private int age;
@Override
public int hashCode() {
return 100;

//return name.hashCode()+age;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person))
return false;
Person p =(Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
Person(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;
}
}
public class test {
public static void main(String[] args){
HashSet hs=new HashSet();
hs.add(new Person("li",23));
hs.add(new Person("li",23));
hs.add(new Person("li2",23));
Iterator it=hs.iterator();
while(it.hasNext()){
Person ps=(Person)it.next();
System.out.println(ps.getName()+"    "+ps.getAge());
}
}
}

运行输出结果:

li    23
li2    23


Hhashset

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值