繁体   English   中英

什么Java数据结构/解决方案最适合这些要求?

[英]What Java Data Structure/Solution would best fit these requirements?

我需要一个满足这些要求的java数据结构/解决方案。 什么最适合这些?

1)必须保留对象的插入顺序

2)对象必须是唯一的(这些是由UUID唯一标识的数据库对象)。

3)如果添加了具有相同ID的较新对象,则应覆盖/删除旧版本的对象

4)许多线程都应该可以访问解决方案。

5)当读取/使用添加到Structure的第一个对象时,应该从数据结构中删除它

这里有几种可能性。 最简单的可能是从LinkedHashSet开始。 这将为您提供所需的唯一性和可预测的排序。 然后,您可以包装结果集以使其成为线程安全的:

Set<T> s = Collections.synchronizedSet(new LinkedHashSet<T>(...));

注意:由于Set没有真正定义从中检索项目的方法,因此您的代码必须手动调用Set.remove(Object)。

或者,您可以包装一个LinkedHashMap ,它确实为您需要的delete-on-read语义提供了一个钩子:

class DeleteOnReadMap<K, V> implements Map<K, V> {

    private Map<K, V> m = new LinkedHashMap<K, V>();

    // implement Map "read" methods Map with delete-on-read semantics
    public V get(K key) {
        // ...
    }
    // (other read methods here)

    // implement remaining Map methods by forwarding to inner Map
    public V put(K key, V value) {
        return m.put(key, value);
    }
    // (remaining Map methods here)
}

最后,包装自定义Map的实例以使其具有线程安全性:

Map<K, V> m = Collections.synchronizedMap(new DeleteOnReadMap<K, V>(...));

我的想法如下:

 Collections.synchronizedMap(new LinkedHashMap<K, V>());

我认为除了要求5之外,它会处理所有事情,但你可以通过使用remove()方法而不是get()来做到这一点。

这不会像ConcurrentMap那样高效 - 同步会在每次访问时锁定整个映射,但我认为ConncurrentMap实现只能对映射的一部分使用读写锁和选择性锁定,以允许多次非冲突访问继续前进 如果您愿意,可以通过编写自己的某些现有Map实现的子类来获得更好的性能。

1)必须保留对象的插入顺序

这是任何“普通”数据结构 - 数组,arrayList,树。 因此,请避免自我平衡或自我排序数据结构:堆,哈希表或移动到前面的树(例如,splay树)。然后再次,您可以使用其中一个结构,但是你必须跟踪它在每个节点中的插入顺序。

2)对象必须是唯一的(这些是由UUID唯一标识的数据库对象)。

保留与每个对象关联的唯一标识符。 如果这是一个C程序,那么指向该节点的指针是唯一的(我想这也适用于Java。)如果节点的指针不足以维持“唯一性”,那么你需要为每个节点添加一个字段你保证拥有独特的价值。

3)如果添加了具有相同ID的较新对象,则应覆盖/删除旧版本的对象

你想在哪里放置节点? 替换现有节点吗? 或者您要删除旧节点,然后将新节点添加到最后? 这很重要,因为它与您的要求#1相关,其中必须保留插入顺序。

4)许多线程都应该可以访问解决方案。

我能想到的唯一方法就是实现某种锁定。 Java允许您在synchronized块中包含结构和代码。

5)当读取/使用添加到Structure的第一个对象时,应该从数据结构中删除它

有点像“出队”行动。

看起来像ArrayList是一个非常好的选择:仅仅因为#5。 唯一的问题是搜索是线性的。 但是如果你的数据量相对较少,那么问题并不是那么多。

否则,像其他人一样说:HashMap甚至某种树都可以工作 - 但这取决于访问的频率。 (例如,如果最有可能访问“最新”元素,我将使用线性结构。但如果访问将是“随机”元素,我将使用HashMap或树。)

谈论LinkedHashSet的解决方案将是一个很好的起点。

但是,您必须覆盖要放入集合中的对象的equals和hashcode方法,以满足您的要求编号3。

听起来你必须创建自己的数据结构,但这听起来像一个非常简单的类任务。

基本上你从数组或堆栈开始,但是你必须扩展它以完成其余的功能。

您可以根据需要查看“包含”方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM