2013-07-24 9 views
1

Я читаю код 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(", "); 
    } 
} 

Таким образом, если код не проверяет «равен ключ это» или нет, может быть, метод ToString() может быть бесконечный цикл ?

ответ

3

Конечно можно:

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

выходы:

table = {(this Map)=(this 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)} 
+0

Таким образом, если код не проверяет «равен ключ это» или нет, может быть, Метод toString() может быть бесконечным циклом? – huashui

0
// Is "key == this" possible ? What the "this" stands for ? 

'this keyword' относится к текущему экземпляру объекта. «key == this» проверяет, относится ли ключ к текущему insatnce объекта.

1

Это так, что если вы поставите HashTable в себя вы не получаете бесконечный цикл. Рассмотрим:

final Map map = new Hashtable(); 
map.put(map, "test"); 
0

Да, это так. Это

HashTable<Object, Object> maptest = new HashTable<Object, Object>(); 
mapTest.put(mapTest, 1); 

бы key == this возвращение true

0

Существует возможность того, что сохранение map в качестве ключа в одном map.

HashMap<Object, Object> selfmap = new HashMap<Object, Object>(); 
selfmap.put(selfmap, selfmap); 
+0

Это приведет к бесконечной рекурсии при попытке вызвать hashCode или toString. – Thilo

0

если key и this объект (HashTable как вы говорите) ссылка равна, то условие key == this является true

Смежные вопросы