Java源码阅读之AbstractMap
类定义
public class AbstractMap<K,V> implements Map<K,V>{}
方法
public int size(){
return entrySet().size();
}
public boolean isEmpty(){
return size() == 0;
}
public boolean containsKey(Object key){
Iterator<Entry<K,V>> it = entrySet().iterator();
if(value == null){
while(it.hasNext()){
Entry<K,V> e = i.next();
if(e.getKey() == null)
return true;
}
}else{
while(it.hasNext()){
Entry<K,V> e = i.next();
if(key.equals(e.getKey()))
return true;
}
}
return false;
}
public boolean containsValue(Object value){
Iterator<Entry<K, V>> it = keySet().iterator();
if(value == null){
while(it.hasNext()){
Entry<K,V> e = it.next();
if(e.getValue() == null)
return true;
}
}else{
while(it.hasNext()){
Entry<K,V> e = i.next();
if(value.equals(e.getValue()))
return true;
}
}
return false;
}
public V get(Object k){
Iterator<Entry<K,V>> it = entrySet().iterator();
if(k == null){
while(it.hasNext()){
Entry<K,V> e = i.next();
if(e.getKey() == null)
return e.getValue();
}
}else{
while(it.hasNext()){
Entry<K,V> e = i.next();
if(k.equals(e.getKey()))
return e.getValue();
}
}
return null;
}
public V put(K key, V value){
throw new UnSupportOperationException();
}
public V remove(K key){
Iterator<Entry<K,V>> it = entrySet().iterator();
Entry<K,V> currentEntry = null;
if(key == null){
while(currentEntry == null && it.hasNext()){
Entry<K, V> e = it.next();
if(e.getKey() == null)
currentEntry = e;
}
}else{
while(currentEntry == null && it.hasNext()){
Entry<K,V> e = it.next();
if(key.equals(e.getKey()))
currentEntry = e;
}
}
V oldValue = null;
if(currentEntry != null){
oldValue = currentEntry.getValue();
it.remove();
}
return oldValue;
}
public void putAll(Map<? extends K, ? extends V> m){
for(Map.Entry<? extends K, ? extends V> e : m.entrySet()){
put(e.getKey(), e.getValue());
}
}
public void clear(){
entrySet().clear();
}
transient Set<K> keySet;
public Set<K> keySet(){
Set<K> ks = keySet;
if(ks == null){
ks = new AbstractSet<K>(){
public Iterator<K> iterator(){
return new Iterator<K>(){
private Iterator<Entry<K,V>> i = 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 o){
return AbstractMap.this.containsKey(o);
}
};
keySet = ks;
}
return ks;
}
transient Collection<V> values;
public Collection<V> values(){
Collection<V> vals = values;
if(vals == null){
vals = new AbstractCollection<V>(){
public Iterator<V> iterator(){
return new Iterator<V>(){
private final Iterator<Entry<K,V>> i = keySet().iterator();
public boolean hasNext(){
return i.hasNext();
}
public V next(){
return i.next().getValue();
}
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 o){
return AbstractMap.this.containsValue(o);
}
};
values = vals;
}
return vals;
}
public abstract Set<Entry<K,V>> entrySet();
public boolean equals(Object o){
if(o == this){
return true;
}
if(!(o instanceof Map)){
return false;
}
Map<?, ?> m = (Map<?,?>)o;
if(m.size() != this.size()){
return false;
}
try{
Iterator<Entry<K,V>> it = entrySet().iterator();
while(it.hasNext()){
Entry<K,V> e = it.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(Exception e){
return false;
}
return true;
}