在Java中何时在数组上使用列表?
在Java中,什么时候最好使用列表而不是数组?如果您想扩展项目数组(即,如果您事先不知道列表的大小),列表将是有益的。但是,如果您想要性能,通常会使用数组。通常更喜欢列表。列表具有更多的功能,尤其是迭代器支持。您可以随时使用toArray()方法将列表转换为数组。这取决于列表的类型 如果您知道将在末尾以外的位置插入许多元素,那么最好使用LinkedList。LinkedList不适合随机访问(获取第i个元素)在Java中何时在数组上使用列表?,java,arrays,list,data-structures,Java,Arrays,List,Data Structures,在Java中,什么时候最好使用列表而不是数组?如果您想扩展项目数组(即,如果您事先不知道列表的大小),列表将是有益的。但是,如果您想要性能,通常会使用数组。通常更喜欢列表。列表具有更多的功能,尤其是迭代器支持。您可以随时使用toArray()方法将列表转换为数组。这取决于列表的类型 如果您知道将在末尾以外的位置插入许多元素,那么最好使用LinkedList。LinkedList不适合随机访问(获取第i个元素) 如果您事先不知道将有多少个元素,那么最好使用ArrayList。ArrayList可以
如果您事先不知道将有多少个元素,那么最好使用ArrayList。ArrayList可以在向支持阵列添加更多元素时正确分摊增加该阵列的成本,并且适合在元素就位后进行随机访问。数组列表可以有效地排序。我认为问题恰恰相反- 什么时候应该在列表上使用数组 只有您有这样做的特定原因(例如:项目约束、内存问题(不是很好的原因)等) 列表更易于使用(imo),并且具有更多的功能 注:你也应该考虑一个集合,或者另一个数据结构是否比你试图做的列表更适合。 每个数据结构和实现都有不同的优缺点。选择那些擅长你需要做的事情的人 对于任何项目,是否需要get()为O(1)?可能使用ArrayList,是否需要O(1)insert()?可能是一个链表。是否需要O(1)包含()?可能是哈希集 TLDR:每个数据结构都有好的一面,也有坏的一面。查看您的目标,选择最适合给定问题的数据结构。 编辑:
有一件事没有注意到,你是 最好将变量声明为 其接口(即列表或队列) 而不是它的实现类。 这样,您就可以更改 日后实施 在不改变任何其他内容的情况下 代码 例如:
List myList=new ArrayList();
vs
List myList=newlinkedlist();
请注意,在这两个示例中,myList都是一个列表。
--R.Bemrose
在许多情况下,所使用的集合类型是一个实现细节,不应该对外公开。您的returntype越通用,之后更改实现的灵活性就越大
数组(基元类型,即new int[10])不是泛型的,如果不进行内部转换或更改客户端代码,您将无法更改实现。你可能想把迭代看作是一个返回类型。 如果你知道你将拥有多少东西,你就会想要一个数组。我的屏幕是1024x768,像素缓冲区的大小在运行期间不会改变 如果您知道需要访问特定的索引(去获取项目#763!),请使用数组或数组支持的列表 如果您需要定期从组中添加或删除项目,请使用链接列表 一般来说,处理硬件、阵列、处理用户、列表。经验法则:
- 对引用类型使用
列表
- 对基本体使用数组
- 如果必须处理使用数组的API,那么使用数组可能会很有用。另外,通过使用
s,在类型系统中强制进行防御性复制可能很有用List
- 如果您正在对序列执行大量的
类型操作,并且序列不在性能/内存关键部分,请使用List
List
- 低级别优化可能使用阵列。低水平的优化会带来不好的结果
大多数人已经回答了这个问题 几乎没有理由使用数组而不是列表。主要的异常是基元数组(如
int[]
)。无法创建基本列表(必须具有列表
)
最重要的区别在于,在使用列表时,您可以决定将使用什么实现。最明显的是选择LinkedList或ArrayList
在这个回答中,我想指出,选择实现可以让您对阵列根本不可用的数据进行非常细粒度的控制:
集合中来防止客户端修改您的列表。不可修改列表
Collection.synchronizedList
LinkedBlockingQueue
在任何情况下,即使你不想要(现在)列表中的任何额外功能。只需使用一个ArrayList,并根据您创建的数组大小调整它的大小。它将在后端使用阵列,与实际阵列的性能差异可以忽略不计。(除了基本数组)确切地说:如果你想进行微优化,你通常会使用数组。“特别是迭代器支持”:请注意,增强的for循环支持数组和列表。尽管没有真正的迭代器功能强大,但Java 5中新的for循环为迭代数组提供了语法上的支持。对,正如Michael所说,for循环是语法糖。有时您需要对象实现迭代器,例如将列表传递给比较器之类的对象
List<String> myList = new ArrayList<String>();
List<String> myList = new LinkedList<String>();