总结一下 Set 在使用时需要的注意事项:
Set (interface): 为了实现唯一性,需要实现 equals 方法
HashSet : 实现 hashCode 方法
TreeSet: 实现 Comparable 接口,实现compareTo方法
LinkedHashSet: 实现 hashCode方法
结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[5, 6, 2, 4, 7, 7, 6, 7, 9, 1, 1, 5, 6, 0, 8, 2, 4, 5, 0, 1, 4, 8, 3, 2, 8, 3, 9, 9, 3, 0]
[4, 0, 1, 1, 2, 8, 8, 2, 5, 9, 2, 6, 0, 7, 9, 7, 3, 4, 9, 0, 6, 6, 8, 5, 4, 7, 3, 3, 1, 5]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
SetType cannot be cast to java.lang.Comparable
HashType cannot be cast to java.lang.Comparable
分析:
前三行,唯一
中四行,失败,不唯一。 原因是 hashCode
后两行, 失败,异常。原因,未实现 Comparable 接口
import java.lang.reflect.InvocationTargetException; import java.util.*; // 简单对象 实现 equals class SetType { int i; public SetType(int n) { i=n; } public boolean equals( Object o ) { if(o!=null && o instanceof SetType) { return i==((SetType)o).i; } return false; } public String toString() { return Integer.toString(i); } } // Hash 对象 ,实现了 hashCode class HashType extends SetType { public HashType(int n) { super(n); } public int hashCode() { return i; } } // Tree对象,实现 compareTo 对象 class TreeType extends SetType implements Comparable<TreeType> { public TreeType(int n){ super(n); } @Override public int compareTo(TreeType o) { return i>o.i?-1:( i==o.i?0:1 ); } } public class TypeForSets { // 填充 static<T> Set<T> fill (Set<T> set, Class<T> type) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { for(int i=0;i<10;i++) set.add( type.getConstructor(int.class).newInstance(i) ); return set; } // 测试 static <T> void test(Set<T> set, Class<T> type) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { fill(set,type); fill(set,type); fill(set,type); System.out.println(set); } public static void main(String [] args) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { // 这些事符合规范的Set使用 test(new HashSet<HashType>(), HashType.class); test(new LinkedHashSet<HashType>(), HashType.class); test(new TreeSet<TreeType>(), TreeType.class); // Things that don't work: // SetType,TreeType对象 未实现hashCode test(new HashSet<SetType>(), SetType.class); test(new HashSet<TreeType>(), TreeType.class); test(new LinkedHashSet<SetType>(), SetType.class); test(new LinkedHashSet<TreeType>(), TreeType.class); // SetType,HashType 未实现 Comparable 接口 try { test(new TreeSet<SetType>(), SetType.class); } catch(Exception e) { System.out.println(e.getMessage()); } try { test(new TreeSet<HashType>(), HashType.class); } catch(Exception e) { System.out.println(e.getMessage()); } } }