Set和List的区别是什么?

Set<E>List<E>接口的基本区别是什么?

663758 次浏览
  • List是项的有序分组
  • Set是一个无序的项目分组,不允许重复(通常)

从概念上讲,我们通常将允许重复的无序分组称为Bag,而不允许重复的无序分组称为Set。

订购…列表有顺序,集合没有。

List是一个有序的元素序列,而Set是一个无序的元素列表(谢谢你,奎因泰勒)。

List<E>:

有序集合(也称为a 序列)。本界面的用户 有精确的控制在哪里 列出插入的每个元素。的 用户可以通过它们来访问元素 整数索引(在列表中的位置), 并在列表中搜索元素

Set<E>:

一个包含no 重复的元素。更正式, 集合不包含元素e1对 e2使得e1。等于(e2) at 最多一个空元素。正如所暗示的 的名称,此接口模拟

Set不能包含重复的元素,而List可以。List(在Java中)也意味着顺序。

所有List类都保持插入的顺序。它们基于性能和其他特性使用不同的实现(例如,ArrayList用于特定索引的访问速度,LinkedList用于简单地维护顺序)。因为没有密钥,所以允许复制。

Set类不维护插入顺序。它们可以选择性地施加特定的顺序(如SortedSet),但通常具有基于一些哈希函数的实现定义的顺序(如HashSet)。由于__abc0是通过键访问的,因此不允许重复。

集合是由不同对象组成的无序组——不允许有重复的对象。它通常使用被插入对象的哈希代码来实现。(特定的实现可能会添加排序,但Set接口本身没有。)

列表是一组有序的对象,其中可能包含重复项。它可以用ArrayListLinkedList等实现。

元素的有序列表(唯一或非唯一)
遵循Java名为List的接口
可以通过索引

实现使用

  • LinkedList
  • ArrayList

唯一元素列表:
遵循Java名为Set的接口
可以被索引

访问吗

实现使用

  • HashSet(无序)
  • LinkedHashSet(命令)
  • 树集(按自然顺序或按提供的比较器排序)

两个接口SetList都符合Java的名为Collection的接口

这可能不是您想要的答案,但是集合类的JavaDoc实际上非常具有描述性。复制/粘贴:

有序集合(也称为a 序列)。本界面的用户 有精确的控制在哪里 列出插入的每个元素。的 用户可以通过它们来访问元素 整数索引(在列表中的位置), 并在列表中搜索元素 与集合不同,列表通常允许 重复的元素。更正式, 列表通常允许对 元素e1和e2满足 e1 = (e2)通常 允许多个空元素 完全允许空元素。不是的 难以想象有人会这么想 实现一个禁止的列表 副本,通过抛出运行时 当用户试图 插入它们,但我们期望这种用法

列表:

Lists一般允许重复对象。 __abc0必须是有序的,因此可以通过索引访问

实现类包括:ArrayListLinkedListVector

设置:

Sets do 允许重复对象。 大多数实现是无序的,但它是特定于实现的 实现类包括: HashSet(无序) LinkedHashSet(命令), TreeSet(按自然顺序或按提供的比较器排序)

1.List允许重复值,set不允许重复值

< p > 2。List维护您在列表中插入元素的顺序 Set不能维持秩序。 3.List是一个有序的元素序列,而Set是一个无序的元素列表

列表

  1. 是元素的有序分组。
  2. List用于收集重复的元素。
  3. 在List中定义新方法 李接口。< / >

  1. 是元素的无序分组。
  2. Set用于收集没有重复项的元素。
  3. 在Set接口中没有定义任何新方法,因此我们只能对Set子类使用Collection接口方法。

Set<E>List<E>都用于存储类型为E的元素。区别在于Set是以无序的方式存储的,并且不允许重复值。List用于以有序的方式存储元素,并且它允许重复值。

Set元素不能通过索引位置访问,而List元素可以通过索引位置访问。

Java中List和Set之间的一些值得注意的区别如下:

Java中List和Set的基本区别是允许重复元素。Java中的List允许重复,而Set不允许任何重复。如果在Set中插入duplicate,它将替换旧的值。Java中Set的任何实现都只包含唯一的元素。

