大家都知道Set的实现类HashSet中只能存放不重复的元素,但是它也是可以添加重复元素的,只不过是相同的元素被覆盖了而已,如下面的代码:
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());
}
可是输出却和我想的大相径庭。(我认为只输出 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());
}
}
经过我的修改,终于实现了HashSet应该发挥的功能,呵呵。