java - 返回对象的 HashSet.contains()

标签 java performance collections hashset asymptotic-complexity

假设我正在处理类型 A在集合中。

class A {
    ThisType thisField; 
    ThatType thatField; 
    String otherField; 
}

只有 thisFieldthatField与识别 A 的实例相关-- 所以它是 equals()和它一起hashCode()相应地覆盖方法。 有了这个,在 HashSet<A> setOfAs , A 的对象在它们的 ( thisField , thatField ) 值对中是唯一的。

在应用程序的某处,我需要查找 Set对于 A 的实例如果存在,打印它的 otherField -- 元信息。

我可以

i.) 在 setOfAs 上获取一个迭代器, 查看每个条目的 thisFieldthatField值,如果它们都匹配,则打印其 otherField

ii.) 使用自映射,HashMap<A,A> selfMapA ,其中键和值是每个条目中的相同对象。实例化 A使用 ( thisField , thatField ) 值对查找 selfMapA并按原样获取其匹配条目(如果存在)。

(i) 是 O(n) -- 虽然它在恒定时间内找到了对象,但它并没有在恒定时间内获得对象。

(ii) 在恒定时间内获取对象,这是我们在系统中不断使用的对象。但是,它使用了两倍的内存。

我正在寻找的是一个集合结构,它获取在恒定时间内找到的对象条目。例如,一个 contains(Object)返回 Object 的方法,它找到的对象(如果存在),而不是 boolean作为HashSet.contains()

有更好的替代品吗?有办法解决这个问题吗?

最佳答案

HashSet 是使用 HashMap 实现的,所有值都设置为虚拟对象,因此选项 2 实际上应该使用比 HashSet 稍微少的内存。我会选择选项 2。

关于java - 返回对象的 HashSet.contains(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29403810/

相关文章:

ruby-on-rails-3 - 使用Jbuilder和Rails 3提高渲染性能

c# - 应用程序设置中的 StringCollection 未存储

java - com.example.appname.MainActivity.onCreate 处的 AndroidRuntime 错误

java - 如何声明静态嵌套对象

performance - 第二次运行托管应用程序显示与第一次不同的性能

c++ - 如何让 istringstream 更加高效?

java - 为什么我们应该通过mock来了解邻居对象的信息?

java - 稳定排序——我们真的需要它吗?

java - 使用比较器获取集合的子集

java - 如何将不同类型的元素添加到 Java 集合的 PriorityQueue 中?