java - HashSet 与 ArrayList

标签 java arraylist collections set hashset

所以我有一个自定义类 Class,它将包含一组另一个自定义类 Students。所以它看起来像这样:

public class Class {
    private Set<Student> students;

    // other methods
}

现在我将在学生集中添加和删除许多学生,我还将更改学生集中已有学生的许多私有(private)字段。

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

最佳答案

当谈到 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(...)

关于java - HashSet 与 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17985029/

相关文章:

java - 如何使用普通的 DataInputStream 加载 ARGB_8888 图像?

java - 我什么时候使用 java Collections singletonMap 方法?

java - 为什么 IOException 不起作用但转到 InputMismatchException

Java等于一个类。是否 == 与 .equals 相同

java - Google Cloud Datastore 删除给定键的命名空间内的所有实体

java - 我正在尝试创建一种方法,将车辆的 arrayList 转换为数组并返回该数组

java - 如何正确停止使用如此多 CPU 的命令队列循环?

java - 如何将 ArrayList 中的元素与特定字符串进行比较?

Java 对象引用

java - 如何获得两个 map Java之间的差异?