All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.blade.kit.CaseInsensitiveHashMap Maven / Gradle / Ivy

package com.blade.kit;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;

public class CaseInsensitiveHashMap extends LinkedHashMap {

    private final Map KEY_MAPPING;

    public CaseInsensitiveHashMap() {
        super();
        KEY_MAPPING = new HashMap<>();
    }

    public CaseInsensitiveHashMap(int initialCapacity) {
        super(initialCapacity);
        KEY_MAPPING = new HashMap<>(initialCapacity);
    }

    public CaseInsensitiveHashMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
        this.KEY_MAPPING = new HashMap<>(initialCapacity);
    }

    @Override
    public boolean containsKey(Object key) {
        return super.containsKey(realKey(key));
    }

    @Override
    public V get(Object key) {
        return super.get(realKey(key));
    }

    @Override
    public V put(String key, V value) {
        if (key == null) {
            return super.put(null, value);
        } else {
            String oldKey   = KEY_MAPPING.put(key.toLowerCase(Locale.ENGLISH), key);
            V      oldValue = super.remove(oldKey);
            super.put(key, value);
            return oldValue;
        }
    }

    @Override
    public void putAll(Map m) {
        m.forEach(this::put);
    }

    @Override
    public V remove(Object key) {
        Object realKey;
        if (key != null) {
            realKey = KEY_MAPPING.remove(key.toString().toLowerCase(Locale.ENGLISH));
        } else {
            realKey = null;
        }
        return super.remove(realKey);
    }

    @Override
    public V getOrDefault(Object key, V defaultValue) {
        //当 lowerCaseMap 中不包含当前key时直接返回默认值
        if (key != null && !KEY_MAPPING.containsKey(key.toString().toLowerCase(Locale.ENGLISH))) {
            return defaultValue;
        }
        //转换key之后从super中获取值
        return super.getOrDefault(realKey(key), defaultValue);
    }

    @Override
    public void clear() {
        KEY_MAPPING.clear();
        super.clear();
    }

    private Object realKey(Object key) {
        if (key != null) {
            return KEY_MAPPING.get(key.toString().toLowerCase(Locale.ENGLISH));
        } else {
            return null;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy