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,
本文介绍了一种检测Map中键值对环路的方法,并通过递归实现。该方法防止因键值对互换产生的无限循环,确保程序稳定运行。
1142

被折叠的 条评论
为什么被折叠?



