代码之家  ›  专栏  ›  技术社区  ›  user9467051

初始化HashMap<Integer,List<Object>>

  •  2
  • user9467051  · 技术社区  · 6 年前

    我正在尝试填充hashmap的值

    HashMap<Integer,List<Human>> hm=new HashMap<>(100);
    
    for(int j=0;j<hm.size();j++)
    {
        hm.put(j,new ArrayList<>());
    }
    

    但当我这么做的时候:

    Human x= new Human();
    hm.get(3).add(x);
    

    我得到:

    java.lang.NullPointerException
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   Maciej    6 年前

    hm.size()为零-因为你没有在那里放任何东西。 100参数只是此处“启动容量”的初始化。

    将循环更改为 for(int j=0;j<100;j++)

        2
  •  2
  •   AxelH    6 年前

    你没有得到 100 具有 hm.size() 但是 0 。您无法获得使用该构造函数构建的内容。您已使用该构造函数设置了“InitialCapacity”:

    HashMap(int initialCapacity)

    使用指定的初始容量和默认加载因子(0.75)构造空哈希映射。

    但是 HashMap.size() 返回的实际数量 key-value 要素

    返回此映射中的键值映射数。

    供您参考:

    HashMap实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数,初始容量只是创建哈希表时的容量。负载因子是在自动增加哈希表容量之前,允许哈希表达到的满度的度量。当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新刷新(即重建内部数据结构),以便哈希表的存储桶数大约是当前存储桶数的两倍。

    相反,只需设置 100 在循环中实例化 List

    Map<Integer,List<Human>> hm = new HashMap<>();
    for(int j=0; j < 100; j++){
        hm.put(j,new ArrayList<>());
    }
    

    或者更好的是,使用一个常数

    final static int NB_LIST = 100;
    
    Map<Integer,List<Human>> hm = new HashMap<>();
    for(int j=0; j < NB_LIST; j++){
        hm.put(j,new ArrayList<>());
    }
    
        3
  •  1
  •   Veselin Davidov    6 年前

    hm.size()返回0,因为您尚未在hashmap中添加任何内容。来自java站点:

    返回此映射中的键值映射数。

    您使用一些初始大小初始化它,但里面没有值,因此for循环没有任何作用。如果你用1到100的价格,而不是1到100的价格,它就会像你所期望的那样工作。