题
两者之间的根本区别是什么 Set<E>
和 List<E>
接口?
其他提示
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
元素的有序列表(唯一或不唯一)
符合Java的接口命名 List
可以通过索引访问
实现使用
- 链表
- 数组列表
独特元素列表:
符合Java的接口命名 Set
能 不是 通过索引访问
实现使用
- 哈希集(无序)
- LinkedHashSet(有序)
- TreeSet(按自然顺序或按提供的比较器排序)
两个接口 Set
和 List
符合Java的接口命名 Collection
Set可以包含重复元素。 List(在Java中)也意味着顺序。
- 列表是项目的有序分组
- 集合是项目的无序分组,不允许重复(通常)
从概念上讲,我们通常将允许重复的无序分组称为 Bag,而不允许重复的分组称为 Set。
<强>列表强>
- 是元素的有序分组。
- 列表用于收集带有重复项的元素。
- 在List中定义了新方法 接口 醇>
- 是无序的元素分组。
- Set用于收集没有重复的元素。
- 在Set接口中没有定义新方法,因此我们必须仅将Collection接口方法用于Set子类。 醇>
设置强>
列表:
List
s通常允许重复的对象。
必须订购ArrayList
s,因此可以通过索引访问。
实施类包括:LinkedList
,Vector
,Set
设置:
HashSet
s 不允许重复的对象。
大多数实现都是无序的,但它是特定于实现的。
实施类包括:
LinkedHashSet
(无序),
TreeSet
(订购),
<=>(按自然顺序或提供的比较器排序)
当我们谈论 Java 接口时,为什么不看看 Javadoc 呢?!
- A
List
是一个有序集合(序列),通常允许重复 - A
Set
A是不包含重复元素的集合,可以通过实施来保证迭代顺序
没有提到关于集合缺乏顺序:这取决于实施。
这可能不是您正在寻找的答案,但集合类的JavaDoc实际上非常具有描述性。复制/粘贴:
有序集合(也称为 序列)。此界面的用户 精确控制在哪里 列表中插入了每个元素。该 用户可以通过他们访问元素 整数索引(列表中的位置), 并搜索列表中的元素。
与集合不同,列表通常允许 重复元素。更正式的, 列表通常允许成对 元素e1和e2这样 e1.equals(e2),它们通常是 允许多个null元素 允许null元素。它不是 不可想象有人可能希望 实施禁止的列表 重复,通过投掷运行时 用户尝试时的异常 插入它们,但我们希望这种用法 很少见。
集合是一组无序的不同对象<!>#8212; <!>没有重复的对象是允许的。它通常使用要插入的对象的哈希码来实现。 (具体实现可能会添加排序,但Set接口本身不会。)
列表是一组有序的对象,可能包含重复项。它可以用ArrayList
,LinkedList
等实现
1.List允许重复值并设置不允许重复
2.List维护您将元素插入列表的顺序 设置没有维持秩序。 3.List是有序的元素序列,而Set是无序的元素列表。
列出与设置
1)Set不允许重复。列表允许重复。基于Set的实现,它还维护插入顺序。
例如:LinkedHashSet
。它维护插入顺序。请参考点击此处
2)包含方法。根据Set的性质,它将提供更好的访问性能。最好的情况是o(1)。但是List有调用contains
的性能问题。
<强>列表:强>结果 List允许重复元素和空值。易于使用元素的相应索引进行搜索,并且还将按插入顺序显示元素。 例如:(链表)
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);
}
}
}
输出:
1,点击 1结果 555个结果 333个结果 888个结果 555个结果 空结果 空结果 价值:1,点击 价值:555点击 价值:333点击 价值:888点击 价值:555点击 价值:无效点击 值:空结果
设置:强>结果
Set不允许任何重复的元素,它允许单个null值。它不会维护任何显示元素的顺序。只有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");
}
}
}
输出:
所有结果 你好结果 欢迎点击 世界点击 显示java.lang.NullPointerException结果 设置不允许空值和重复值
所有List
类都维护插入顺序。它们基于性能和其他特征使用不同的实现(例如,ArrayList
用于特定索引的访问速度,LinkedList
用于简单维护订单)。由于没有密钥,因此允许重复。
Set
类不维护广告订单。它们可以选择强制执行特定的顺序(与SortedSet
一样),但通常具有基于某些散列函数的实现定义顺序(与HashSet
一样)。由于<=> s是按键访问的,因此不允许重复。
订购......列表有订单,订单则没有。
Java中List和Set之间的值得注意的差异如下:
1) Java中List和Set之间的基本区别是允许重复元素。 Java中的列表允许重复,而Set不允许任何重复。如果在Set中插入副本,它将替换旧值。任何Set in Java的实现都只包含唯一的元素。
2) Java中List和Set之间的另一个显着差异是顺序。列表是有序集合,而集合是无序集合。 List维护元素的插入顺序,意味着之前插入的任何元素将比下面插入的任何元素的索引更低。在Java中设置不保持任何顺序。尽管Set提供了另一个名为SortedSet的替代方案,它可以按照存储在Set中的对象的Comparable和Comparator方法定义的特定排序顺序存储Set元素。
3) Java中List接口的流行实现包括ArrayList,Vector和LinkedList。虽然流行的Set接口实现包括HashSet,TreeSet和LinkedHashSet。
很明显,如果您需要维护插入顺序或对象,并且您的集合可以包含重复项,那么List是一种方法。另一方面,如果您的要求是保持唯一的集合而没有任何重复,那么就是设置。
列表:
- 允许重复。
- 在分组元素中有序。(换句话说,有明确的顺序。不需要按升序排序) 醇>
- 不允许重复。
- 在分组元素中无序。(换句话说,没有明确的顺序。它可能会或可能不会按升序排列) 醇>
集:
Set<E>
和List<E>
都用于存储E
类型的元素。区别在于Set
以无序方式存储,不允许重复值。 List
用于以有序方式存储元素,它允许重复值。
<=>元素,并且可以使用索引位置访问<=>元素。
嗨,已经给出了很多答案。让我指出一些到目前为止尚未提及的要点:
- 大多数列表实现(ArrayList、Vector) 实施
RandomAccess
接口是一个用于更快访问的标记接口。Set 实现都没有这样做。 - List 使用一种特殊的迭代器,称为
ListIterator
支持双向迭代. 。Set 使用 Iterator ,仅支持 1 路迭代 - HashSet 需要 内存增加 5.5 倍 比存储相同数量的元素的arraylist。
这是一个 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]
列表 : [4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]
你可以看到区别在于:
- Set 不允许重复值。
- 列表允许重复值。
与SET没有重复值和List可以的答案一样。 当然,秩序是另一回事,让他们分开。
设置:强> 集合的集合中不能包含重复元素。它也是一个无序的集合。要从Set访问数据,只需要使用Iterator,并且无法使用基于索引的检索。它主要用于需要唯一性收集时。
<强>列表:强> List可以有重复的元素,插入时自然排序。 因此,它可以基于索引或迭代器检索数据。它广泛用于存储需要基于索引访问的集合。
主题名称:列表VS集
我刚刚学习了Java最重要的主题,名为Collections Framework。我想与你分享我对收藏的一些知识。列表,设置,地图是它最重要的主题。所以让我们从List和Set开始。
List和Set之间的区别:
-
List是一个扩展
AbstractList
类的集合类,其中Set是一个扩展AbstractSet
类但都实现Collection接口的集合类。 -
列表界面允许重复值(元素),而Set界面不允许重复值。如果Set中有重复元素,则会替换旧值。
-
List接口允许NULL值,而Set接口不允许Null值。如果在Set中使用Null值,则给出
NullPointerException
。 -
列表界面维护广告订单。这意味着我们在List中添加元素的方式与使用迭代器或for-each样式获取元素的方式相同。而
Set
实现不一定保持插入顺序。 (虽然SortedSet
使用TreeSet
,LinkedHashSet
维护广告订单顺序)。 -
List接口有自己定义的方法,而Set接口没有自己的方法,所以Set只使用Collection接口方法。
-
List接口有一个名为
Vector
的遗留类,而Set接口没有任何遗留类 -
最后但并非最不重要......
listIterator()
方法只能用于遍历List Classes中的元素,而我们可以使用iterator()方法来访问Set类元素
醇>
我们可以添加其他任何内容吗?请告诉我。
感谢。
设置:强>
不能有重复的值 订购取决于实施。默认情况下,它不是订购的 无法按索引访问
<强>列表:强>
可以有重复的值 默认排序 可以按索引访问