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 确保没有重复.给你一个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(...) 我应该使用什么数据结构来最好地实现这一点?由于我将更改 set student 中 Student 对象的属性(从而更改哈希码),我应该改用 ArrayList 吗?
如果集合元素的哈希码可能会改变,那么您不应该使用HashSet. (如果这样做,数据结构将中断,并且集合中的元素可能会丢失。)
但我怀疑您是否应该使用ArrayList任何一种,因为如果hashcode()对对象的更改敏感,那么equals(Object)很可能也是如此。这意味着contains(...)类似的方法将无法找到对象。
我认为你应该使用 Map类型,并使用“学生标识符”作为键。
(您也可以覆盖hashcodeandequals以便相等意味着两个对象具有相同的 id。但这equals(Object)对于其他目的毫无用处。)