当前位置: 首页 > 面试题库 >

HashSet与ArrayList

隆向晨
2023-03-14
问题内容

因此,我有一个自定义班级班级,该班级将有一组其他自定义班级的学生。因此它将看起来像这样:

public class Class {
    private Set<Student> students;

    // other methods
}

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

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


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 它们之间有什么区别?我知道 LinkedHashSet是HashSet的有序版本,可在所有元素上维护双链列表。当您关心迭代顺序时,请使用此类而不是HashSet。当您遍历HashSet时,顺序是不可预测的,而LinkedHashSet可让您按插入元素的顺序来遍历元素。 但是在LinkedHashSet的源代码中,只有HashSet的调用构造函数。那么双向链接的列表和插入顺序在哪里? 问

  • 问题内容: 我了解这是基于实现的,但是在您需要唯一的元素集时使用。那么,为什么在下一个代码中将相同的对象放入地图并进行设置时,两个集合的大小都等于1?地图大小不应该为2吗?因为如果两个集合的大小相等,那么使用这两个集合不会有任何区别。 输出为1和1。 问题答案: 该地图拥有唯一键。当您使用映射中存在的键进行调用时,该键下的对象将被新对象替换。因此大小为1。 两者之间的区别应该很明显: 在您存储键值

  • 问题内容: 我有一个保证是不同的对象的集合(尤其是由唯一的整数ID索引)。我也确切地知道它们中有多少(并且数目不会改变),并且想知道Array是否比HashSet在存储/检索所述元素方面具有显着的性能优势。 在纸上,Array保证了恒定的时间插入(因为我提前知道了大小)和检索,但是HashSet的代码看起来更简洁并且增加了灵活性,所以我想知道是否会因为使用它而失去任何性能方面的信息,至少在理论上是

  • 问题内容: 因为我有一个包含重复项的int数组的ArrayList,所以我想使用HashSet。不幸的是,我无法按需使用HashSet: 结果是: 有人可以告诉我我错了吗? 在此先感谢Dominique(java newbie) 问题答案: 数组不会在类中重写并实现,因此,只有当a1 == a2时,两个数组a1和a2 才被视为彼此相同,这在您的情况下是错误的。 如果使用s而不是数组,则将解决问题,

  • 本文向大家介绍Java HashSet size()方法与示例,包括了Java HashSet size()方法与示例的使用技巧和注意事项,需要的朋友参考一下 HashSet类方法 size()方法在java.util包中可用。 size()方法用于返回此HashSet的大小(即,存在的元素数)。 size()方法是一种非静态方法,只能通过类对象进行访问,如果尝试使用类名访问该方法,则会收到错误消

  • 本文向大家介绍Java HashSet remove()方法与示例,包括了Java HashSet remove()方法与示例的使用技巧和注意事项,需要的朋友参考一下 HashSet类方法 remove()方法在java.util包中可用。 remove()方法用于从存在的HashSet中移除给定的对象(ob)。 remove()方法是一种非静态方法,只能通过类对象访问,如果尝试使用类名称访问该方