HashSet实现Set接口,Set接口继承Collection接口,Set容器中的对象都是唯一的,加入 Set容器中的对象都必须覆盖equals()方法,作为唯一性的识别,Set容器有自己的一套排序规则。
HashSet的排序规则是利用Hash Table,所以加入HashSet容器的对象还必须覆盖hashCode()方法,利用Hash的方式,可以让您快速的找到容器中的对象,在比较两个加入Set容器中的对象是否相同时,会先比较hashCode()方法传回的值是否相同,如果相同,则再使用equals()方法比较,如果两者都相同,则视为相同的对象。
事实上,在撰写新的类时,最好总是覆盖equals()与hashCode()方法,以符合Java的设计规范,您可以引用 Object 类 中的介绍了解如何覆盖equals()与hashCode()。
来看一个例子:
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(); } }
执行结果:
如上所示的,即使重覆加入了"justin"字符串,HashSet中仍只有一个"justin"字符串对象,另一个要注意的是,选代所有的值时,其顺序
与您加入的顺序是不一样的,选代所有值时的顺序是HashSet排序过后的顺序。
LinkedHashSet是HashSet的子类,它在内部实现使用Hash
Code进行排序,然而允许您在枚举时行为像是LinkedList,简单的改写上面的程序即可了解:
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(); } }
执行结果:
可以在执行结果中看到的,选代时的顺序正是您加入值的顺序。 |