设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 运营中心 > 交互 > 正文

Java HashMap的工作原理(2)

发布时间:2020-12-31 06:34 所属栏目:31 来源:网络整理
导读:Country other = (Country) obj; span class="hljs-keyword"if (name.equalsIgnoreCase((other.name))) span class="hljs-keyword"return span class="hljs-keyword"true; span class="hljs-keyword"return span cl

Country other = (Country) obj;
<span class="hljs-keyword">if (name.equalsIgnoreCase((other.name)))
<span class="hljs-keyword">return <span class="hljs-keyword">true;
<span class="hljs-keyword">return <span class="hljs-keyword">false;
}

}

2. HashMapStructure.java(main class)

<span class="hljs-comment"&gt;/**
 * @author Arpit Mandliya
 */
<span class="hljs-keyword"&gt;public <span class="hljs-keyword"&gt;static <span class="hljs-built_in"&gt;void main(<span class="hljs-built_in"&gt;String[] args) {

    Country india=<span class="hljs-keyword"&gt;new Country(<span class="hljs-string"&gt;"India",<span class="hljs-number"&gt;1000);
    Country japan=<span class="hljs-keyword"&gt;new Country(<span class="hljs-string"&gt;"Japan",<span class="hljs-number"&gt;10000);

    Country france=<span class="hljs-keyword"&gt;new Country(<span class="hljs-string"&gt;"France",<span class="hljs-number"&gt;2000);
    Country russia=<span class="hljs-keyword"&gt;new Country(<span class="hljs-string"&gt;"Russia",<span class="hljs-number"&gt;20000);

    HashMap<country,<span class="hljs-built_in"&gt;string> countryCapitalMap=<span class="hljs-keyword"&gt;new HashMap<country,<span class="hljs-built_in"&gt;string>();
    countryCapitalMap.put(india,<span class="hljs-string"&gt;"Delhi");
    countryCapitalMap.put(japan,<span class="hljs-string"&gt;"Tokyo");
    countryCapitalMap.put(france,<span class="hljs-string"&gt;"Paris");
    countryCapitalMap.put(russia,<span class="hljs-string"&gt;"Moscow");

    Iterator<country> countryCapitalIter=countryCapitalMap.keySet().iterator();<span class="hljs-comment"&gt;//put debug point at this line
    <span class="hljs-keyword"&gt;while(countryCapitalIter.hasNext())
    {
        Country countryObj=countryCapitalIter.next();
        <span class="hljs-built_in"&gt;String capital=countryCapitalMap.get(countryObj);
        System.out.println(countryObj.getName()+<span class="hljs-string"&gt;"----"+capital);
        }
    }

}

现在,在第23行设置一个断点,在项目上右击->调试运行(debug as)->java应用(java application)。程序会停在23行,然后在countryCapitalMap上右击,选择“查看”(watch)。将会看到如下的结构:

Java HashMap的工作原理

从上图可以观察到以下几点:

1. 有一个叫做table大小是16的Entry数组。

2. 这个table数组存储了Entry类的对象。HashMap类有一个叫做Entry的内部类。这个Entry类包含了key-value作为实例变量。我们来看下Entry类的结构。Entry类的结构:


3. 每当往hashmap里面存放key-value对的时候,都会为它们实例化一个Entry对象,这个Entry对象就会存储在前面提到的Entry数组table中。现在你一定很想知道,上面创建的Entry对象将会存放在具体哪个位置(在table中的精确位置)。答案就是,根据key的hashcode()方法计算出来的hash值(来决定)。hash值用来计算key在Entry数组的索引。

4. 现在,如果你看下上图中数组的索引10,它有一个叫做HashMap$Entry的Entry对象。

5. 我们往hashmap放了4个key-value对,但是看上去好像只有2个元素!!!这是因为,如果两个元素有相同的hashcode,它们会被放在同一个索引上。问题出现了,该怎么放呢?原来它是以链表(LinkedList)的形式来存储的(逻辑上)。

上面的country对象的key-value的hash值是如何计算出来的。

Japan的Hash值是95,它的长度是奇数。?India的Hash值是95,它的长度是奇数。?Russia的Hash值是31,它的长度是偶数。?France,它的长度是偶数。??

下图会清晰的从概念上解释下链表。

Java HashMap的工作原理

所以,现在假如你已经很好地了解了hashmap的结构,让我们看下put和get方法。

Put :

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读