データ構造 - 地図インタフェース

簡単な紹介

通常、1つの最も一般的なデータ構造は、重複キーを含めることはできません内部のマップセットを構成するキーですが、重複する値が含まれていてもよいです。

地図インタフェース
public interface Map<K,V>
地図メソッドが実装されていません
// 获取元素个数
int size();
// 是否为空
boolean isEmpty();
// 是否包含key
boolean containsKey(Object key);
// 是否包含value
boolean containsValue(Object value);
// 根据key取值
V get(Object key);
// 添加元素
V put(K key, V value);
// 移除key
V remove(Object key);
// 添加一个Map集合
void putAll(Map<? extends K, ? extends V> m);
// 清除
void clear();
// 获取整个key集合
Set<K> keySet();
// 获取所有值
Collection<V> values();
// 获取所有键值对
Set<Map.Entry<K, V>> entrySet();
// 比较是否一样
boolean equals(Object o);
// 获取集合hashCode
int hashCode();
デフォルトの方法の地図
default V getOrDefault(Object key, V defaultValue) {
    V v;
    // key不存在或key对应值为空返回默认值,否有返回实际值
    return (((v = get(key)) != null) || containsKey(key))
            ? v
            : defaultValue;
}

値取得キーは、デフォルト値は空または不在で返されます

default V putIfAbsent(K key, V value) {
    V v = get(key);
    // key为空则添加
    if (v == null) {
        v = put(key, value);
    }
    return v;
}

キーが存在しないか空でない場合、このキーと値のペアを追加

default boolean remove(Object key, Object value) {
    Object curValue = get(key);
    // value不一样或key不存在返回false
    if (!Objects.equals(curValue, value) ||
            (curValue == null && !containsKey(key))) {
        return false;
    }
    remove(key);
    return true;
}

同じ値に対応するキー値が削除する場合

default boolean replace(K key, V oldValue, V newValue) {
    Object curValue = get(key);
    // 旧值与key对应值不同时返回false
    if (!Objects.equals(curValue, oldValue) ||
            (curValue == null && !containsKey(key))) {
        return false;
    }
    put(key, newValue);
    return true;
}

新しい値で古い値を置き換えて、古い値が同じ時間偽のキーに対応する値を返しません。

default V replace(K key, V value) {
    V curValue;
    if (((curValue = get(key)) != null) || containsKey(key)) {
        curValue = put(key, value);
    }
    return curValue;
}

キーが存在する場合、元の値をカバーする値が存在しない空を返します

内部クラスエントリインタフェースの地図
interface Entry<K,V>
マップエントリ内部クラスメソッド
K getKey();
V getValue();
V setValue(V value);
boolean equals(Object o);
int hashCode();

これは、キーと値のペアの基本的な動作を定義します

抽象クラスクラスAbstractMap
public abstract class AbstractMap<K,V> implements Map<K,V>

すべての基本骨格地図コレクション考えます

AbstractMapのプロパティ
// 键集合
transient Set<K>        keySet;
// 值集合
transient Collection<V> values;
AbstractMapのコンストラクタ

保護クラスAbstractMap(){
}

AbstractMapのメソッドが実装されていません
public abstract Set<Entry<K,V>> entrySet();

クラスAbstractMapの実装Mapインタフェース以外のentrySet()を除く方法。

メソッドは実装されているクラスAbstractMap

これらの方法でのみ対等を集中する必要があるとhashCodeメソッドは、他の方法は、サブクラスに包含されていることができ、実装されました

public boolean equals(Object o) {
    // 地址一样时为true
    if (o == this)
        return true;
    // 不是Map或子类实例时为false
    if (!(o instanceof Map))
        return false;
    // 强转o为Map
    Map<?,?> m = (Map<?,?>) o;
    // m长度为空
    if (m.size() != size())
        return false;
    try {
        // 遍历当前集合所有元素
        Iterator<Entry<K,V>> i = entrySet().iterator();
        while (i.hasNext()) {
            Entry<K,V> e = i.next();
            K key = e.getKey();
            V value = e.getValue();
            // 有任意一个值不像等就返回false
            if (value == null) {
                if (!(m.get(key)==null && m.containsKey(key)))
                    return false;
            } else {
                if (!value.equals(m.get(key)))
                    return false;
            }
        }
    } catch (ClassCastException unused) {
        return false;
    } catch (NullPointerException unused) {
        return false;
    }
    // 循环完返回true
    return true;
}

解析は、リストとは異なる元素の決意、後に、配列内の要素のリストは、ここで比較モードおよび値を使用することを含む、異なる異なる対等につながる、長さが決定され、タイプを決定するために、方法に等しいです。最初の要素は、いずれかの空の、他の要素できないため限界です。

public int hashCode() {
    int h = 0;
    // 遍历所有元素
    Iterator<Entry<K,V>> i = entrySet().iterator();
    while (i.hasNext())
        // 元素hashCode累加
        h += i.next().hashCode();
    return h;
}

hashCodeメソッドは、すべての要素のハッシュコードを合計することです

おすすめ

転載: www.cnblogs.com/yuanjiangnan/p/12606960.html