Java 试图理解hashmap数据结构

Java 试图理解hashmap数据结构,java,data-structures,hashmap,Java,Data Structures,Hashmap,我正在做一个关于构建hashmap数据结构的家庭作业,但我不理解给我们的一行代码。在程序中,变量按如下方式启动: private Map<K,V>[] buckets; private Map[]bucket; 我知道在hashmap中使用bucket的概念是什么,但是如何使用map数组来创建bucket呢?当我看这段代码时,似乎我需要创建一个哈希映射数组,但这根本没有意义 如果你需要更多的信息,请告诉我 非常感谢您的帮助 下面是提供的代码 package cs2321; im

我正在做一个关于构建hashmap数据结构的家庭作业,但我不理解给我们的一行代码。在程序中,变量按如下方式启动:

private Map<K,V>[] buckets;
private Map[]bucket;
我知道在hashmap中使用bucket的概念是什么,但是如何使用map数组来创建bucket呢?当我看这段代码时,似乎我需要创建一个哈希映射数组,但这根本没有意义

如果你需要更多的信息,请告诉我

非常感谢您的帮助

下面是提供的代码

package cs2321;

import net.datastructures.*;

public class HashMap<K, V> implements Map<K, V> {

private Map<K,V>[] buckets;

protected final int mDefaultHashSize = 1021;

/**
 * Constructor that takes a hash size
 * @param hashsize The number of buckets to initialize
 *                 in the HashMap
 */
public HashMap(int hashsize){
    // TODO: Be sure to initialize the bucket array
    //       using the hashsize given as the number of buckets
}

public HashMap(){
    // TODO: Be sure to initialize the bucket array
    //       using the default hash size provided.
}


public Iterable<Entry<K, V>> entrySet() {
    // TODO Auto-generated method stub
    return null;
}

public V get(K key) throws InvalidKeyException {
    // TODO Auto-generated method stub
    return null;
}

public boolean isEmpty() {
    // TODO Auto-generated method stub
    return false;
}

public Iterable<K> keySet() {
    // TODO Auto-generated method stub
    return null;
}

public V put(K key, V value) throws InvalidKeyException {
    // TODO Auto-generated method stub
    return null;
}

public V remove(K key) throws InvalidKeyException {
    // TODO Auto-generated method stub
    return null;
}

public int size() {
    // TODO Auto-generated method stub
    return 0;
}

public Iterable<V> values() {
    // TODO Auto-generated method stub
    return null;
}
包cs2321;
导入net.datastructures.*;
公共类HashMap实现映射{
私人地图[]桶;
受保护的最终int-mDefaultHashSize=1021;
/**
*采用哈希大小的构造函数
*@param hashsize要初始化的存储桶数
*在HashMap中
*/
公共HashMap(int hashsize){
//TODO:确保初始化bucket数组
//使用给定的hashsize作为存储桶数
}
公共HashMap(){
//TODO:确保初始化bucket数组
//使用提供的默认哈希大小。
}
公共Iterable入口集(){
//TODO自动生成的方法存根
返回null;
}
public V get(K键)抛出InvalidKeyException{
//TODO自动生成的方法存根
返回null;
}
公共布尔值为空(){
//TODO自动生成的方法存根
返回false;
}
公共可编辑键集(){
//TODO自动生成的方法存根
返回null;
}
公共V put(K键,V值)抛出InvalidKeyException{
//TODO自动生成的方法存根
返回null;
}
public V remove(K键)抛出InvalidKeyException{
//TODO自动生成的方法存根
返回null;
}
公共整数大小(){
//TODO自动生成的方法存根
返回0;
}
公共Iterable值(){
//TODO自动生成的方法存根
返回null;
}

}如果没有更广泛的代码基础,很难准确地说,但是从给出的信息来看,我怀疑在本文中“Map”实际上是指“MapEntry”或类似的东西,并且Map条目表示键/值对

请记住,hashmap存储桶需要同时包含键和值,以便能够区分具有不同键但具有相同哈希值的条目

请注意,Java中的映射项通常应符合。如果您案例中使用的“Map”类支持此接口,那么这是一个很好的线索,表明它正在扮演此角色:-)

当然,另一种可能性是它们实际上是表示每个bucket内容的hashmap。但这似乎很奇怪,原因有二:

  • 在单个bucket中使用hashmap没有任何好处,因为您已经知道它们具有相同的hashcode
  • 如果您已经有了一个hashmap实现,那么使用它来重新实现另一个hashmap会很奇怪
我猜地图也可能是另一种地图(可能是红黑树?),但这也很奇怪——通常桶实现会使用数组或链表,而不是重量级地图数据结构

更新(代码发布后)


从现在发布的代码中可以清楚地看出,其意图是最后两个选项之一,即使用另一个映射结构来实现hashmap,以表示每个bucket的内容。出于上面给出的原因,这似乎有些奇怪,但我认为从模板代码中可以清楚地看出,这正是它的意图。

这里有一组HashMap,用于演示HashMap的工作原理。研究它,告诉我们它是如何工作的,以及为什么HashMaps被如此广泛地使用

public class Test {
static private Map<String,String>[] buckets;
static int numberOfBuckets = 3;
static public void main(String...strings) {
    buckets = new Map[numberOfBuckets];
    for (int x=0; x!=numberOfBuckets; x++) {
        buckets[x]=new HashMap<String,String>();
    }
    String s1 = "one ijsiji jdj i";
    String s2 = "two ijs42i jdj i";
    String s3 = "th3 ijsiji 42j i";
    String s4 = "i42 ji jdj i";
    buckets[(Math.abs(s1.hashCode()) % numberOfBuckets)].put(s1,""); 
    buckets[(Math.abs(s2.hashCode()) % numberOfBuckets)].put(s2,""); 
    buckets[(Math.abs(s3.hashCode()) % numberOfBuckets)].put(s3,""); 
    buckets[(Math.abs(s4.hashCode()) % numberOfBuckets)].put(s4,""); 
    for (int x=0; x!=numberOfBuckets; x++) {
        System.out.println(buckets[x]);
    }
}
}

你说得对,那没有道理。通常桶是用链表实现的。谢谢你,米凯拉,我明白你的意思。在我们使用的书《Java中的数据结构和算法,第五版》中,它使用Entry[]来创建bucket数组。一旦我弄明白如何正确使用这个网站,我将发布我们的讲师提供的整个课程。
{two ijs42i jdj i=}
{one ijsiji jdj i=, i42 ji jdj i=}
{th3 ijsiji 42j i=}