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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余善航 中级黑马   /  2013-2-22 20:03  /  2605 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 现打印出来   而且就业班的顺序也不对
  * */

5 个回复

正序浏览
      当然了,hashMap集合和hashSet集合是一样是啊,底层都是哈希表数据结构的,当你把元素存进集合的时候,其集合内部也会按照顺序排列的,只不过是按照存进集合元素的哈希值进行位置安排的,在你取出的时候,是按照根据哈希值排序后的元素依次取出的,当然也不排除取出的顺序和你存入的顺序一致,那就代表你存入元素的哈希值碰巧的顺序和你存入顺序相同,所以也可以说hash类的集合和Tree类一样也能进行排序,只不过排序的依据是哈希值而已,每个元素的哈希值你又不知道,所以貌似是无需的。
    还有一点,这里的无序并不是随机输出的,你运行n次发现输出是顺序都是一样的,即按照哈希值输出。
回复 使用道具 举报
查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 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。

回复 使用道具 举报
HashMap底层使用的哈希算法,在存入一个元素时,会通过hashcode方法得出一个int值,由此int值来确定新元素的存放位置。所以取出时并不一定是存入的顺序
回复 使用道具 举报
{:soso_e179:}楼上正解,Map 和Set很像(Set底层使用了Map集合),都是元素无序(存入和取出的顺序不一定一致)....
回复 使用道具 举报
hashMap的特性之一,集合内元素无序
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马