如何使用静态类从HashMap有效地获取值?

时间:2012-01-28 09:44:54

标签: java hashmap static-class

我有一个HashMap<k,v>的课程。 此HashMap的值的类型是一个静态类,它有两个不同的对象作为属性。即,

   public class Example {
      private HashMap<String, StaticClassExample> map;
      private static class StaticClassExample {
           private Object1 o1;
           private Object2 o2;
           //...   
      }
      //...
   }

我的问题是如何有效地进行这项操作:

   public List<Object1> getAllObject1() {}

我知道我可以这样做:map.values()然后迭代值集合并从每个StaticClassExample获取Object1,但这不会有效。 可能我要求或者我必须为我的目的创建另一个hashmap?

1 个答案:

答案 0 :(得分:0)

如果您不介意一些内存开销,可以使用o1-values保留一个单独的列表:

public class HashMapList
{
    private HashMap<String, StaticClassExample> map = new HashMap<String, HashMapList.StaticClassExample>();

    private List<Object> o1List = new LinkedList<Object>();

    public static class StaticClassExample
    {
        private Object o1;
        private Object o2;
    }

    public void addStaticClassExample(String key, StaticClassExample example)
    {
        StaticClassExample oldVal = map.put(key, example);
        if(oldVal != null)
        {
            o1List.remove(oldVal.o1);
        }
        o1List.add(example.o1);
    }

    public StaticClassExample getStaticClassExampleByKey(String key)
    {
        return map.get(key);
    }

    public void removeStaticClassExampleByKey(String key)
    {
        StaticClassExample removed = map.remove(key);
        if(removed != null)
        {
            o1List.remove(removed.o1);
        }
    }

    public List<Object> getAllObject1()
    {
        return Collections.unmodifiableList(o1List);
    }   

}

当然,这需要您将HashMap封装在类中,并且永远不会直接访问它,因为使用该类的人可以直接修改HashMap,并且List将不再与Map同步。请注意,getAllObject1返回内部列表的不可修改视图,因此无法从类外部修改它。