Java中List和Set的另一个显著区别是order。List是有序集合,Set是无序集合。List维护元素的插入顺序,这意味着前面插入的任何元素将比后面插入的任何元素的下标。Java中的Set不维护任何顺序。尽管Set提供了另一种称为SortedSet的替代方法,它可以按照存储在Set中的对象的Comparable和Comparator方法定义的特定排序顺序存储Set元素。

Java中流行的列表接口实现包括ArrayList, Vector和LinkedList。而流行的Set接口实现包括HashSet, TreeSet和LinkedHashSet。

很明显,如果你需要维护插入顺序或对象,你的集合可以包含重复的列表是一种方法。另一方面,如果您的要求是保持唯一的集合,没有任何重复,那么Set是最好的方法。

这里有一个关于groovy的清晰的例子。我创建了一个集合和一个列表。 然后我尝试在每个列表中存储20个随机生成的值。生成的值范围为0 ~ 5

s = [] as Set
l = []


max = 5
print "random Numbers :"
20.times{
e = (int)Math.random()*max
s << e
l << e
print "$e, "
}




println "\n"
println "Set : $s "
println "list : $l

结果:

随机数:4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3

设置:[4, 1, 0, 2, 3]

list: [4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]

你可以看到区别在于:

  • Set不允许重复值。
  • 列表允许重复值。

当我们讨论Java接口时,为什么不看看Javadoc呢?!

    A List是一个有序的集合(序列),通常允许 李重复< / >
  • A Set A是不包含重复元素的集合,迭代 顺序可以通过实现
  • 来保证

这里没有提到关于集合的缺乏顺序:这取决于实现。

列表:

  1. 允许重复。
  2. 有序地将元素分组。(换句话说,有明确的顺序。不需要按升序排序)

设置:

  1. 不允许复制。
  2. 对元素进行无序分组。(换句话说,没有明确的顺序。它可能是也可能不是按升序排列的)
< span style=" font - family:宋体;"> < / th > < span style=" font - family:宋体;"> < / th >列表 < span style=" font - family:宋体;"> < / th >设置 < span style=" font - family:宋体;">重复道明> < / < span style=" font - family:宋体;">是的td > < / < span style=" font - family:宋体;">没有道明> < / < span style=" font - family:宋体;"道明> >为< / < span style=" font - family:宋体;">命令道明> < / < span style=" font - family:宋体;">取决于实现 < span style=" font - family:宋体;"道明> >位置访问< / < span style=" font - family:宋体;">是的td > < / < span style=" font - family:宋体;">没有道明> < /

主题名称:列表VS集

我刚刚介绍了Java中最重要的主题——集合框架。我想和你分享我关于收藏的一点知识。其中最重要的是列表、集合、映射。让我们从List和Set开始。

List与Set的区别:

  1. List是一个扩展AbstractList类的集合类,而Set是一个扩展AbstractSet类的集合类,但两者都实现了collection接口。

  2. 列表接口允许重复值(元素),而设置接口不允许重复值。如果Set中有重复的元素,则替换旧的值。

  3. 列表接口允许空值,而设置接口不允许空值。如果在Set中使用空值,则给出NullPointerException

  4. 列表接口维护插入顺序。这意味着我们在List中添加元素的方式与使用iterator或for-each样式获取它的方式相同。而Set实现不一定保持插入顺序。(虽然SortedSet使用TreeSet,而LinkedHashSet维持插入顺序)。

  5. List接口有自己定义的方法,而Set接口没有自己的方法,所以Set只使用Collection接口方法。

  6. List接口有一个名为Vector的遗留类,而Set接口没有任何遗留类

  7. 最后但并非最不重要的…listIterator()方法只能用于循环遍历列表类中的元素,而我们可以使用iterator()方法访问Set类的元素

还有什么要补充的吗?请让我知道。

谢谢。

设置:

不能有重复值 排序取决于实现。默认情况下,它不是有序的 不能通过索引

访问

列表:

可以有重复的值 默认订购 可以访问索引

List Vs Set

1) Set不允许重复。列表允许重复。基于Set的实现,它还维护插入顺序。

LinkedHashSet。它维护插入顺序。请参考点击这里

2) 包含方法。根据集合的性质,它将为访问提供更好的性能。最好的情况是o(1)但是List在调用contains时有性能问题。

