Set和List的区别
Collection是最基本的集合接口,声明了适用于JAVA集合的通用方法,list和set都继承自collection接口。
1.List的功能方法
实际上有两种List:
-
一种是基本的ArrayList,其优点在于随机访问元素。
-
另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。
List:次序是List最重要的特点:它保证维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推 荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。
ArrayList(数组实现):允许对元素进行快速随机访问,从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
LinkedList(链表实现):很适合数据的动态插入和删除,随机访问和遍历速度比较慢。还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
2.Set的功能方法
Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只 是行为不同。这是继承与多态思想的典型应用:表现不同的行为。Set不保存重复的元素(至于如何判断元素相同则较为负责)
Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet: 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
3.List和Set的区别
List | Set |
---|---|
和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。 | 检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 |
元素有放入顺序 | 元素无放入顺序 |
元素可重复 | 元素不可重复,重复的元素会被覆盖掉 |
可插入多个null元素 | 只允许插入一个 |
4.相互转化
因为List和Set都实现了Collection接口的addAll(Collection<? extends E> c)方法,因此可以采用addAll()方法将List和Set互相转换;另外,List和Set也提供了Collection<? extends E> c作为参数的构造函数,因此通常采用构造函数的形式完成互相转化。
//List转Set
Set<String> set = new HashSet<>(list);
//Set转List
List<String> list1 = new ArrayList<>(set);
具体代码展示:
//set转成list:(两种方法)
Set<String>set = new HashSet<String>();
list.add("11");
list.add("22);
list.add("33");
list.add("44");
//方法一:
List<String>list = new ArrayList<String>(set);
for(Strings : list) {
System.out.println(s);
}
System.out.println();
//方法二:
List<String>list2 = new ArrayList<String>();
list2.addAll(set);
for(Strings : list2) {
System.out.println(s);
}
注:list转成set后:
- 可能会丢失数据(因为set不允许重复);
- 原先在list中的数据顺序就没了。
//list转成set:(两种方法)
List<String>list = new ArrayList<String>();
list.add("11");
list.add("22);
list.add("33");
list.add("44");
//方法一:
Set<String>set = new HashSet<String>(list);
for(Strings : set) {
System.out.println(s);
}
System.out.println();
//方法二:
Set<String>set2 = new HashSet<String>();
set2.addAll(list);
for(Strings : set2) {
System.out.println(s);
}