Java 集合接口与阵列

Java 集合接口与阵列,java,collections,Java,Collections,我们正在学习收集界面,我想知道你们是否对它的一般用途有什么好的建议?对于不能使用数组的集合,可以执行哪些操作?对于一个集合,除了允许重复之外,你还能对一个数组做什么呢?集合接口只是专门集合的一个基本接口——我还不知道有一个类仅仅实现了集合;相反,类实现扩展集合的专用接口。这些专门的接口和抽象类提供了使用集合(唯一对象)、不断增长的数组(例如ArrayList)、键值映射等的功能,而所有这些都是不能用数组直接完成的。 但是,迭代数组并从数组中设置/读取项仍然是Java中处理数据的最快方法之一。这基

我们正在学习收集界面,我想知道你们是否对它的一般用途有什么好的建议?对于不能使用数组的集合,可以执行哪些操作?对于一个集合,除了允许重复之外,你还能对一个数组做什么呢?

集合接口只是专门集合的一个基本接口——我还不知道有一个类仅仅实现了集合;相反,类实现扩展集合的专用接口。这些专门的接口和抽象类提供了使用集合(唯一对象)、不断增长的数组(例如ArrayList)、键值映射等的功能,而所有这些都是不能用数组直接完成的。
但是,迭代数组并从数组中设置/读取项仍然是Java中处理数据的最快方法之一。

这基本上是所需的抽象级别的问题

大多数集合都可以用数组来实现,但为了方便起见,它们提供了更多的方法。例如,据我所知,大多数集合实现都可以根据需求进行增减,或者执行基本阵列无法执行的其他“高级”操作


例如,假设您正在从一个文件加载字符串。您不知道文件包含多少新行字符,因此不知道分配数组时使用的大小。因此,ArrayList是更好的选择。

详细信息在集合的子接口中,如集合、列表和映射。每种类型都有语义。一个集合通常不能包含重复项,并且没有遵循集合数学概念的顺序概念(尽管有些实现有)。列表最接近数组。地图具有推送和获取的特定行为。按对象的键推送对象,然后使用相同的键检索

每种集合类型的实现中都有更多的细节。例如,任何基于哈希的集合(例如HashSet、HasMap)都基于存在于任何Java对象上的hashcode()方法


您可以模拟基于数组的任何集合类型的语义,但必须编写大量代码才能做到这一点。例如,要使用数组备份地图,需要编写一个方法,将输入地图的任何对象放入数组中的特定存储桶中。您需要处理重复项。对于模拟集合的数组,您需要编写代码以防止重复

迭代器接口是一个优势。也就是说,所有集合都实现了迭代器。迭代器是一个对象,它知道如何在给定集合上进行迭代,并为程序员提供统一的接口,而不管底层实现如何。也就是说,链表的遍历方式不同于二叉树,但迭代器对程序员隐藏了这些差异,使程序员更容易使用一个或另一个集合


如果客户机代码以集合接口本身为目标,这也会导致可以互换地使用集合的各种实现。

如果您这样想,这很容易:集合基本上在所有可以想象的方面都优于对象数组

只要可能,您应该更喜欢
List
而不是
Foo[]
。考虑:

  • 集合可以是可变的,也可以是不可变的。非空数组必须始终是可变的
  • 集合可以是线程安全的;甚至是并发的。一个数组发布到多个线程永远都不安全
  • 集合可以允许或不允许空元素。数组必须始终允许空元素
  • 集合是类型安全的;数组不可用。由于数组的“伪”协方差,
    ArrayStoreException
    可能在运行时产生

  • 集合可以包含不可重新定义的类型(例如,
    ListCollections允许重复。集合可以(有时)包含基于其类型的重复项。例如,集合不能,但列表可以。这完全取决于(更具体的)集合类型。@kreeSeeker:我认为“数组”是指一个基本数组,如int[](可以看到,比如说,ArrayList本身在其庞大的继承层次结构中的某一点上扩展了集合)。好吧,你可以用int[],而不能用List{Integer}来做的是最大限度地利用你的硬件,这对人们来说很重要,例如,数字运算(是的,Java可以并且被用来处理数字,只是不使用默认集合)。人们没有意识到Map{Integer,Integer}中的浪费量……除了那些使用Trove;)@Marcelo Hernández Rishmawy:“谷歌是你的朋友”不是那种欢迎的答案/评论。把它藏在tinyurl后面是很蹩脚的。所以是一个寻找答案的地方,而不是搜索引擎的链接。@Rudy,@Berry120,@SyntaxT3rr0r,即使是非常简单的问题的答案也应该是答案,而不是评论。虽然这对某些集合类是正确的,但对所有的集合类来说都不是正确的看看BlockingQueues(在java.util.concurrent中)的一些实现,它们不一定会扩展——至于除了LinkedList之外的收缩,我不知道有任何实现会这样做——您指的是哪些实现?没关系——如果您包括所指的某些类的名称,有时可能会有所帮助(例如,增长的和收缩的——事实上,我对这一点很好奇,因为我只知道LinkedList会这么做!)显然这取决于你如何定义收缩。ArrayList的大小可以收缩,而arrays.length保持不变,对吗?哦,对,我同意!显然。size()可以上下移动,但内部使用的数组的大小永远不会下降--我想这就是我想表达的观点。但我接受你的观点!例如:ArrayList a{1,2,3,4,5,6,7,8,9,0}和ArrayList b{1,3,