http://caterpillar.onlyfun.net/GossipCN/JavaGossip

HashSet实作Set介面,Set介面继承Collection介面,Set容器中的物件都是唯一的,加入 Set容器中的物件都必须重新定义equals()方法,作为唯一性的识别,Set容器有自己的一套排序规则。

HashSet的排序规则是利用Hash Table,所以加入HashSet容器的物件还必须重新定义hashCode()方法,利用Hash的方式,可以让您快速的找到容器中的物件,在比较两个加入Set容器中的物件是否相同时,会先比较hashCode()方法传回的值是否相同,如果相同,则再使用equals()方法比较,如果两者都相同,则视为相同的物件。

事实上,在撰写新的类别时,最好总是重新定义equals()与hashCode()方法,以符合Java的设计规范,您可以参考
Object 类别 中的介绍了解如何重新定义equals()与hashCode()。

来看一个例子:

  • HashSetDemo.java
package onlyfun.caterpillar;
 
import java.util.*;
 
public class HashSetDemo {
    public static void main(String[] args) {
        Set<String> set = new HashSet<String>();
        
        set.add("caterpillar");
        set.add("justin");
        set.add("momor");
        set.add("justin");
        
        Iterator iterator = set.iterator();
        while(iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        
        System.out.println(); 
    }
} 


执行结果:

 momor justin caterpillar


如上所示的,即使重覆加入了"justin"字串,HashSet中仍只有一个"justin"字串物件,另一个要注意的是,选代所有的值时,其顺序与您加入的顺序是不一样的,选代所有值时的顺序是HashSet排序过后的顺序。

LinkedHashSet是HashSet的子类,它在内部实作使用Hash Code进行排序,然而允许您在列举时行为像是LinkedList,简单的改写上面的程式即可了解:

  • LinkedHashSetDemo.java
package onlyfun.caterpillar;
 
import java.util.*;
 
public class LinkedHashSetDemo {
    public static void main(String[] args) {
        Set<String> set = new LinkedHashSet<String>();
        
        set.add("caterpillar");
        set.add("justin");
        set.add("momor");
        set.add("justin");
        
        Iterator iterator = set.iterator();
        while(iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        
        System.out.println();
    }
}


执行结果:

 caterpillar justin momor


可以在执行结果中看到的,选代时的顺序正是您加入值的顺序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值