HashSet用法

来源:互联网 发布:vue.js面试题 编辑:程序博客网 时间:2024/05/21 13:56

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

1 0
原创粉丝点击