【问题标题】:Android adapter: using Linkedlist vs ArraylistAndroid 适配器:使用 Linkedlist 与 Arraylist
【发布时间】:2016-02-14 12:25:09
【问题描述】:

我正在使用带有 Gridlayoutmanager 的 RecycleView。当用户向下滚动时,我的应用会加载很多项目。

LinkedList 在添加新元素时具有良好的性能,而我的 ArrayList 需要不断调整大小。

但我不确定 RecycleView 在后台执行的操作会更好地与 ArrayList 和/或 LinkedList 一起使用。

我的适配器是:

public class PhotosAdapter extends RecyclerView.Adapter<PhotosAdapter.PhotosViewHolder> {

    private Context context;

    private List<Photo> items;

    public PhotosAdapter(Context context, List<Photo> items) {
        this.context = context;
        this.items = items;
    }

    //other code here

    public void addAll(List<Photo> newItems) {
        int beforeSize = items.size()-1;
        items.addAll(newItems);
        notifyItemRangeInserted(beforeSize, newItems.size());
    }

}

所以当我创建一个新的空适配器时,我可以这样做:

new PhotosAdapter(getContext(), new ArrayList<Photo>());

或者这个:

new PhotosAdapter(getContext(), new LinkedList<Photo>());

当简单地添加新元素时:

adapter.addAll(myPhotos);

那么在这种情况下,LinkedList 会更好吗? RecycleView 的优化滚动怎么样?使用 ArrayList 还是 LinkedList 效果更好吗?

【问题讨论】:

    标签: android performance android-adapter android-recyclerview


    【解决方案1】:

    现在第一个问题应该是您是否过早优化?这是您应用的关键部分吗?您是否遇到性能问题?

    无论如何,ArrayLists 将在大多数情况下为您提供更好的性能。我建议将其用作默认值,并且仅在要将数据插入列表中间时才使用链接列表。

    是的,当数组变得太大时,ArrayList 需要调整数组的大小,但在大多数情况下,这不会抵消您获得的优势。

    请记住,get(int index) 在使用 LinkedLists 时是 O(n),而在使用 ArrayLists 时是 O(1)。如果你真的很担心经常添加大量元素,你可以给 ArrayList 一个大的初始容量,这样它就不必经常调整大小。

    如果您有兴趣,请查看 Bjarne Stroustrup 的演讲。 https://www.youtube.com/watch?v=YQs6IC-vgmo

    【讨论】:

    • 添加新元素不会不断影响性能吗?如果您使用 ArrayList,则在添加新元素时需要调整其底层数组的大小。使用 LinkedList 没问题。
    • 确实如此,但这种情况真正发生的频率是多少?实际要添加多少新项目?如果不超过一千,很可能不会产生重大影响。
    • 可能。我没有遇到性能问题,只是想知道,因为我从外部注入 List 类型,它可能是任何类型的实现。
    • 这绝对是一个有效的问题,我过去曾问过自己。这是关于该主题的另一个问题。 stackoverflow.com/questions/322715/…
    【解决方案2】:

    没关系。另外,您总是可以同时尝试它们并衡量性能。

    更有可能,问题出在其他方面:

    • 您是否在后台线程上检索数据?
    • 是否在现有项目之间添加了新项目?还是只在最后?如果只是在最后,您可以尝试在用户接近底部时预取项目。 (同样,通过触发后台线程并监听回调)
    • 您孩子的观点复杂吗?
    • 由于代码中提到使用List,我猜它是一个带有图像的recyclerView。问题可能是位图不断分配(和释放)内存。

    无论如何,我建议进行分析。除了最极端的情况外,使用 ArrayList 而不是 LinkedList 的细微差别在所有情况下都无关紧要。看看你的垃圾收集器在做什么。查看哪个方法运行时间最长,尝试找出最让您的应用程序变慢的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多