黑马程序员技术交流社区

标题: 看了集合的部分,List和Set都能存放数据,应该怎么选择用它们? [打印本页]

作者: 蒋朝权    时间: 2011-9-27 13:50
标题: 看了集合的部分,List和Set都能存放数据,应该怎么选择用它们?
List list = new ArrayList();
Set set = new HashSet();
都存放一推数据的话,什么时候用list,什么时候用set,这点不是很理解,求各位分析解惑一下
作者: 许晨峰    时间: 2011-9-27 14:08
你的理解太广泛了,如果你仅仅存放一堆数据的话,数组和集合都可以实现;list和set都是集合Colletion接口的子接口。

他们还是有很多区别的:
           1,List存放数据时,按照进入先后进行有序保存,并且可以保存重复的数据,对它而言,它维护了每个元素的顺序,能够精确的控制每个元素的插入位置,我们可以通过索引来访问List
           2,Set只关心某元素是不是属于自己,并且它不可以保存重复的数据,而它的顺序,它也不会去管。

什么时候要用它们,要看它们适合做些什么。像List一般情况遍历较快,随机根据索引查询,以及增加删除效率较差。而Set随机的根据索引增删改很快,遍历较慢。最重要的它们前者可以存放重复的数据,后者则不可以!
[ 本帖最后由 许晨峰 于 2011-09-27  19:11 编辑 ]
作者: 匿名    时间: 2011-9-27 14:16
java集合:存入于java.util包中,它不能存放基本类型数据,而只能存放对象的引用。

  Set (集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按

  特定方式排序。与数学中的集合最接近,两者都不包含重复元素。

  List(列表):集合中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检

  索对象。List与数组有些相似。

List适合经常追加数据,插入,删除数据。但随即取数效率比较低。
Set适合经常地随即储存,插入,删除。但是在遍历时效率比较低。
作者: 匿名    时间: 2011-9-27 14:26
呵呵,
当不需要保证元素唯一时使用List,如果需要频繁的增删就使用其子类LinkedList,如果不需要频繁的增删就使用其子类ArrayList


当要要保证元素唯一时使用Set,当需要排序时就使用其子类TreeSet,当不需要排序时就使用其子类HashSet
作者: 匿名    时间: 2011-9-27 16:54
Set 接口实现的集合类存放的数据唯一,无序,且只能在一个null对象 ;
List接口实现的集合类存放的数据是有顺序的,也可重复,可有多个null对象;

hashSet类查找效率更高
作者: 匿名    时间: 2011-9-27 18:09
一句话    元素要重复List   元素不重复Set  不罗嗦
作者: 匿名    时间: 2011-9-27 18:22
List适合经常追加数据,插入,删除数据。但随即取数效率比较低。
Set适合经常地随即储存,插入,删除。但是在遍历时效率比较低。
作者: 匿名    时间: 2011-9-27 19:29
标题: 集合中的List和set
集合就有点数组的延深 ,数组是存放相同的数据类型,而且是长度固定的
而集合是存储对象的而且长度是不固定的
学集合要像学IO一样 他是框架 所以首先要学他顶层的接口 collection 而collection下面又有set和list接口
list:是有序的可重复的;有序是对象怎么存储在集合中 取出来就是怎么样的   可重复是因为list集合是根据角标来取出对象的 ,有一点大家要明白 集合存储对象是存储对象的应用。list集合下面有三个主要的类Arraylist  LinkedList  Vector而Vector被ArrayList替代了因为Arraylist效率更高 这是从 线程方面考虑的
Arraylist  是不同步的  集合一些常用的API要熟悉 还 有一个初学者学集合的困哪就是Iterator接口
set集合特点:无序 不可重复,和list可以看到做相反的   它有2个常用的类HashSet   TreeSet
至于什么使用list和set哪要看实际的情况而定!
作者: 匿名    时间: 2011-9-28 15:15
恩,分析得很透彻,谢谢!
作者: 蒋朝权    时间: 2011-9-29 09:52
标题: 回复 沙发 的帖子
谢谢了,看了你们的分析,也对集合的应用有了更深的认识,学习啊......
[ 本帖最后由 蒋朝权 于 2011-09-29  09:54 编辑 ]
作者: 匿名    时间: 2011-9-29 17:50
标题: list和set的区别
list是有序的,其实带角标,元素可以重复
set是无序的,不带角标,所以元素不可以重复。
【拓展知识:】
一.集合的概念
        1.什么是集合
                集合是一种长度可变, 可存储任意类型的容器
        2.集合分类
                Collection: 单列集合
                        List: 有序, 可重复
                                ArrayList:
                                        数组实现, 查找快, 增删慢.
                                        查找时, 只要从数组中获取元素即可.
                                        增加时, 如果数组装满, 需要创建新数组以及拷贝原有元素.
                                        删除时, 需要将删除位置以后的所有元素向前移动.
                                LinkedList:
                                        链表实现, 增删快, 查找慢.
                                        增删的时候只要改变前后两个元素的关系即可.
                                        查找的时候要逐个去找.
                                Vector:
                                        数组实现, 线程安全, 效率低, 已被ArrayList淘汰.
                        Set: 无序, 不重复
                Map: 键值对
               
二.List集合
        1.遍历集合
                a.for循环
                        通用的, 定义for循环, 循环size()次, 每次获取一个
                b.Iterator
                        通用的, iterator()方法获取一个Iterator接口的实现类对象, 调用hasNext()和next()方法
                c.Enumeration
                        此种方式是Vecotr特有的, elements()方法获取一个Enumeration, 调用hasMoreElements()方法和nextElement()
                d.增强for循环
                        通用的, 以 for(类型 变量名 : 容器) 形式对容器遍历, 循环第一次时将容器中第一个元素取出赋值给变量, 第二次取第二个...
        2.删除集合中元素
                在循环遍历集合时, 删除元素要注意, 需要将循环变量-1
                使用Iterator遍历集合的时候, 如果要删除元素需要使用Iterator类的remove()
               
三.JDK5新特性
        1.泛型:
                集合类是支持泛型的, 一旦集合类加上泛型就只能存储同一类型数据, 获取数据时返回的也是指定类型.
                将运行时容易出现的错误转到了编译期, 省去了类型强转的麻烦, 优化了程序的设计.
        2.增强for循环
                for(类型 变量名 : 容器) 形式的for循环, 循环第一次时将容器中第一个元素取出赋值给变量, 第二次取第二个, 直到所有元素都被获取过
        3.可变参数
                在函数的参数列表中, 可以使用"类型... 参数名"形式定义一个可变参数, 可变参数可以接收同一类型的任意个数数据, 或者可以接收一个数组.
                函数内部会将接受到的数据装入一个数组.
                可变参数必须是函数的最后一个.
               
四.Set集合
        1.Set集合特点:
                没有重复元素, 没有存储顺序
        2.HashSet
                使用哈希算法保证元素唯一.
                哈希值: 两个对象属性相同哈希值相同, 属性不同则哈希值尽量不同.
               
                当存储元素的时候, 先调用对象的hashCode()方法得到一个哈希值, 在集合中查找是否有哈希值相同的对象.
                如果没有哈希值相同的对象, 直接存入.
                如果有哈希值相同的对象, 则和相同哈希值的对象进行equals()方法比较.
                如果equals()返回true则不存, false就存入.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2