【问题标题】:Set<Object> vs List<Object>?设置<对象>与列表<对象>?
【发布时间】:2021-10-21 17:10:30
【问题描述】:

我有一个对象,其中包含一个 id 和该 id 的一些属性。

public class Data {
    private String id;
    private String name;
    private String value;
}

目前我在请求对象中将其定义为:

public class Request {
    private List<Data> dataList;
}

如果我知道我可能永远不会在请求中遇到相同的 id(内容),List vs Set 会有什么不同吗?

总体而言,对于这个用例,哪个更好?列表与集合?

【问题讨论】:

  • List 可以随机访问,有顺序,Set 不一定。您还应该清楚地定义“更好”的含义,并更多地描述您的用例。
  • @Sweeper 如果我知道不会有任何重复的 id 和值 - 我有必要使用 Set 吗?
  • 我只想指出,“id”一词在我遇到的每一个上下文中都暗示着唯一性。如果一个“id”不是唯一的,它怎么能“识别”一些东西呢?是否要使用 List 或 Set 是这个数据结构的使用者将如何处理它以及使用 List 或 Set 之间的权衡的问题。

标签: java arrays list object set


【解决方案1】:

List 和 Set 有什么不同吗

ListSet 具有不同的语义。 List 是允许重复条目的有序项目集合。 Set 是不允许重复的项目的无序集合。 (还有一些特殊的变体结合了排序和唯一性,例如 SortedSetNavigableSet

我知道我可能永远不会遇到相同的 id

Set 的唯一性默认由您的对象 equals 方法确保。如果您希望您的 Data 对象是唯一的“按 id”,您必须在您的 Data 类中实现自定义 equalshashCode 方法 检查相同的 id。

这个用例的总体来说,哪个更好?

我在您的问题中看不到任何用例。

如果您需要独特性,请使用 Set。如果您只需要一组物品,请联系List

当然还有其他用例。例如,如果您需要检查您的收藏是否已经包含一个项目。使用List,您必须遍历所有元素并检查是否相等。例如,当使用HashSet 时,它只会计算对象的hashCode(之后使用equals 检查)并得到答案,这对于大型集合来说要快得多。

【讨论】:

  • “当使用 Set 时,它只会计算对象的 hashCode”这对于 HashSet 来说是正确的,但对于 Set 来说通常不是。
  • @davmac 是的,这就是为什么它被称为 HashSet。其他Set 实现使用不同的技术。只是想说明Sets 通常针对快速contains 进行了优化,因为contains 是唯一性所必需的,这是Set 的主要目的。
【解决方案2】:

为了确保两个对象相等或不相等,Java 使用了equals()hashCode() 方法。

这些是任何对象的默认方法。将对象放入集合中时,您可能会得到错误的输出,因为默认实现可以为两个对象提供相同的哈希码。
因此,建议在自定义类中同时实现 equalshashCode 方法。

Map 和 Set 集合使用哈希码来存储对象。
但是,List 是一个ordered 集合,您可以在将对象添加到列表之前检查对象中是否存在相同的 id。但是对于大对象池来说,这又会影响性能。

【讨论】:

  • Java 只使用 equals 来比较两个对象
猜你喜欢
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
相关资源
最近更新 更多