2013-06-21 7 views
2

Я изучаю информацию о картах, знаю, у меня есть проблема с пониманием entrySet() Set<Map.Entry<K,V>> в интерфейсе карты. Является ли это предполагаемым вложенным явным ссылкой? Для справки, это отрывок из определения интерфейса java.util.Map<K,V>:Понять интерфейс Карта <K,V>

public interface Map<K,V> { 
    Set<Map.Entry<K,V>> entrySet(); 
    ... 
} 
+0

Добро пожаловать в Stackoverflow. Надеюсь, вам понравилось изучать Java, но, пожалуйста, обратитесь к FAQ http://stackoverflow.com/help/on-topic, прежде чем спрашивать –

+0

, спасибо, я буду следить за правилом. –

ответ

5

ли это должно быть вложенным самостоятельно ссылаться?

Нет, это говорит только о том, что все, а Map возвращается как результат этого метода должен быть экземпляром объекта, который подчиняется интерфейс Set, который отражает содержание записей этого Map «s. То же самое с .keySet().

Это имеет смысл, что оба Set s, так как записи в Map являются уникальными (as a result of the defined contract for Map.Entry's .equals()/.hashCode()), и поэтому ключи (но для ключей, вы ответственны за обеспечение того, чтобы .equals()/.hashCode() соблюдается).

ОДНАКО, вы должны быть осторожны. Для обоих этих методов javadoc говорит:

Набор поддерживается картой, поэтому изменения на карте отражаются в наборе и наоборот.

И это может вызвать проблемы, если вы не будете осторожны.

Посмотрите на этот пример:

public static void main(final String... args) 
{ 
    final Map<String, String> map = new HashMap<>(); 
    map.put("hello", "world"); 
    map.put("foo", "bar"); 

    // Create a map entry 
    final Map.Entry<String, String> entry 
     = new AbstractMap.SimpleEntry<>("foo", "bar"); 

    // Remove it from the set 
    map.entrySet().remove(entry); 
    System.out.println("after removing entry: " + map); 

    // Remove a key 
    map.keySet().remove("hello"); 
    System.out.println("after removing key: " + map); 
} 

Результат:

after removing entry: {hello=world} 
after removing key: {} 
+0

Спасибо. Итак, Map.Entry представляет комбинацию ключа и значения. Кроме того, я перешел к реализации карты под названием «WeakHashMap», она использует «слабую ссылку» (так что я думаю, что она не сильная, а какая-то кастинг)? У вас есть какие-либо знания по этому поводу? –

+0

Ухно, я знаю только, что есть сильные, мягкие, слабые и фантомные ссылки, и хотя я немного читал литературу по этим вопросам, я до сих пор не могу понять, каково их реальное использование: / – fge

1
Set<Map.Entry<K,V>> 

Тип Вышесказанное означает: набор записей карты. Map.Entry - это интерфейс, вложенный внутри интерфейса Map. Нет самореференции, но тип набора, возвращаемого с entrySet, повторно использует привязки типа <K,V> содержащейся карты.

A запись на карте - это пара (ключ, значение), а вся карта является концептуально просто набором записей карты. Этот вид карты идеально подходит для использования , итерируя по всему содержимому карты, но не подходит для поиска по ключу, что является основным вариантом использования карты.