< p > 列表: < br > List允许重复元素和空值。易于搜索使用相应的索引的元素,也将显示元素在插入顺序。 例如:(linkedlist) < / p >
import java.util.*;


public class ListExample {


public static void main(String[] args) {
// TODO Auto-generated method stub


List<Integer> l=new LinkedList<Integer>();
l.add(001);
l.add(555);
l.add(333);
l.add(888);
l.add(555);
l.add(null);
l.add(null);


Iterator<Integer> il=l.iterator();


System.out.println(l.get(0));


while(il.hasNext()){
System.out.println(il.next());
}


for(Integer str : l){
System.out.println("Value:"+str);
}
}


}

输出:

< br > < p > 1 1 < br > 555年< br > 333年< br > 888年< br > 555年< br > 空< br > 空< br > 值:1 < br > 值:555 < br > 值:333 < br > 值:888 < br > 值:555 < br > 值:空< br > 值:空< br > < / p > < p > 设置: < br > Set不允许任何重复元素,它允许单个空值。它不会维护显示元素的任何顺序。只有TreeSet将按升序显示

例如:(TreeSet)

import java.util.TreeSet;


public class SetExample {


public static void main(String[] args) {
// TODO Auto-generated method stub


TreeSet<String> set = new TreeSet<String>();
try {
set.add("hello");
set.add("world");
set.add("welcome");
set.add("all");


for (String num : set) {
System.out.println( num);


}
set.add(null);
} catch (NullPointerException e) {
System.out.println(e);
System.out.println("Set doesn't allow null value and duplicate value");
}


}


}

输出:

< p >所有< br > 你好< br > 欢迎< br > 世界< br > java.lang.NullPointerException < br > Set不允许空值和重复值

< >强: Set的集合中不能有Duplicate元素。它也是一个无序集合。要从Set中访问数据,只需要使用Iterator,基于索引的检索是不可能的。它主要用于需要唯一性收集的时候

< >强名单: List可以有重复的元素,插入时使用自然顺序。 因此,它可以基于索引或迭代器检索数据。广泛用于存储需要基于索引访问的集合

嗨,已经给出了这么多答案,让我指出一些到目前为止没有提到的地方:

  • 大多数列表实现(ArrayList,Vector) 实现RandomAccess接口,这是一个更快访问的标记接口。Set的实现都没有这样做。
  • List使用一个特殊的迭代器ListIterator 哪个支持双向迭代。Set使用只支持单向迭代的迭代器
  • HashSet接受5.5倍内存数组列表进行存储 相同数量的元素

最大的不同在于基本概念。

列表接口。是数学概念。方法扩展集合。但是没有添加新的方法。size()表示基数(more是BitSet。基数,线性计数器,日志日志,HyperLogLog)。addAll()表示联合。retainAll()表示交集。removeAll()表示差异。

然而,列表缺乏这些概念。列表添加了许多方法来支持序列概念,这是集合接口所不提供的。核心概念是< em >指数< / em >。比如add(index,element),get(index),search(indexOf()),remove(index)元素。列表还提供“集合视图子表没有视图。没有位置访问权限。列表集合类中也提供了很多算法。(列表),binarySearch(列表),反向(列表),洗牌(列表),填满(列表)。方法params是列表接口。重复的元素只是概念的结果。这不是本质上的区别。

所以本质的区别在于概念。是数学集合的概念。列表是序列概念。

因素 列表
是有序分组元素吗? 是的 没有
通过索引提供位置访问 ? 是的 没有
可以存储重复的元素? 是的 没有
可以存储多个null元素? 是的 没有
孩子: ArrayListLinkedListVector,和Stack HashSetLinkedHashSet

列表都是接口。它们都扩展了Collection接口。set和list之间的重要区别是:

  1. 复制对象

<强> < / >强名单< >强组< / >强之间的主要区别是列表允许重复,而Set不允许重复。

  1. 订单

列表是一个有序的集合,它维护插入顺序,这意味着在显示列表内容时,它将以它们插入到列表中的相同顺序显示元素。

是一个无序集合,它不维护任何顺序。很少有的实现维护顺序,如LinkedHashSet(它维护插入顺序的元素)。

  1. 空元素

列表允许任意数量的空元素最多只能有一个空元素