Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中何时在数组上使用列表?_Java_Arrays_List_Data Structures - Fatal编程技术网

在Java中何时在数组上使用列表?

在Java中何时在数组上使用列表?,java,arrays,list,data-structures,Java,Arrays,List,Data Structures,在Java中,什么时候最好使用列表而不是数组?如果您想扩展项目数组(即,如果您事先不知道列表的大小),列表将是有益的。但是,如果您想要性能,通常会使用数组。通常更喜欢列表。列表具有更多的功能,尤其是迭代器支持。您可以随时使用toArray()方法将列表转换为数组。这取决于列表的类型 如果您知道将在末尾以外的位置插入许多元素,那么最好使用LinkedList。LinkedList不适合随机访问(获取第i个元素) 如果您事先不知道将有多少个元素,那么最好使用ArrayList。ArrayList可以

在Java中,什么时候最好使用列表而不是数组?

如果您想扩展项目数组(即,如果您事先不知道列表的大小),列表将是有益的。但是,如果您想要性能,通常会使用数组。

通常更喜欢列表。列表具有更多的功能,尤其是迭代器支持。您可以随时使用toArray()方法将列表转换为数组。

这取决于列表的类型

如果您知道将在末尾以外的位置插入许多元素,那么最好使用LinkedList。LinkedList不适合随机访问(获取第i个元素)


如果您事先不知道将有多少个元素,那么最好使用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,那么使用数组可能会很有用。另外,通过使用
    List
    s,在类型系统中强制进行防御性复制可能很有用
  • 如果您正在对序列执行大量的
    List
    类型操作,并且序列不在性能/内存关键部分,请使用
    List
  • 低级别优化可能使用阵列。低水平的优化会带来不好的结果
总是喜欢列表

阵列何时

  • Varargs表示一个方法(我猜您在这里被迫使用数组)
  • 如果希望集合是协变的(引用类型的数组是协变的)
  • 性能关键代码
    大多数人已经回答了这个问题

    几乎没有理由使用数组而不是列表。主要的异常是基元数组(如
    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>();