Android适配器:使用Linkedlist vs Arraylist

Android适配器:使用Linkedlist vs Arraylist,android,performance,android-adapter,android-recyclerview,Android,Performance,Android Adapter,Android Recyclerview,我正在使用Gridlayoutmanager的RecycleView。当用户向下滚动时,我的应用程序会加载很多项目 LinkedList在添加新元素时具有良好的性能,而我的ArrayList需要不断调整大小 但我不确定RecycleView在后台做了什么,哪一个更适合ArrayList和/或LinkedList 我的适配器是: public class PhotosAdapter extends RecyclerView.Adapter<PhotosAdapter.PhotosViewHo

我正在使用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());
    }

}

那么在这种情况下,LinkedList会更好吗?那RecycleView的优化滚动呢?这在ArrayList或LinkedList中更有效吗?

现在第一个问题应该是您是否过早地进行了优化?这是应用程序的关键部分吗?您是否存在性能问题

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

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

请记住,
get(int index)
在使用LinkedList时是O(n),而在使用ArrayList时是O(1)。如果您真的关心经常添加大量元素,那么可以为ArrayList提供较大的初始容量,这样它就不必经常调整大小


如果您感兴趣,请查看比亚恩·斯特罗斯图普的演讲

没关系。另外,您可以随时尝试这两种方法并测量性能

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

  • 您正在后台线程上检索数据吗
  • 是否在现有项目之间添加新项目?还是只在最后?如果只是在最后,您可以在用户接近底部时尝试预取项目。(同样,通过启动后台线程并侦听回调)
  • 你孩子的观点复杂吗
  • 由于代码提到使用列表,我猜这是一个带有图像的recyclerView。问题可能是位图经常被分配(或取消分配)内存

无论如何,我建议进行评测。除了最极端的情况外,使用ArrayList而不是LinkedList这样的细微差别在所有情况下都无关紧要。看看你的垃圾收集器在做什么。看看哪种方法运行时间最长,试着找出哪种方法最慢。

添加新的元素不会持续影响性能吗?如果使用ArrayList,则在添加新元素时需要调整其基础数组的大小。对于LinkedList来说,这不是问题。这是真的,但这种情况真的会发生多久?将实际添加多少新项目?最有可能的是,如果它不超过一千个,它不会产生重大影响。我没有性能问题,只是想知道,因为我从外部注入了列表类型,所以它可以是任何类型的实现。这绝对是一个有效的问题,我以前问过自己。这是关于这个话题的另一个问题。
new PhotosAdapter(getContext(), new ArrayList<Photo>());
new PhotosAdapter(getContext(), new LinkedList<Photo>());
adapter.addAll(myPhotos);