Set和List的区别

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的区别

ListSet
数组类似,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);
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值