Java中实现HashMap时的java.lang.ClassCastException

时间:2016-03-12 19:27:01

标签: java hashmap

当我使用MapEntry[] entry = (MapEntry[]) new Object[capacity]时,

它告诉我java.lang.ClassCastException。

这怎么可能发生?我很困惑。 (因为看起来我应该进行投射,因为它是通用的)

我找到了一些教程,他们正在使用这样的:

 table = new Entry[capacity];

http://www.javamadesoeasy.com/2015/02/hashmap-custom-implementation.html

它甚至没有进行铸造。

我的代码如下。

public class MyHashMap<K, V> {
    private class MapEntry {
        K key;
        V value;
        MapEntry next;
        MapEntry(K key, V value) {
            this.key = key;
            this.value = value;
        }
    }

    private int size = 0;
    private int capacity;
    MapEntry[] entry;

    @SuppressWarnings("unchecked")
    MyHashMap() {
        capacity = 10;
        entry =  (MapEntry[]) new Object[capacity];
    }

    @SuppressWarnings("unchecked")
    MyHashMap(int capacity) {
        entry =  (MapEntry[]) new Object[capacity];
    }

    public void put(K key, V value) {
        int hash = hashCode(key);
        MapEntry newNode = new MapEntry(key, value);
        if (entry[hash % capacity] == null) {
            entry[hash % capacity] = newNode;
        } else {
            if (key == entry[hash % capacity].key) {
                entry[hash % capacity].value = value;
            } else {
                MapEntry nextNode = entry[hash % capacity].next;
                while (nextNode != null) {
                    if (key == nextNode.key) {
                        nextNode.value = value;
                        return;
                    }
                    nextNode = nextNode.next;
                }
                nextNode = newNode;
            }
        }
    }

    public V get(K key) {
        int hash = hashCode(key);
        MapEntry node = entry[hash % capacity];
        if (node == null) {
            return null;
        }

        if (node.key == key) {
            return node.value;
        }

        while (key != node.key) {
            node = node.next;
            if (node.key == key) {
                return node.value;
            }
        }
        return null;
    }

    public boolean contains(K key) {
        return get(key) != null;
    }

    public int size() {
        return size;
    }

    public void remove(K key) {
        int hash = hashCode(key);
        MapEntry node = entry[hash % capacity];
        if (node == null) return;
        if (key == node.key) {
            entry[hash % capacity] = node.next;
        }

        MapEntry pre = node;
        while (key != node.key) {
            node = node.next;
            if (key == node.key) {
                pre.next = node.next;
                return;
            }
            pre = pre.next;
        }
    }

    private int hashCode(K key) {
        return Math.abs(key.hashCode());
    }

    public void display(){
       for(int i = 0; i < capacity; i++){
           if(entry[i] != null){
                MapEntry node = entry[i];
                while(node != null){
                    System.out.print("{" + node.key + "=" + node.value + "}" + " ");
                    node = node.next;
                }
           }
       }
    }

    public static void main(String[] args) {
        MyHashMap<Integer, Integer> hashMapCustom = new MyHashMap<Integer, Integer>();
        hashMapCustom.put(21, 12);
        hashMapCustom.put(25, 121);
        hashMapCustom.put(30, 151);
        hashMapCustom.put(33, 15);
        hashMapCustom.put(35, 89);

        System.out.println("value corresponding to key 21="
                     + hashMapCustom.get(21));
        System.out.println("value corresponding to key 51="
                     + hashMapCustom.get(51));

        System.out.print("Displaying : ");
        hashMapCustom.display();
        System.out.print("Displaying : ");
        hashMapCustom.display();
    }
}

2 个答案:

答案 0 :(得分:0)

您只能通过强制转换,因为您获得ClassCastException,因此无法转换数组的类。你应该使用

`Arrays.copyof ().`
CustomType[]ca=Arrays.copyOf(array,array.length,CustomType[].class);

答案 1 :(得分:0)

我已经弄明白了这是怎么回事。

(创建其组件类型为类型参数,具体参数化类型或有界通配符参数化类型的数组,类型不安全。)

    entry =  (MapEntry[]) Array.newInstance(MapEntry.class, capacity);

这样就没有错误。

另一个问题是良好的解决方案。 How to create a generic array in Java?