hashmap.get方法是否会迭代所有对象值本身?

时间:2015-05-15 22:11:45

标签: java object hashmap

我用谷歌搜索了这个,但找不到令人满意的答案。 现在,我得到了一个包含多个这样的值的对象(取自数据库):

public class Student {
    private String name;
    private String vorname;
    private int matrikelnummer;
    private String studiengang;
    private int author_id;
    private int grp;

    public Student(int mat, int tut_id, int author, String stud) {
        setMatrikel(mat);
        setGrp(tut_id);
        setAuthor_id(author);
        setStudiengang(stud);
    }
}

创建了这些对象的数组,但我需要再次访问这些对象以进行进一步的数据库相关工作,所以我想到了使用hashmap(第一次)。要么为每个值创建一个hashmap,要么我使用已经创建的对象将数组槽作为关键但是如果我使用hashmap.get(someMatnumber),那么hashmap会自动遍历所有对象和包含的值吗?或者我有添加一些额外的代码?

感谢阅读。 :)

4 个答案:

答案 0 :(得分:2)

您的问题很难理解。但是,如果我们脱离背景(某种程度上),可以回答这部分:

  

如果我使用hashmap.get(someMatnumber),hashmap会自动遍历所有对象和包含的值吗?还是我必须添加一些额外的代码?

如果您询问HashMap.get方法内部是否遍历所有对象,则答案为"否"。如果我们假设非病理性密钥 1 ,则get调用将查看非常少量的条目对象(键/值对)。在技​​术方面,它是O(1)

如果您询问是否可以使用(仅)HashMap.get调用来迭代HashMap中的键,值或键值对,而无需编写更多代码,那么答案就是答案是"不"。

  • 如果您可以枚举所有可能的密钥(例如,您有一个单独的可能的列表),您可以这样做:

    for (possibleKey K : allPossibleKeys) {
        V value = map.get(possibleKey);
        if (value != null) {
             // we now know that possibleKey is present in the map
        }
    }
    

    但这是1)编写额外的代码,2)可能效率低下。

  • 迭代地图中的键的正常(有效)方法是使用键集:

    for (key K : map.keySet()) {
        ...
    }
    

    请注意,我们根本不使用get来迭代密钥。您可以以相同的方式迭代值集和条目集。

1 - 有几种病理情况。 1)如果地图中的大多数/所有键具有相同的哈希值,则在最坏的情况下,单个get调用可能需要查看大多数/所有键。 2)如果哈希映射变得非常大(超过2 ^ 31个条目),那么地图就不能再扩展哈希数组,并且哈希链将开始增长。但是,平均链长可能大约为ceiling(size / 2^31)),如果尺寸确实大,则只会出现问题。

答案 1 :(得分:1)

执行Map<String, Student> mydata = new HashMap<String, Student>();并检索Student班级mydata.get("student name you entered");,这将返回学生对象

希望有所帮助

答案 2 :(得分:0)

听起来我觉得.get(#)会移除它所获得的物品。它不是。要循环或遍历HashMap,只需执行以下操作:

for(HashMapKeyType var : hashmap.keyset()){
  hashmap.get(var); //Get the value from hash map using the var.
}

答案 3 :(得分:-1)

地图模拟数学函数抽象。 hashmap实现不按地图顺序保证,并为基本操作提供恒定时间性能(get和put)