# java.集合（Ⅲ）.Set.HashSet

174人阅读 评论(0)

Set
|——set：元素是无序的（存入的元素和取出的元素顺序不一定一致），元素不可以重复
|——HashSet:底层数据结构是哈希表
HashSet是怎样保证元素的唯一性呢？

|——TreeSet
Set集合的功能和Collection是一致的。

⑴HashSet：

import java.util.*;
public class Set {
public static void write(Object obj)
{
System.out.println(obj);
}

public static void main(String[] args) {
HashSet hs =new HashSet();

for(Iterator it =hs.iterator();it.hasNext();)
{
write(it.next());
}
}
}

import java.util.*;
class fPerson
{
private String name;
private int age;
fPerson(String name,int age)
{
this.name = name;
this.age = age;
}

public boolean equals(Object obj)
{
fPerson p = (fPerson)obj;
System.out.println(this.name+"..equals.."+p.name);
return this.name.equals(p.name)&&this.age==p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}

public class Set {

public static void write(Object obj)
{
System.out.println(obj);
}

public static void main(String[] args) {
HashSet hs =new HashSet();

for(Iterator it =hs.iterator();it.hasNext();)
{
fPerson p =(fPerson)it.next();
write(p.getName()+"...."+p.getAge());
}
}
}

package test;

import java.util.*;
class fPerson
{
private String name;
private int age;
fPerson(String name,int age)
{
this.name = name;
this.age = age;
}
//hashCode是返回哈希值的函数
public int hashCode() //因为在HashSet中，如果哈希值不一样，就不会调用equals对 对象
//进行比较。所以如果要对自定义内容进行比较，在HashSet中，必须使哈希值一致
{
return 60;
}

public boolean equals(Object obj)
{
fPerson p = (fPerson)obj;
System.out.println(this.name+"..equals.."+p.name);
return this.name.equals(p.name)&&this.age==p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}

public class Set {

public static void write(Object obj)
{
System.out.println(obj);
}

public static void main(String[] args) {
HashSet hs =new HashSet();

for(Iterator it =hs.iterator();it.hasNext();)
{
fPerson p =(fPerson)it.next();
write(p.getName()+"...."+p.getAge());
}
}
}

package test;

import java.util.*;
class fPerson
{
private String name;
private int age;
fPerson(String name,int age)
{
this.name = name;
this.age = age;
}
//hashCode是返回哈希值的函数
public int hashCode() //因为在HashSet中，如果哈希值不一样，就不会调用equals对 对象
//进行比较。所以如果要对自定义内容进行比较，在HashSet中，必须使哈希值一致
{
System.out.println(this.name+".....hasCode");
return name.hashCode()+age*39;  //通过返还有对应性的哈希值，能有效的减少比较的次数
//通过乘一个值，保证不会因为特殊数值导致返回的哈希值一样而增加比较次数
}

public boolean equals(Object obj)
{
fPerson p = (fPerson)obj; //多态，父类对象转换为子类类型
System.out.println(this.name+"..equals.."+p.name);//显示比较的过程
return this.name.equals(p.name)&&this.age==p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}

public class Set {

public static void write(Object obj)
{
System.out.println(obj);
}

public static void main(String[] args) {
HashSet hs =new HashSet();

for(Iterator it =hs.iterator();it.hasNext();)
{
fPerson p =(fPerson)it.next();
write(p.getName()+"...."+p.getAge());
}
}
}

1.HashSet中，比较和删除等主要依靠hashCode和equals两个方法，所以在用HashSet时，覆盖这两个函数极为常见。
2.在HashSet中进行比较时，先比较哈希值，如果相同，再调用equals进行比较

个人资料
等级：
访问量： 1万+
积分： 357
排名： 22万+
基友博客链接