簡単な紹介
通常、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メソッドは、すべての要素のハッシュコードを合計することです