实现了Map
AbstractMap<K,V> implements Map<K,V>
1.containsValue,containsKey,get 几个方法实现基本相似
public boolean containsValue(Object value) {
Iterator<Entry<K,V>> i = entrySet().iterator();//获取Iterator
if (value==null) {
while (i.hasNext()) {//遍历取值
Entry<K,V> e = i.next();
if (e.getValue()==null)
return true;
}
} else {
while (i.hasNext()) {
Entry<K,V> e = i.next();
if (value.equals(e.getValue()))
return true;
}
}
return false;
}
2.remove
public V remove(Object key) {
Iterator<Entry<K,V>> i = entrySet().iterator();
Entry<K,V> correctEntry = null;
if (key==null) {
while (correctEntry==null && i.hasNext()) {
Entry<K,V> e = i.next();
if (e.getKey()==null)
correctEntry = e;
}
} else {
while (correctEntry==null && i.hasNext()) {
Entry<K,V> e = i.next();
if (key.equals(e.getKey()))
correctEntry = e;//判断键值是否存在
}
}
V oldValue = null;
if (correctEntry !=null) {
oldValue = correctEntry.getValue();//存在就删除,并返回值
i.remove();
}
return oldValue;
}
3.keySet(), values()
public Set<K> keySet() {
Set<K> ks = keySet;//获取keySet
if (ks == null) {
ks = new AbstractSet<K>() {//AbstractSet<E> extends AbstractCollection<E> implements Set<E>,AbstractCollection内部声明了Iterator 对象
public Iterator<K> iterator() {
return new Iterator<K>() {//新建Iterator
private Iterator<Entry<K,V>> i = entrySet().iterator();//内部其实是entrySet().iterator();
public boolean hasNext() {//判断是否有下一个
return i.hasNext();
}
public K next() {//获取下一个值
return i.next().getKey();
}
public void remove() {//删除
i.remove();
}
};
}
public int size() {
return AbstractMap.this.size();
}
public boolean isEmpty() {
return AbstractMap.this.isEmpty();
}
public void clear() {
AbstractMap.this.clear();
}
public boolean contains(Object k) {
return AbstractMap.this.containsKey(k);
}
};
keySet = ks;
}
return ks;
}
4.equals(Object o)
public boolean equals(Object o) {
if (o == this)//地址相等返回true
return true;
if (!(o instanceof Map))//泛型不一致返回false
return false;
Map<?,?> m = (Map<?,?>) o;
if (m.size() != size())
return false;//大小不一致返回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();
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;
}
return true;//全部相等返回true
}
5.hashCode()
public int hashCode() {
int h = 0;
Iterator<Entry<K,V>> i = entrySet().iterator();
while (i.hasNext())
h += i.next().hashCode();
return h;
}
网友评论