java如何在java中实现LinkedList到ArrayList的转换?
我正在实现一个公共方法,它需要一个能够处理两端插入的数据结构。由于java如何在java中实现LinkedList到ArrayList的转换?,java,performance,arraylist,linked-list,big-o,Java,Performance,Arraylist,Linked List,Big O,我正在实现一个公共方法,它需要一个能够处理两端插入的数据结构。由于ArrayList.add(0,key)将花费O(N)时间,因此我决定使用LinkedList来代替-add和addFirst方法都应该花费O(1)时间 但是,为了使用现有的API,我的方法需要返回一个ArrayList。 因此,我有两种方法: (1) 使用LinkedList, 执行所有N元素的添加,其中N/2将添加到前面,而N/2将添加到末尾。 然后通过调用ArrayList构造函数将此LinkedList转换为ArrayLi
ArrayList.add(0,key)
将花费O(N)时间,因此我决定使用LinkedList
来代替-add和addFirst
方法都应该花费O(1)时间
但是,为了使用现有的API,我的方法需要返回一个ArrayList
。
因此,我有两种方法:
(1) 使用LinkedList
,
执行所有N元素的添加,其中N/2将添加到前面,而N/2将添加到末尾。
然后通过调用ArrayList
构造函数将此LinkedList
转换为ArrayList
:
返回新的ArrayList(myLinkedList)代码>
(2) 使用ArrayList
并调用ArrayList.add(key)
将N/2元素添加到后面,然后调用ArrayList.add(0,key)
将N/2元素添加到前面。返回此ArrayList
在时间复杂度方面,谁能评论哪个选项更优化?我不确定Java如何实现ArrayList
的构造函数,这是决定哪个选项更好的关键因素
谢谢。第一个方法在列表中迭代:
按照集合迭代器返回的顺序,构造包含指定集合元素的列表
您可以合理地推断,它使用了迭代器
接口
第二种方法将在每次添加到前面时移动元素(并每隔一段时间调整一次大小):
,E)
在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将一个元素添加到其索引中)
考虑到有关函数的官方假设,第一种方法更有效
仅供参考:使用LinkedList可以获得更多里程数。为了排列我建议您使用ArrayDesign
,它比LinkedList
更快地在两端插入元素,并且占用更少的内存。然后使用方法#1将其转换为ArrayList
。输入方法时您知道n的值吗?源代码可用。。但是可以肯定的是,ArrayList
的复制构造函数基于O(N)迭代器。这是一个链接,可以打开ArrayList构造函数的jdk实现,@RichardSitze-no,它基于toArray(),在ArrayList中比在LinkedList@anoopelias感谢您指出开放jdk实现。由于某种原因,我昨晚没能找到它。