黑马程序员技术交流社区
标题:
Set集合与Map集合的区别及什么情况下用哪个?
[打印本页]
作者:
张小庆
时间:
2012-4-7 17:23
标题:
Set集合与Map集合的区别及什么情况下用哪个?
虽然认真的看了毕老师的视频,但是对于Set集合与Map集合到底该什么时候用不是很清楚,找高手给具体讲解一下啊。
作者:
秦岩
时间:
2012-4-7 17:27
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时,结果会按元素插入的次序显示。
Map的功能方法
方法put(Object key, Object value)添加一个“值”(想要得东西)和与“值”相关联的“键”(key)(使用它来查找)。方法get(Object key)返回与给定“键”相关联的“值”。可以用containsKey()和containsValue()测试Map中是否包含某个“键”或“值”。标准的Java类库中包含了几种不同的Map:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它们都有同样的基本接口Map,但是行为、效率、排序策略、保存对象的生命周期和判定“键”等价的策略等各不相同。
执行效率是Map的一个大问题。看看get()要做哪些事,就会明白为什么在ArrayList中搜索“键”是相当慢的。而这正是HashMap提高速度的地方。HashMap使用了特殊的值,称为“散列码”(hash code),来取代对键的缓慢搜索。“散列码”是“相对唯一”用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都能产生散列码,因为hashCode()是定义在基类Object中的方法。
HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显著提高性能。
Map : 维护“键值对”的关联性,使你可以通过“键”查找“值”
HashMap : Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。
LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
WeakHashMao : 弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
IdentifyHashMap : 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计。
作者:
翟友伟
时间:
2012-4-7 17:28
我靠 连这个基本的 常识都不清楚 ,还说 看了毕老师的视频。。。无语了
作者:
张小庆
时间:
2012-4-7 17:32
翟友伟 发表于 2012-4-7 17:28
我靠 连这个基本的 常识都不清楚 ,还说 看了毕老师的视频。。。无语了
...
呃~~慧根比较浅,见谅啊
作者:
翟友伟
时间:
2012-4-7 17:33
最基本的 就是 map里头 存放的 是键值对 的元素 <Key,Value>
Set是无序,元素唯一, 有HashSet,TreeSet
Map 有 HashMap,TreeMap
作者:
郑苑东
时间:
2012-4-7 17:34
set集合其实底层也是map集合。。。set中的元素不允许重复。。其实就是map中的key不允许重复一样。。比如我们想统计一个我们随机生成的数组,,其中数字出现的次数。。就 可以用。。我们用key来记录出现的数。。通过value来记录出现的数的次数。。。如果这个数已经存在了就不同添加这个数。。。没出现一个就加1.。。
作者:
翟友伟
时间:
2012-4-7 17:38
你所操作的 元素 需要建立 对于映射关系的 时候用 map集合
具体应用可以看 毕向东的 那个 把"asdasdasdasdsas"字符串 按各个字母出现次数输出的例子。。
作者:
翟友伟
时间:
2012-4-7 17:43
一般网页中 , map用的也比较多
按照对于的键 取出对应的值 进行操作
具体实际开发中的例子 咱们现在这水平阶段还没机会接触到 。
作者:
王运科
时间:
2012-4-7 17:49
map集合,对象以键值对的形式存放在集合中,并且键是不允许重复的。常用的实现是HashMap和TreeMap,HashMap能够快速的查询到一个键,而TreeMap则是对键按序存放的。
set接口同样是对collection的扩充,它不允许存放相同的元素。常用类HashSet和TreeSet.HashSet主要能够快速定位到一个元素,需要用到HashCode()方法,而TreeSet类中可以实现对元素的排序。
作者:
薛飞飞
时间:
2012-4-7 18:34
Set集合
1.特点:
元素是无序(存人和去除的顺序不一定一致),元素不可重复。
2.子类:
HashSet:底层数据结构是哈希表,线程是非同步的。
HashSet是如何保证元素的唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的Hashcode值相同,才会判断equals是否为true。
如果元素的hashCode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode 和equals方法。
TreeSet:可以对Set集合中的元素进行排序
底层数据结构式二叉树。
保证元素唯一性的依据:
compareTo方法return
TreetSet排序的第一种方式:让元素自身具备比较性,
元素需要实现Comparable接口,覆盖compareTo方法。
这种方式也成为元素的自然顺序,或者叫做默认顺序。
TreetSet排序的第二种方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。
Map集合
1.特点:
该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
2.子类:
HashMap:基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键
遍历:
先调用keySet()得到key的set集合,
再迭代遍历key的set集合,
根据key得到value。
Hashtable:同HashMap,一般不使用
HashMap与Hashtable的区别:
HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是同步的。效率高
Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。
作者:
newlaw2013
时间:
2012-4-7 18:43
Map:
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的,JDK1.0,效率低。
|--HashMap:底层是哈希表数据结构,允许存入null键null值。线程不同步的,JDK1.2,效率高。
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。
和Set很像,Set底层就是使用了Map集合,它其中的大部分方法都是Map的。
重点的两个方法:entrySet和KeySet
作者:
张小庆
时间:
2012-4-7 21:33
基本搞明白了,谢谢大家啊
作者:
pray
时间:
2014-4-26 04:19
看了楼主的帖子,我面色凝重 ,关掉电脑,起身打开冰箱,拿出一瓶农妇山泉,拿在手里走到窗前,凝 视着远方,外面灰蒙蒙的天空下着小 雨,看着窗外,我的心情更忧郁了, 我再也无法抑制内心的情感,打开窗 子,对着窗外大声呐喊道:楼主,你 写的这是神马几把玩意?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2