遍历时元素发生变化时Treeset的行为

时间:2013-04-25 14:29:41

标签: java

或许是一个新手问题,如果我在遍历TreeSet时更改了TreeSet中的元素会发生什么?这是否会导致对集合中元素的重新排序?

1 个答案:

答案 0 :(得分:2)

  

这是否会导致对集合中元素的重新排序?

不,改变集合中的元素不会导致树集的重新排序。你永远不应该那样做,因为一旦你做出改变顺序的变异,你的元素就会在树中丢失。你应该做的是删除元素,改变它改变排序的属性,然后重新插入它。

考虑这个示例类:

class Student : Comparable<Student> {
    private String name;
    public Student(String name) {this.name = name;}
    public final String getName() {return name;}
    public final void setName(String name) { this.name = name;}
    public int compareTo<Student>(Student other) {
        return name.compareTo(other.name);
    }
}

如果你设置这样的树

TreeSet<Student,Integer> gradeInMath = ...

然后决定更改学生的姓名时,你应该这样做:

Student nameChangeStudent = new Student("Joe");
Integer theGrade = gradeInMath.remove(nameChangeStudent);
nameChangeStudent.setName("Jack");
gradeInMath.put(nameChangeStudent, theGrade);

正如你所看到的,这根本不是很好。这就是为什么作为一般规则你应该更喜欢地图的不可变键,基于散列和基于树。