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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kj1989 中级黑马   /  2014-4-7 13:49  /  1318 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

map集合存储的是键值对,而set存储的是对象引用,为什么从map中取出数据要先将map集合转换成set集合那么这是怎么转的,其内在机制是什么?

5 个回复

正序浏览
首先 Set 集合内部 其实是由 Map集合来实现的,所以它们之间有一些关系的。
把Map 转换成 Set 有两种 输出方式
1,把 Map 集合中的主键 放入 Set 集合中,在遍历 Set 集合中的主键,在通过主键去获取其值
2,直接把把Map 集合中的一对映射值放入 Set 集合中,通过 entrySet()

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张治国 于 2014-4-7 17:19 编辑

“为什么从map中取出数据要先将map集合转换成set集合”,你这么说我认为不合理!
他只是map集合遍历的其中一种形式。不一定要先将map集合转成set集合!

可以使用增强for循环遍历Map集合的键集和值集,也可以使用普通for循环或者迭代器Iterator来遍历。都看个人习惯

我在这想追加个问题,就是这么多方法中那个方法它的效率最高呢?,

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
HashSet的实现其实非常简单,它只是封装了一个HashMap对象来存储所有的集合元素。所有放入HashSet中集合元素实际上由HashMap的key来保存。而HashMap的value则存储了一个PRESENT,它是一个静态的Object对象。

如果楼主想要比较体系的深入了解这部分机制,可以看以下书的相关章节:
《疯狂Java程序员的基本修养》第3章 常见Java集合的实现细节

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
map集合,对象以键值对的形式存放在集合中,并且键它是不允许重复的。常用的实现是HashMap和TreeMap,HashMap能够快速的查询到一个键,而TreeMap则是对键按序存放的。
map中的keyset()返回此映射中包含的键的 Set 视图,entryset()返回此映射中包含的映射关系的 Set 视图。
例如:
public void test3() {
Map map = new HashMap();

map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");

// 先取 key 再取 value
Set keys = map.keySet();
Iterator keyIterator = keys.iterator();
while(keyIterator.hasNext()) {
  String key = (String) keyIterator.next();
  String value = (String) map.get(key);
  System.out.println(key + "=" + value);
}
System.out.println("----------------------------");
// 取出所有 键值映射关系
Set entrys = map.entrySet();
Iterator entryIterator = entrys.iterator();
while(entryIterator.hasNext()) {
  Entry entry = (Entry) entryIterator.next();
  System.out.println(entry.getKey() + "=" + entry.getValue());
}
  System.out.println("------------------------");
// 增强for循环
for(Object obj : map.entrySet()) {
  Entry entry = (Entry) obj;
  System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
注意: 迭代集合的同时不能对集合进行增删操作java.util.ConcurrentModificationException
在迭代集合的同时需要对集合进行增删元素,一定要调用迭代器的方法
list接口是对collection的扩充,它允许存放相同的元素。常用的有2种实现类,ArrayList和LinkedList。ArraryList是一种以数组形式存放元素的集合,更适合于做查询,而LinkedList内部实现链表,适合做增删元素操作。
set接口同样是对collection的扩充,它不允许存放相同的元素。常用类HashSet和TreeSet.HashSet主要能够快速定位到一个元素,需要用到HashCode()方法,而TreeSet类中可以实现对元素的排序。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
从map集合取数据不一定非要转换成set集合,只有在需要把map集合中的数据全部取出时才需要转成set集合;如果仅仅是取一个特定的值是没有必要转换成set集合的,使用get(Object key)即可;
内部机制:(以把key转换为set集合为例)
在Map.keySet()方法里或者map成员位置上有个set集合,在调用keySet()方法的时候,此方法会把map里的所有key都添加进set集合里,然后返回给方法调用处。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马