黑马程序员技术交流社区
标题:
Map 对象 输出的顺序
[打印本页]
作者:
余善航
时间:
2013-2-22 20:03
标题:
Map 对象 输出的顺序
package Mapmapmao;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class MapDuiXiang {
/**
* @param args
*/
public static void main(String[] args) {
HashMap<String, HashMap<String,String>> xuexiao=new HashMap<String, HashMap<String,String>>();
HashMap<String,String> yr=new HashMap<String, String>();
HashMap<String,String> jy=new HashMap<String, String>();
xuexiao.put("yurenban",yr);
yr.put("01","zhang1");
yr.put("02","zhang2");
xuexiao.put("jiuye", jy);
jy.put("1","zhang11111");
jy.put("2","zhang22222");
Set<String> st=xuexiao.keySet();
Iterator<String> it=st.iterator();
while(it.hasNext())
{
String s=it.next();
HashMap<String,String> hs=xuexiao.get(s);
System.out.println(s);
pp(hs);
}
}
public static void pp(HashMap<String,String> map)
{
Set<String> st=map.keySet();
Iterator<String> it=st.iterator();
while(it.hasNext())
{
String key=it.next();
String value=map.get(key);
System.out.println(key+" "+value);
}
}
}
/*
* 为什么输出结果是这样的
jiuye
2 zhang22222
1 zhang11111
yurenban
01 zhang1
02 zhang2
先存的是yurenban 结果后打印出来
后存的是jiuye 现打印出来 而且就业班的顺序也不对
* */
作者:
夏振博
时间:
2013-2-22 20:17
hashMap的特性之一,集合内元素无序
作者:
汪平乐
时间:
2013-2-22 20:56
{:soso_e179:}楼上正解,Map 和Set很像(Set底层使用了Map集合),都是元素无序(存入和取出的顺序不一定一致)....
作者:
吴硕
时间:
2013-2-22 21:17
HashMap底层使用的哈希算法,在存入一个元素时,会通过hashcode方法得出一个int值,由此int值来确定新元素的存放位置。所以取出时并不一定是存入的顺序
作者:
杨杨
时间:
2013-2-23 12:39
查jdk api
public interface Map<K,V>将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。
Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如 TreeMap 类;
另一些映射实现则不保证顺序,如 HashMap 类。
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)
此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。
通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括 get 和 put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。
如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。
作者:
郝强勇
时间:
2013-2-23 13:35
当然了,hashMap集合和hashSet集合是一样是啊,底层都是哈希表数据结构的,当你把元素存进集合的时候,其集合内部也会按照顺序排列的,只不过是按照存进集合元素的哈希值进行位置安排的,在你取出的时候,是按照根据哈希值排序后的元素依次取出的,当然也不排除取出的顺序和你存入的顺序一致,那就代表你存入元素的哈希值碰巧的顺序和你存入顺序相同,所以也可以说hash类的集合和Tree类一样也能进行排序,只不过排序的依据是哈希值而已,每个元素的哈希值你又不知道,所以貌似是无需的。
还有一点,这里的无序并不是随机输出的,你运行n次发现输出是顺序都是一样的,即按照哈希值输出。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2