@Override
	public boolean equals(Object obj) {
		if(obj == this) return true;
		if(! (obj instanceof Map)) return false;
		final Map<K,V> asM = (Map<K,V>) obj;
		if(asM.size() != size()) return false;

		final Iterator<Map.Entry<K, V>> it = asM.entrySet().iterator();
		try {
			while(it.hasNext()){
				final Map.Entry<K, V> e = it.next();
				final K k = e.getKey();
				final V thatV = e.getValue();
				final V thisV = get(k);
				if(thisV == null){
					if(thatV != null) return false;
				} else {
					if(!thisV.equals(thatV)) return false;
				}
			}
		} catch(ClassCastException e) { return false; }
		return true;
	}