具有索引和散列访问的集合

时间:2013-02-22 11:59:05

标签: java collections contains hashcode

我需要一个具有快速索引和哈希访问权限的集合类。 现在我有了ArrayList。它具有良好的索引访问权限,但他的contains方法不具备性能。 HashSet具有良好的contains实现,但没有索引访问。哪个系列都有?可能来自Apache的东西? 或者我应该创建自己的集合类,它具有:用于索引访问的ArrayList和用于contains检查的HashSet?

只是为了澄清:我需要get(int index)contains(Object o)

4 个答案:

答案 0 :(得分:1)

如果索引访问性能不是问题,最接近的匹配是LinkedHashSet,其API表示它是

Set接口的哈希表和链表实现,具有可预测的迭代顺序。

至少我不认为性能会比LinkedListPerformance更差。否则我看不到除了你的ArrayList + HashTable解决方案之外别无选择

答案 1 :(得分:0)

如果您从头到尾遍历索引,我认为这可能满足您的需求:LinkedHashSet

如果您需要通过索引随机访问,以及哈希访问,如果没有其他人有更好的建议,我猜你可以制作自己的集合同时执行这两项工作。

答案 2 :(得分:0)

这样做;使用哈希技术以及列表的组合来充分利用这两个方面:)

class DataStructure<Integer>{
   Hash<Integer,Integer> hash = new HashMap<Integer, Integer>();
   List<Integer> list = new ArrayList<Integer>();

    public void add(Integer i){
        hash.add(i,i);
        list.add(i);
    }
    public Integer get(int index){
        return list.get(index);
    }
   ...
} //used Integers to make it simpler

所以对象;你保留在 HashMap / HashSet 以及 ArrayList

所以如果你想使用

 contains method : call hashed contains method.

 get an object with index: use array to return the value

确保您同时拥有这两个集合。并负责两个数据结构中的更新/删除。

答案 3 :(得分:0)

我不知道确切的查找时间,但也许你可以使用Map interface的一些实现。您可以使用map.put(objectHash, obj)存储对象。

然后你可以验证你有一个特定的对象:

boolean contained = map.containsValue(obj);

您可以使用哈希来查找地图中的对象:

MyObject object = map.get(objectHash);

尽管如此,唯一的缺点是您需要知道此查询调用中的哈希值,这可能不在您的实现中。