【问题标题】:Access to array list many times多次访问数组列表
【发布时间】:2012-12-22 11:00:17
【问题描述】:

我有可以包含许多实例(500-3000 个实例之间)的列表(数组列表)。 在程序中,某些函数需要访问此列表(多次)并搜索特定实例或更多,以获取他们需要在列表上循环并提供 parentName 和名称(即string) 并且不是唯一键。

我的问题是,由于列表需要多次访问,有一种方法可以更好地定义/设计它访问列表可以更有效吗?

请记住需要从列表中获取实例的函数 不能提供完整的密钥,只能提供 nameparentName 可以有 more 一个实例。

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

class obj
{
parentName
Name
type 
curr
....

【问题讨论】:

  • 因此您应该使用地图,其中每个键都包含一个值列表。如果您显示更多代码,例如,您可能会得到更好的答案。一些示例值和一个显示您如何访问列表的 sn-p。

标签: java performance arraylist


【解决方案1】:

使用Map&lt;MyEntry, List&lt;Obj&gt;&gt;,其中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 对象。另外,如果您使用 Guava,请查看 MultiMap

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

(编辑:添加.toString()

【讨论】:

  • 嗨,Fge,让我看看我是否正确。你是在告诉我创建新类,其中包含例如密钥父名称 1 名称 2 并且在列表中他们有 10 个实例,条目将是 1 和 2,它们映射到包含 10 个实例的列表等等?
  • @BorisMandovskes:是的,完全正确。您的地图将包含 ("foo", "bar") -&gt; [ obj1, obj2, etc] 之类的条目,其中 obj1 和其他将具有 "foo" 作为父名称和 "bar" 作为名称。另请注意,最好在MyEntry 中覆盖toString(),但这取决于您。
  • 您好 Fge 感谢您的回答,您能否简单解释一下哈希和等号的用途。谢谢!!!
  • @BorisMandovskes:Map 的密钥集是Set。与List 不同,Set 中的元素是唯一的。您会注意到Set.add() 方法返回一个布尔值,当且仅当集合作为操作的结果而被修改时,它才为真。为了检测元素是否相等,实现首先检查哈希码,如果一个元素与集合中已经存在的元素具有相同的哈希码,那么它们才使用.equals()。由于设计的MyEntry类是不可变的,我们可以预先计算哈希码,使操作更快。
  • 你好最后一个问题:),因为我像 > 一样使用它,为什么不使用 hashMap ?谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多