哈希集与数组列表数组列表哈希集

2022-09-04 06:14:29

因此,我有一个自定义类类,它将具有一组另一个自定义类学生。所以它看起来像这样:

public class Class {
    private Set<Student> students;

    // other methods
}

现在,我将向集合学生添加和删除许多学生,并且我还将更改学生集合中已有的许多学生的私人字段。

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


答案 1

当涉及到行为时,他们是完全不同的阶级。ArrayListHashSet

数组列表

  • 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)
    
  • 不是线程安全的,要使其线程安全,您必须使用Collections.synchronizedList(...)

哈希集

  • HashSet确保没有重复项。
  • 为您提供一个方法,但不保持顺序。O(1)contains()

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 
    
  • 不是线程安全的,要使其线程安全,您必须使用Collections.synchronizedSet(...)

答案 2

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

如果 set 元素的哈希码容易更改,则不应使用 .(如果这样做,数据结构将中断,并且集合中的元素可能会丢失。HashSet

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

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

(您也可以重写 ,以便相等意味着两个对象具有相同的 id。但这对其他目的毫无用处。hashcodeequalsequals(Object)