在java中,即使对象在列表中的顺序发生变化,如何维护相同的哈希代码?

tyg4sfes  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(303)
Class A {
   private String test1;
   private String test2;
}

Class Feature {
   private List<A> obj;

   /* 
    HashCode which should return same value even though i change ordering of objects in List
   */
}

当前行为:

> List<A> contains [obj1, obj2, obj3] -> Some hashCode (Ex: 9058203945)
> List<A> contains [obj2, obj1, obj3] -> Some other hashCode (Ex:-23423423)

我想要的是,如果我改变列表中元素的顺序,我的列表哈希代码应该是相同的。
有什么帮助吗?
提前谢谢

g52tjvyc

g52tjvyc1#

不确定,但我猜你指的是 List#hashCode 方法。

元素的排序就是列表的定义

元素的顺序 List 是列表的核心概念。所以改变顺序会产生另一个列表。这两个列表在概念上是不相等的,因此它们不返回,也不应该返回相同的哈希值(除非是异常巧合,如果使用适当的哈希函数,这是非常罕见的)。
从技术上讲,你可以把 List 类并重写 hashCode 方法。你可以自己做任何你想做的事 hashCode 方法。但这将是一个非常糟糕的想法,因为它违反了 List .

如果您不关心元素的顺序,请使用另一个集合而不是 List . Set 很可能是你需要的。一 Set 包含一堆对象,不一定按任何特定顺序。有些实现是按特定顺序迭代的,有些则不保证任何顺序。

Set < DayOfWeek > setX = Set.of( DayOfWeek.TUESDAY , DayOfWeek.WEDNESDAY );
Set < DayOfWeek > setY = Set.of( DayOfWeek.WEDNESDAY , DayOfWeek.TUESDAY );

boolean sameHashCode = ( setX.hashCode() == setY.hashCode() );

System.out.println( "setX.hashCode() = " + setX.hashCode() );
System.out.println( "setY.hashCode() = " + setY.hashCode() );
System.out.println( "sameHashCode = " + sameHashCode );

当你跑的时候。
setx.hashcode()=-838114520
sety.hashcode()=-838114520
samehashcode=真
这适用于的不同实现 Set .

Set < DayOfWeek > setX =new TreeSet<>() ;
setX.add( DayOfWeek.TUESDAY);
setX.add( DayOfWeek.WEDNESDAY);

Set < DayOfWeek > setY = new HashSet <>();
setY.add( DayOfWeek.WEDNESDAY );
setY.add( DayOfWeek.TUESDAY );

boolean sameHashCode = ( setX.hashCode() == setY.hashCode() );

samehashcode=真
上面是枚举对象。它对你有用吗 String 物体?对。

Set < String > setX = new TreeSet <>();
setX.add( "Alice" );
setX.add( "Bob" );
setX.add( "Carol" );

Set < String > setY = new HashSet <>();
setY.add( "Bob" );
setY.add( "Alice" );
setY.add( "Carol" );

boolean sameHashCode = ( setX.hashCode() == setY.hashCode() );

samehashcode=真

集合是不同的

意识到两者之间的一个主要区别 Set 以及 List : List 允许重复。一个对象可以多次添加到列表中,并在该列表中占用多个插槽。 Set 禁止重复。一 Set 是不同的,只包含对任何特定对象的单个引用。多次添加一个特定对象在第一次之后没有效果。
引用 Set javadoc公司:
不包含重复元素的集合。更正式地说,集合不包含一对元素e1和e2,例如e1.equals(e2),最多包含一个空元素。正如它的名字所暗示的,这个接口为数学集合抽象建模。

Set < String > setY = new TreeSet <>();
setY.add( "Jan" );
setY.add( "Marsha" );
setY.add( "Marsha" );
setY.add( "Marsha" );
setY.add( "Cindy" );

sety.tostring():[辛迪,简,玛莎]

相关问题