大家都知道Set的實(shí)現(xiàn)類HashSet中只能存放不重復(fù)的元素,但是它也是可以添加重復(fù)元素的,只不過是相同的元素被覆蓋了而已,如下面的代碼:
Set<String> set=new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("a");
set.add("b");
for (String s : set)
{
System.out.println(s);
}
輸出為:
b
c
a
于是我天真的寫下了下面的代碼
Set<DefaultMutableTreeNode> nodes=new HashSet<DefaultMutableTreeNode>();
DefaultMutableTreeNode node1=new DefaultMutableTreeNode("a");
DefaultMutableTreeNode node2=new DefaultMutableTreeNode("b");
DefaultMutableTreeNode node3=new DefaultMutableTreeNode("b");
DefaultMutableTreeNode node4=new DefaultMutableTreeNode("a");
nodes.add(node1);
nodes.add(node2);
nodes.add(node3);
nodes.add(node4);
for (DefaultMutableTreeNode node : nodes)
{
System.out.println(node.getUserObject());
}
可是輸出卻和我想的大相徑庭。(我認(rèn)為只輸出 a b)
輸出:
b
a
b
a
于是我深入研究了一下HashSet中的add方法的源代碼,恍然大悟。將以上程序更改如下:
Set<MyTreeNode > nodes=new HashSet<MyTreeNode>();
MyTreeNode node1=new MyTreeNode("a");
MyTreeNode node2=new MyTreeNode("b");
MyTreeNode node3=new MyTreeNode("b");
MyTreeNode node4=new MyTreeNode("a");
nodes.add(node1);
nodes.add(node2);
nodes.add(node3);
nodes.add(node4);
for (DefaultMutableTreeNode node : nodes)
{
System.out.println(node.getUserObject());
}
其中MyTreeNode 是我自定義的類。
class MyTreeNode extends DefaultMutableTreeNode
{
MyTreeNode(Object obj)
{
super(obj);
}
@Override
public int hashCode()
{
// TODO Auto-generated method stub
return this.getUserObject().hashCode();
}
@Override
public boolean equals(Object obj)
{
// TODO Auto-generated method stub
MyTreeNode treeNode=(MyTreeNode)obj;
return this.getUserObject().equals(treeNode.getUserObject());
}
}
經(jīng)過我的修改,終于實(shí)現(xiàn)了HashSet應(yīng)該發(fā)揮的功能,呵呵。