黑马程序员技术交流社区

标题: List、Map、Set三个接口,存取元素时,各有什么特点? [打印本页]

作者: whocases    时间: 2012-6-19 18:04
标题: List、Map、Set三个接口,存取元素时,各有什么特点?
本帖最后由 whocases 于 2012-6-21 13:41 编辑

List、Map、Set三个接口,存取元素时,各有什么特点?
作者: 陈嘉宾    时间: 2012-6-19 18:19
本帖最后由 陈嘉宾 于 2012-6-19 18:25 编辑

List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector

LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢

ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低

Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet

SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现)

Query接口有一个实现类:LinkList

Map接口有三个实现类:HasMap,HashTable,TreeMap

Hashtable,底层是哈希表数据结构,不可以存入null键null值,该集合线程同步,效率低

HasMap
底层是哈希表数据结构,可以
存入null键null值,该集合不同步,效率高

TreeMap
:底层是二叉树,线程不同步,可用于给map集合中的键进行排序

作者: 晏文根    时间: 2012-6-19 18:22
List与Set具有相似性,它们都是单列元素的集合,它们有一个功共同的父接口Collection。Set里面不允许有重复的元素,所谓重复,即不能有两个相等的对象 ,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去,所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。
List表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add(Obj e)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。
Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。取则可以根据key获得相应的value,即get(Object key)返回值为key 所对应的value。另外,也可以通过keySet()获得所有的key的结合 Set<K>,还可以通过values()获得所有的value的结合Collection<V>,还可以通过entrySet()获得key和value组合成的Map.Entry对象的集合 Set<Map.Entry<K,V>>。

List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

作者: 王璐    时间: 2012-6-19 18:25
这个问题,毕老师在视频中讲的很详细了,还讲了底层数据结构,建议仔细看视频。。。
作者: 余银桂    时间: 2012-6-19 18:27
本帖最后由 余银桂 于 2012-6-19 18:33 编辑

Java集合框架位于java.util包中


List 采用线性列表的存储方式,长度可动态改变 ,可有重复元素
实现类 ArrayList 和 LinkedList

Map 采用键-值对的存储方式,长度可动态改变
实现类 HashMap

set 它的对象不按特定方式排序,只是简单的把对象加入集合中 ,不可有重复元素

作者: 孙峰    时间: 2012-6-19 18:30
       List和Set在元素存入集合中后,都要用iterator 迭代器来取出,按集合底层的数据结构顺序取出。  因为List 的存储是按输入时顺序。所以取的时候也能按照放时顺序, 这也就是为什么说List 是有序的。  但是  Set 中,HashSet 按hash值顺序存, TreeSet按 二叉树存。  那么取出的时候相对于外界往里存是无序的。  这也就是 说Set是无序的。
   有个特殊的就是。List 中ArrayList 这个数值存储,可有用脚标进行操作, 也就是ListIterator.

Map,中数据是按 键-值对进行存储。 取出的时候只有两种方法。
  1、 KeySet, 将 键-值 对中的 键(key) 取出,并将key 存入Set 集合中,  对key 迭代取出后,再通过key 获得对应的 值。
  2、entrySet 方法,将 键-值 这种映射关系 作为一个对象 存入 Set 集合中。  迭代出这个关系后,再通过 关系的 getKey()  和getValue(),获得 键 和 值。


作者: 胡大强    时间: 2012-6-19 18:32
List 接口继承了Collection 接口以定义一个允许重复项的有序集合
Map接口位于java.util包下,实现Map的类是可用来存储键(Key)值(Value)的容器
Set接口也是Collection接口的子接口,但是与Collection或List接口不同的是,Set接口中不能加入重复的元素

关于这三个接口的问题在java的API文档有详细的描述~!
作者: 常佳杰    时间: 2012-6-19 19:37
Set集:集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象安特定方式排序。
List集:集合中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,List与数组有些相似。
Map集:集合中的每一个元素包含一对键对象,集合中没有重复的键对象,但值对象可以重复。它的有些实现类能对集合中的键对象进行排序。
这三个统称为java集合,其中Set与数学中的集合最接近,两者都不能包含重复对象。

顺便再说些关于这三个接口一些知识点吧..
Set接口和List接口继承了Collection接口,而Map接口没有继承Collection接口,因此Set和List对象可以调用iterator()和toArray()方法..

Set接口主要有两个实现类:
HashSet(存取速度比较快)和TreeSet(具有排序功能)...
List接口主要的实现类:
ArrayList(允许对元素进行快速的随机访问并且较快,插入和删除元素的速度就较慢了)和LinkedList(刚好和ArrayList相反)....
Map接口比较常用的实现类:
HashMap(存取性能好)和TreeMap(能对键对象进行排序)...
作者: 常佳杰    时间: 2012-6-19 19:43
还有一点忘说了
就是要想对Map集合遍历需通过调用EntrySet()方法来调用set集合里的Iterator来遍历....




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