Java 奇怪的哈希表ArrayIndexOutOfBounds异常

Java 奇怪的哈希表ArrayIndexOutOfBounds异常,java,hashtable,indexoutofboundsexception,Java,Hashtable,Indexoutofboundsexception,只有当密钥大于5个字符时,testGetBucket()才不起作用。例如,如果任何小狗名称超过5个字符,测试将为getBucket方法返回ArrayIndexOutOfBounds异常 @Test public void testGetBucket() { List<Puppy> puppies = getPuppies(); MyHashTable<String, Puppy> instance = new MyHashTable

只有当密钥大于5个字符时,testGetBucket()才不起作用。例如,如果任何小狗名称超过5个字符,测试将为getBucket方法返回ArrayIndexOutOfBounds异常

@Test
    public void testGetBucket() {
        List<Puppy> puppies = getPuppies();
        MyHashTable<String, Puppy> instance = new MyHashTable<>(DefaultCapacity, DefaultLoadFactor);

        for (int i = 0; i < 10; i++) {
            Puppy puppy = puppies.get(i);
            instance.put(puppy.name, puppy);
            System.out.print(i);
        }

        List<KeyValuePair<String, Puppy>> actual = instance.getBucket(8);
        assertEquals("Size of bucket is three", 3, actual.size());
        for (int i = 0; i < actual.size(); i++) {
            KeyValuePair<String, Puppy> p = actual.get(i);
            if (p.key.equals("Bob")) {
                assertEquals("Bucket contains " + p.value.name, puppies.get(1), p.value);
            } else if (p.key.equals("Francois")) {
                assertEquals("Bucket contains " + p.value.name, puppies.get(5), p.value);
            } else if (p.key.equals("Inigo")) {
                assertEquals("Bucket contains " + p.value.name, puppies.get(8), p.value);
            }
        }

        actual = instance.getBucket(3);
        assertEquals("Size of bucket is Zero", 0, actual.size());

        actual = instance.getBucket(0);
        assertEquals("Size of bucket is 1", 1, actual.size());
        KeyValuePair<String, Puppy> p = actual.get(0);
        assertEquals("Bucket contains " + p.value.name, puppies.get(2), p.value);
    }



public void put(K key, V value)
    {
       remove(key);
       KeyValuePair<K,V> element = new KeyValuePair<K,V>(key, value);
       getBucket(getBucketIndex(key.hashCode())).add(element);
    }


public int getBucketIndex(int hashCode)
    {
        return hashCode % getNumberOfCollisionBuckets();
    }

public List<KeyValuePair<K,V>> getBucket(int bucketIndex)
    {

        return collisionBuckets[bucketIndex];
    }
@测试
公共void testGetBucket(){
List puppies=getPuppies();
MyHashTable实例=新的MyHashTable(DefaultCapacity,DefaultLoadFactor);
对于(int i=0;i<10;i++){
小狗=小狗。获取(i);
实例.put(puppy.name,puppy);
系统输出打印(一);
}
List-actual=instance.getBucket(8);
assertEquals(“桶的大小为3”,3,实际.Size());
对于(int i=0;i
我要冒险说,问题出在这一部分

return hashCode % getNumberOfCollisionBuckets();
如果您的命名有任何指导意义,那么问题在于哈希代码。我不知道你为什么决定采用如此脆弱的实施方式

发生错误时,哈希代码的值必须高于调制后数组的索引值


那么如何解决这个问题呢?停止依赖hashCode来执行诸如获取数组索引之类的操作。。。这不是它的目的。

我们看不到
getNumberOfCollisionBucket()
也看不到
CollisionBucket
是如何初始化的。