HashSet与ArrayList

Q L*_*Liu 9 java collections arraylist set hashset

所以我有一个自定义类Class,它将拥有一组另一个自定义类Student.所以它看起来像这样:

public class Class {
    private Set<Student> students;

    // other methods
}
Run Code Online (Sandbox Code Playgroud)

现在我将向学生们添加和删除许多学生,我也将改变已经在学生集中的学生的许多私人领域.

问题:我应该使用什么数据结构来实现这一目标?由于我将更改set student中的Student对象的属性(从而更改哈希码),我应该使用ArrayList吗?

tk_*_*tk_ 11

当它涉及到行为时ArrayList,HashSet它们是完全不同的类.

数组列表

  • ArrayList 不验证重复项.
  • get()O(1)
  • contains()O(n),但你已经完全在条目顺序控制.

                          get  add  contains next remove(0) iterator.remove
    ArrayList             O(1) O(1) O(n)     O(1) O(1)      O(1)
    
    Run Code Online (Sandbox Code Playgroud)
  • 不是线程安全的,并且必须使用它使线程安全 Collections.synchronizedList(...)

HashSet的

  • HashSet 确保没有重复.
  • 给你一个O(1) contains()方法,但不保留顺序.

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 
    
    Run Code Online (Sandbox Code Playgroud)
  • 不是线程安全的,并且必须使用它使线程安全 Collections.synchronizedSet(...)


Ste*_*n C 7

我应该使用什么数据结构来最好地实现这一点?由于我将更改 set student 中 Student 对象的属性(从而更改哈希码),我应该改用 ArrayList 吗?

如果集合元素的哈希码可能会改变,那么您不应该使用HashSet. (如果这样做,数据结构将中断,并且集合中的元素可能会丢失。)

但我怀疑您是否应该使用ArrayList任何一种,因为如果hashcode()对对象的更改敏感,那么equals(Object)很可能也是如此。这意味着contains(...)类似的方法将无法找到对象。

我认为你应该使用 Map类型,并使用“学生标识符”作为键。

(您也可以覆盖hashcodeandequals以便相等意味着两个对象具有相同的 id。但这equals(Object)对于其他目的毫无用处。)