[英]How does java implement the conversion of LinkedList to ArrayList in Java?
我正在实现一个公共方法,需要一个需要能够处理两端插入的数据结构。 由于ArrayList.add(0,key)
将花费O(N)时间,我决定使用LinkedList
- add
和addFirst
方法都应该花费O(1)时间。
但是,为了使用现有的API,我的方法需要返回一个ArrayList
。 所以我有两种方法:
(1)使用LinkedList
,做N个元素的所有添加,其中N / 2将被添加到前面, N / 2将被添加到结尾。 然后通过调用ArrayList
构造函数将此LinkedList
转换为ArrayList
: return new ArrayList<key>(myLinkedList);
(2)使用ArrayList
并调用ArrayList.add(key)
向后面添加N / 2个元素并调用ArrayList.add(0,key)
将N / 2个元素添加到前面。 返回此ArrayList
。
任何人都可以评论哪个选项在时间复杂度方面更优化? 我不确定Java如何实现ArrayList
的构造函数 - 这是决定哪个选项更好的关键因素。
谢谢。
第一种方法遍历列表:
按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。
您可以合理推断,它使用iterator
接口。
每次添加到前面时,第二种方法都会移动元素(并且每隔一段时间调整一次):
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#add(int,E )
将指定元素插入此列表中的指定位置。 将当前位置的元素(如果有)和任何后续元素向右移动(将其添加到其索引中)。
鉴于官方对功能的假设,第一种方法更有效。
仅供参考:您可以使用LinkedList.toArray
获得更多里程
我建议你使用一个比LinkedList
更快的ArrayDeque
来在两端插入元素并消耗更少的内存。 然后使用方法#1将其转换为ArrayList
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.