public class TestSet { public static void main(String[] args) { Random rand = new Random(); Set<String> setStr = new HashSet<String>(); String aa=new String("aaa"), bb=new String("aaa"); System.out.println(aa==bb); setStr.add(aa); setStr.add(bb); System.out.println(setStr); System.out.println(setStr.size()); System.out.println(); } } //显示结果是: //false //[aaa] //1 //HashSet里持有的对象是String类或者Integer类,那就可以保证元素的值不重复,但如果存放的是我自己写的类的话,那就肯定会有重复的元素,比如下面这段程序: Set<MyObj> setobj = new HashSet<MyObj>(); for(int i=0;i<30;i++) { setobj.add(new MyObj(rand.nextInt(10))); } System.out.println(setobj); System.out.println(setobj.size()); System.out.println(); //显示结果如下: //[9, 1, 5, 3, 1, 7, 6, 5, 6, 1, 3, 2, 5, 0, 3, 6, 6, 6, 9, 8, 6, 5, 5, 8, 5, 1, 1, 2, 3, 0] //30 //很明显元素的值重复了,谁能告诉我这是为什么呢??哎 //另外,MyObj类如下: public class MyObj implements Comparable<MyObj>,Serializable { private int i; public MyObj(int i) { this.i=i; } public int getI() { return i; } public String toString() { return Integer.toString(i); }
public int compareTo(MyObj obj) { if (this.getI()>obj.getI()) return 1; else if (this.getI()==obj.getI()) return 0; else return -1; } } //给MyObj类加上了一个hashCode()方法和equals()方法,于是我的MyObj也不重复了,可能HashSet中,这两个方法必须被覆盖