A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严明 初级黑马   /  2012-6-25 15:08  /  2405 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看视频的时侯,很多时候会碰到使用List集合 Set集合,一值不明白有什么区别,上网百度了一下,太杂了,
只知道List Set 读继承了Collection,List的元素是有序,可以重复的,Set集合的元素是无序的,元素不可以重复,
但是具体他们的使用场景,和使用时有什么约束条件,为什么有些地方用LisSet能得到同样结果, List更好点, 而不去用Set,


高人能不能举个简单的例子,简单明了的表达出他们的区别?

7 个回复

倒序浏览
我觉得你自己应该把他们的区别已经搞懂了。就是list有顺序而set无顺序,list可以重复,set不可以重复。
回复 使用道具 举报
list在遍历元素时效率比较高,set在重复add相同对象时会覆盖前一个。
回复 使用道具 举报
List和Set都是接口。他们各自有自己的实现类,有无顺序的实现类,也有有顺序的实现类。

List适合经常追加数据,插入,删除数据。但随即取数效率比较低。
Set适合经常地随即储存,插入,删除。但是在遍历时效率比较低。

List就是可以重复的集合。而Set是不可以重复的。
假如你输入1,2,2,4
那么在List集合中就有4个元素:1,2,2,4
但如果在Set集合中就只有3个元素了:1,2,4
回复 使用道具 举报
List接口对Collection进行了简单的扩充,它的具体实现类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器中,并在需要时从中取出。ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快,而LinkedList的内部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。在具体应用时可以根据需要自由选择。前面说的Iterator只能对容器进行向前遍历,而ListIterator则继承了Iterator的思想,并提供了对List进行双向遍历的方法。  

Set接口也是Collection的一种扩展,而与List不同的时,在Set中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个Set容器中。它的常用具体实现有HashSet和TreeSet类。HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了前面说过的哈希码的算法。而TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口。有时多个类具有相同的排序算法,那就不需要在每分别重复定义相同的排序算法,只要实现Comparator接口即可。集合框架中还有两个很实用的公用类:Collections和Arrays。Collections提供了对一个Collection容器进行诸如排序、复制、查找和填充等一些非常有用的方法,Arrays则是对一个数组进行类似的操作。  
回复 使用道具 举报
我做的笔记总结:
set底层也是一个map。
Tree开头的(TreeSet、TreeMap)都必须实现比较器(创建实现Comparator接口的类并实现其compare()方法)或者要比较的对象实现Comparable接口重写compareTo()方法

Hash开头的(HashMap、HashSet)一般要在要比较的对象对应的类中重写
int  hashCode()和 boolean equals(Object obj) 方法,如果不重写会按照默认方式比较

Set结尾的(HashSet、TreeSet)如果要添加的数据存在,则不会添加

Map结尾的(HashMap、TreeMap)如果要添加的key存在,则key不变,value会变为后来加入的key所对应的value
回复 使用道具 举报
严明 初级黑马 2012-6-25 17:58:33
7#
车风波 发表于 2012-6-25 17:19
我做的笔记总结:
set底层也是一个map。
Tree开头的(TreeSet、TreeMap)都必须实现比较器(创建实现Compar ...

这样啊,学到不少,Think you!
回复 使用道具 举报
本帖最后由 周兴中 于 2012-6-25 19:14 编辑

List按对象进入的顺序保存对象,不做排序或编辑操作。Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List)。

List的功能方法
实际上有两种List: 一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。
List : 次序是List最重要的特点:它保证维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。
ArrayList : 由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。
LinkedList : 对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

Set的功能方法
Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责)
Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马