Map是一种键值对的集合,因为键值在使用时很有可能呼互换,比方说键K1对应的值时V1,然而V1又能作为键,而之前的K1将会作为K1对应的值,就产生了环路了,在很多情况下。产生环路可能会使程序无休止的执行下去造成严重后果,因此需要检测环路产生,当新插入的键值对会使原先的Map产生环路,就拒绝这次插入
环路检测有很多种做法,我最喜欢的一种是:
当存在环路时必然是有(K1,V1)存在且(V1,K1)存在,
因此:
protected void checkForAliasCircle(String name, String alias) {
if (this.hasAlias(alias, name)) {
throw new IllegalStateException("Cannot register alias '" + alias + "' for name '" + name + "': Circular reference - '" + name + "' is a direct or indirect alias for '" + alias + "' already");
}
}
因此接下来就是分析方法如何找到(K1,V1)存在
public boolean hasAlias(String name, String alias) { Iterator var3 = this.aliasMap.entrySet().iterator(); Entry entry; String registeredName; do { if (!var3.hasNext()) { return false; } entry = (Entry)var3.next(); registeredName = (String)entry.getValue(); } while(!registeredName.equals(name)); String registeredAlias = (String)entry.getKey(); return registeredAlias.equals(alias) || this.hasAlias(registeredAlias, alias); }
使用递归解决,代码逻辑清晰,且可高度复用
代码出自spring,