Java:通过修改作为参数传递的对象使数据结构无效

Java:通过修改作为参数传递的对象使数据结构无效,java,generics,data-structures,binary-search-tree,avl-tree,Java,Generics,Data Structures,Binary Search Tree,Avl Tree,我正在研究AVL树的Java通用实现(源代码位于),我遇到了一个特定的问题:如果我向insert方法传递一个参数T key,然后在插入后修改key字段,那么数据结构就会损坏 我怎样才能避免这种情况?我是否可以传递一个对象,要求用户以后不能修改它,而是通过实现我的avl树来修改它 提前感谢您可以在插入时克隆密钥。这样,对原始对象的任何更改都不会对插入的对象生效。除非数据是不可变的,否则我不知道如何完全避免,但您可以做一些事情来分离数据。我的意思是:可以使用传入的比较器来设置树,而不是T exten

我正在研究AVL树的Java通用实现(源代码位于),我遇到了一个特定的问题:如果我向insert方法传递一个参数T key,然后在插入后修改key字段,那么数据结构就会损坏

我怎样才能避免这种情况?我是否可以传递一个对象,要求用户以后不能修改它,而是通过实现我的avl树来修改它


提前感谢

您可以在插入时克隆密钥。这样,对原始对象的任何更改都不会对插入的对象生效。

除非数据是不可变的,否则我不知道如何完全避免,但您可以做一些事情来分离数据。我的意思是:可以使用传入的比较器来设置树,而不是
T extends Comparable


然后,客户端可以在插入后修改数据,而不会损坏树,前提是它只修改比较器中未使用的字段。这迫使客户思考他想要什么,不想修改什么,并提供了一点灵活性。

简而言之,这是不可避免的。如果对象的更改方式影响其compareTo方法,则通常需要重新插入该对象。这就是为什么建议在例如
HashMaps
中仅将不可变对象用作键的原因。我认为这是相关的。放松点,接受不可能让一切都防弹的事实。如果用户在插入后修改其密钥,则会损坏其avl树。如果限制被记录在案,那就不再是你的事了。与
TreeSet
HashSet
相比,两者都不受影响订单响应的更改的影响。散列码。这是我想出的第一个解决方案。但是我不知道它的效率有多高,因为用户可以检索密钥并修改它。再次克隆它有问题吗?