java - "key==this"的情况可能吗?

标签 java hashtable

我正在阅读哈希表的代码。我对 toString() 方法感到困惑,代码是这样的:

public synchronized String toString() 
{
    int max = size() - 1;
    if (max == -1)
       return "{}";

    StringBuilder sb = new StringBuilder();
    Iterator<Map.Entry<K,V>> it = entrySet().iterator();
    sb.append('{');

    for (int i = 0; ; i++)
    {
        Map.Entry<K,V> e = it.next();
        K key = e.getKey();
        V value = e.getValue();

        // Is "key == this" possible ? What the "this" stands for ?
        sb.append(key   == this ? "(this Map)" : key.toString());
        sb.append('=');
        sb.append(value == this ? "(this Map)" : value.toString());

        if (i == max)
            return sb.append('}').toString();

        sb.append(", ");
    }
}

所以,如果代码不检查"key equals this"与否,也许toString() 方法会死循环?

最佳答案

当然可以:

Hashtable table = new Hashtable();
table.put(table, table);
System.out.println("table = " + table);

输出:

table = {(this Map)=(this Map)}

但是请注意,这种映射的行为可能会令人惊讶(因为它的哈希码和等号会发生变化)。例如,在下面的示例中,一旦您添加了另一个条目,您就无法从 map 本身中删除它:

Hashtable table = new Hashtable();
table.put(table, table);
System.out.println("table = " + table);
table.put("abc", "def");
System.out.println("table = " + table);
table.remove(table); //does not work as expected !!!
System.out.println("table = " + table);

输出:

table = {(this Map)=(this Map)}
table = {abc=def, (this Map)=(this Map)}
table = {abc=def, (this Map)=(this Map)}

关于java - "key==this"的情况可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17835592/

相关文章:

java - 使用java从时间戳(长整数)转换为日期格式

java - 使用 BLOB 或 TEXT/CLOB 在字段中保存 HTML 数据

java - HTMLUnit:大量过时的内容并且无法在 getPage() 上创建对象警告然后失败并在 getByXPath() 上调用 setOuterHTML 异常

sql - 当不允许组合键时创建散列主键

java - 删除哈希表元素不释放内存

java - 按值快速查找键而不创建反向 HashMap ?

java - 使用 Google Web Toolkit 播放声音通知

java - 为什么我的 Java 堆转储只显示一半的堆?

ios - 如何在 Swift 中为 Int 数组(自定义字符串结构)实现 Hashable 协议(protocol)

c - C语言中如何正确使用指针