【问题标题】:Java performance and memory: LinkedList & arraysJava 性能和内存:LinkedList 和数组
【发布时间】:2011-07-03 22:27:26
【问题描述】:

我正在构建一个 Android 应用程序(因此机器资源有限),我想知道我应该对 LinkedLists 有多挑剔。

我知道数组是最轻量的容器,并且在随机访问方面表现最好,因此如果只考虑性能,它们显然是理想的选择。然而,当你不知道你的列表会有多大时,它们的僵化是一种痛苦。

所以这是我的问题:在具有一个或多个不可预测大小列表的类中系统地使用以下类型的机制是否值得:

public class unpredictable
public Object[]realArray;
private LinkedList<Object> temp;

//what using classes will call to add items
public void add(Object item) 
{
    temp.add( item );
}

//what the outer class calls when it knows there's nothing left to add 
public void doneAdding() 
{
    realArray = new Object[tmp.size()];
    transferAndRecycle();
}

private void transferAndRecycle()
{
    // copy items from linkedlist to array
}

所以我想我是在问是否值得采取额外的步骤来消除 Java 的 LinkedList 对象占用的额外空间?

任何输入?谢谢

【问题讨论】:

  • 有过早优化的味道。

标签: java memory performance linked-list


【解决方案1】:

我认为您提供了许多 ArrayList 类已经包含的服务。 ArrayList 为您提供 O(1) 元素访问;使用链表是 O(n)。 ArrayList 的底层机制是一个数组。您可以通过操作容量来控制此数组的大小。

仔细查看 ArrayList ——您可能会避免重新发明一些轮子。

额外的想法:数组和泛型不能很好地发挥作用。 ArrayList 可以。这是一件小事,但对你来说可能很重要。

【讨论】:

  • 谢谢!在过去的两个学期里,我的教授们将链表深深地烙在了我们的脑海中,以至于当我今年夏天回到 Java 时,我什至没有考虑其他任何事情。
【解决方案2】:

除了 ncmathsadist 已经说过的话:

您的选择还应取决于哪个操作发生得更频繁:添加/删除元素或直接访问单个元素。如果是前者,请使用 LinkedList。如果是后者,请使用 ArrayList。

不要忘记:在调整数组大小时(无论是您自己的解决方案还是 Java 的 ArrayList),有时会分配两次内存:一次用于“旧数组”,一次用于“新数组”在调整大小操作完成之前。

所以,如果你真的关心记忆,你也应该考虑一下。

【讨论】:

    【解决方案3】:

    ArrayList 比 LinkedList 具有更好的引用局部性和更少的内存引用。一般来说,除非您需要特定的 LinkedList 特征(中间快速删除、拼接等),否则更喜欢 ArrayList

    【讨论】:

      【解决方案4】:

      如果您查看 Java 文档,您可以找到该类提供的方法,这些方法已经具有您希望解决问题的所需功能。例如,这是一个将数组列表转换为数组的函数。

      http://download.oracle.com/javase/1.5.0/docs/api/


      T[] toArray(T[] a) 以正确的顺序返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

      【讨论】:

      • 我知道如何将 Collection 转换为数组...再次阅读我的问题,您误解了它。
      猜你喜欢
      • 2012-08-17
      • 2014-04-14
      • 2013-02-15
      • 2016-01-05
      • 2010-11-10
      • 2012-03-20
      • 2012-05-11
      • 2012-05-26
      • 2022-11-10
      相关资源
      最近更新 更多