Java自定义泛型类MyLinkedHashMap,简单模拟LinkedHashMap集合

编写程序,使用泛型技术,自定义泛型类MyLinkedHashMap<K, V>,简单模拟LinkedHashMap集合,实现集合元素的添加(不需要去重)、删除、根据key返回对应的value等功能。

提示:

1、使用2个Object数组分别存储集合元素的key和value对象;删除集合元素时,要将该元素后面的元素整体向前移动1位。

2、自定义的泛型类的形式如下: class MyLinkedHashMap<K, V> { }

3、该泛型类中方法的声明形式如下:

public int size() {} //返回集合中元素个数

public V get(Object key) {} //根据key返回对应的value

public void put(K key, V value) {} //添加集合元素

public void remove(Object key) {} //删除集合元素

public String toString(){} //重写的toString()方法

源代码

以下是使用泛型技术自定义的泛型类MyLinkedHashMap<K, V>的实现,简单模拟LinkedHashMap集合,并实现添加、删除、根据key返回value等功能。

class MyLinkedHashMap<K, V> {
    private Object[] keys; // 存储键的数组
    private Object[] values; // 存储值的数组
    private int size; // 集合中元素个数

    public MyLinkedHashMap() {
        keys = new Object[16];
        values = new Object[16];
        size = 0;
    }

    public int size() {
        return size;
    }

    public V get(Object key) {
        for (int i = 0; i < size; i++) {
            if (key.equals(keys[i])) {
                return (V) values[i];
            }
        }
        return null;
    }

    public void put(K key, V value) {
        // 判断是否已存在相同的key,若存在则替换其对应的value
        for (int i = 0; i < size; i++) {
            if (key.equals(keys[i])) {
                values[i] = value;
                return;
            }
        }
        // 扩容数组
        if (size == keys.length) {
            resize();
        }
        // 添加新的key-value对
        keys[size] = key;
        values[size] = value;
        size++;
    }

    public void remove(Object key) {
        for (int i = 0; i < size; i++) {
            if (key.equals(keys[i])) {
                // 将后面的元素整体向前移动1位
                System.arraycopy(keys, i + 1, keys, i, size - i - 1);
                System.arraycopy(values, i + 1, values, i, size - i - 1);
                // 将最后一位设置为null
                keys[size - 1] = null;
                values[size - 1] = null;
                size--;
                return;
            }
        }
    }

    private void resize() {
        int newSize = keys.length * 2;
        Object[] newKeys = new Object[newSize];
        Object[] newValues = new Object[newSize];
        System.arraycopy(keys, 0, newKeys, 0, size);
        System.arraycopy(values, 0, newValues, 0, size);
        keys = newKeys;
        values = newValues;
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("{ ");
        for (int i = 0; i < size; i++) {
            sb.append(keys[i]).append("=").append(values[i]);
            if (i != size - 1) {
                sb.append(", ");
            }
        }
        sb.append(" }");
        return sb.toString();
    }
}

在上述代码中,首先创建了两个Object类型的数组keys和values,分别用于存储键和值。size变量记录集合中元素的个数。

实现的方法包括:

  • size():返回集合中元素的个数。
  • get(Object key):根据key返回对应的value。遍历keys数组,查找与key相等的元素,并返回对应的values数组中的值。
  • put(K key, V value):添加集合元素。如果存在相同的key,则替换对应的value;如果keys数组已满,则进行数组扩容;将新的key-value对添加到末尾。
  • remove(Object key):删除集合元素。遍历keys数组,找到与key相等的元素,将其后面的元素整体向前移动1位。
  • resize():扩容数组方法。当keys数组已满时,将数组容量扩大为原来的两倍,并将原数组中的元素复制到新数组中。
  • toString():重写的toString()方法,用于以字符串形式返回集合的内容。

使用示例:

public class Main {
    public static void main(String[] args) {
        MyLinkedHashMap<String, Integer> map = new MyLinkedHashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);
        map.put("D", 4);
        
        System.out.println(map); // 输出: { A=1, B=2, C=3, D=4 }
        
        int value = map.get("C");
        System.out.println(value); // 输出: 3
        
        map.remove("B");
        System.out.println(map); // 输出: { A=1, C=3, D=4 }
        
        int size = map.size();
        System.out.println(size); // 输出: 3
    }
}

在示例中,我们创建了一个MyLinkedHashMap对象map,通过调用put()方法添加了四对键值对。然后使用toString()方法输出集合的内容。接着使用get()方法根据key获取对应的value,并输出。然后使用remove()方法删除了一个元素,再次输出集合的内容。最后使用size()方法获取集合中元素的个数并输出。

© 版权声明
THE END
喜欢就支持一下吧
点赞6赞赏 分享