Map中环路检测

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,

猜你喜欢

转载自blog.csdn.net/WK_SDU/article/details/81271783
今日推荐