【问题标题】:Is there a Java Collection (or similar) that behaves like an auto-id SQL table?是否有一个行为类似于自动 ID SQL 表的 Java 集合(或类似集合)?
【发布时间】:2009-03-17 14:26:30
【问题描述】:

请注意,我实际上并没有在这里对数据库做任何事情,所以 ORM 工具可能不是我想要的。

我想要一些容器,每个容器都包含多个对象,一个容器中的所有对象都属于同一类。容器应该显示数据库表的一些行为,即:

  • 允许将对象的字段之一用作唯一键,即。 e.在该字段中具有相同值的其他对象不会添加到容器中。
  • 在接受新对象时,容器应发出一个数字 ID,该 ID 返回给插入方法的调用者。

当请求“重复条目”时,容器应该跳过插入并返回已经存在的对象的键,而不是抛出错误。

现在,我将编写一个通用容器类,它接受实现接口的对象以获取键字段的值,并使用以这些值作为键的 HashMap 作为实际存储类。使用现有的内置类有更好的方法吗?我正在查看 HashSet 之类的东西,但它们似乎不适合。

【问题讨论】:

    标签: java data-structures collections


    【解决方案1】:

    Collections 类都不能满足您的需求。你必须自己写!

    附:你还需要决定你的类是否是线程安全的。

    附言ConcurrentHashMap 很接近,但不完全相同。如果您可以子类化或包装它或包装进入映射的对象,以便您仅依赖该类来实现线程安全,那么您将拥有一个高效且线程安全的实现。

    【讨论】:

      【解决方案2】:

      您可以使用HashSet 模拟此行为。如果您要添加到集合中的对象具有可用作唯一 ID 的字段,则只需让对象的 hashCode() 方法返回该字段(或使用 calculated hash code 值,任何一种方式都应该有效)。

      当您add 重复条目时,HashSet 不会抛出错误,它只会返回 false。您可以包装(或扩展)HashSet,以便您的 add 方法返回您想要的唯一 ID 作为返回值。

      【讨论】:

        【解决方案3】:

        我在想你可以用 ArrayList 来做,使用数组中的当前位置作为“id”,但这并不妨碍你在现有位置进行插入,而且当你在那个位置插入时,它将使一切向上。但是您可以将自己的类基于 ArrayList,在 .add 之后返回 .size() 的当前值。

        【讨论】:

          【解决方案4】:

          对象的哈希码不能用作“数字 id”是否有原因?

          如果没有,那么您只需将调用包装到 ConcurrentHashMap 中,返回对象的 hashCode 并使用 putIfAbsent(K key, V value) 方法确保不会添加重复项。

          putIfAbsent 还返回现有值,因此您可以将其 hashCode 返回给您的用户。

          ConcurrentHashMap

          【讨论】:

          • @Benjamin:哈希码不能用作数字 ID,因为它们不是唯一的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多