本帖最后由 刘汉文 于 2013-12-30 23:17 编辑
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\459787839\QQ\WinTemp\RichOle\9~8Y$8V7VXM}X9VB(U(O4$U.jpg
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\459787839\QQ\WinTemp\RichOle\9~8Y$8V7VXM}X9VB(U(O4$U.jpg
因为TreeSet底层为二叉树数据结构,上面程序中的R对象是一个正常重写了equals方法和comparable方法类,这两个方法都以R对象的count属性作为判断的依据。可以看到程序第一次输出的结果是有序排列的。此时小值在左边,大值在右边。
当改变R对象的count属性,程序的输出结果也发生了改变,而且包含了重复元素。一旦改变了TreeSet集合里可变元素的属性,当再试图删除该对象时,TreeSet会先选择5作为节点开始比较,所以count为5的R对象可以删除成功,之后删除count为-2的R对象时,如果有count为6的R对象,则以其为节点比较,比较结果比6小,所以往左边与20比较,发现还小,继续向左,发现没有元素,所以false。
而没有6,则选择最靠近的5的-2作为节点,所以可以删除。 总结:与HashSet在处理这些对象时将非常复杂,而且容易出错。为了让程序更具健壮,推荐HashSet和TreeSet集合中只放入不可变对象。
|