多次访问数组列表

时间:2012-12-22 11:00:17

标签: java performance arraylist

我有列表(数组列表),可以包含许多实例(500-3000个实例之间)。 在程序期间,某些功能需要访问此列表(多次)并搜索特定实例或更多,以获取实例需要在列表上循环并提供parentName和name(这是字符串)并且不是唯一的密钥。

我的问题是,因为需要多次访问列表,才能更好地定义/设计,以便更有效地访问列表?

请记住需要从列表中获取实例的函数 无法提供完整密钥,只能提供名称 parentName ,这些更多一个实例。

List<Obj>   myList = new ArrayList<Obj>();

class obj
{
parentName
Name
type 
curr
....

1 个答案:

答案 0 :(得分:3)

使用Map<MyEntry, List<Obj>>其中MyEntry是一个包含父名称和名称的类:

public final class MyEntry
{
    private final String parentName;
    private final String name;
    private final int hashCode;

    public MyEntry(final String parentName, final String name)
    {
        this.parentName = parentName;
        this.name = name;
        hashCode = 31 * parentName.hashCode() + name.hashCode();
    }

    // Override .equals() and .hashCode()
    @Override
    public int hashCode()
    {
        return hashCode;
    }

    @Override
    public boolean equals(final Object o)
    {
        if (this == o)
            return true;
        if (o == null)
            return false;
        if (getClass() != o.getClass())
            return false;
        final MyEntry other = (MyEntry) o;
        return parentName.equals(other.parentName)
            && name.equals(other.name);
    }

    // Have a nice string representation
    @Override
    public String toString()
    {
        return "parent name: " + parentName + ", name: " + name;
    }
}

例如,您可以在Obj中使用一个返回匹配的MyEntry对象的方法。此外,如果您使用番石榴,请查看MultiMap

您会注意到哈希代码是预先计算的:这可以完成,因为MyEntry类是不可变的。这允许非常快速地用作Map的密钥。

(编辑:已添加.toString()