2014-10-25 2 views
2

Я использовал HashMap для своей программы, и он отлично работает, но я не понимаю разницы между этими инициализациями HashMap.В чем разница между этими способами инициализации HashMap?

Предположим, что я реализую HashMap с символом как ключом и целым числом в качестве значения. В чем разница между ними?

HashMap<Character, Integer> alphabet1 = new HashMap(); 
HashMap<Character, Integer> alphabet1 = new HashMap<Character, Integer>(); 
HashMap alphabet1 = new HashMap<Character, Integer>(); 
Map alphabet1 = new HashMap<Character, Integer>(); 
HashMap alphabet1 = new HashMap<Character, Integer>(); 
HashMap alphabet1 = new HashMap(); 
Map alphabet1 = new HashMap(); 
+3

Пройдись от дженериков http://docs.oracle.com/javase/tutorial/java/generics/, вы автоматически поймете все это. –

+0

Все эти варианты, и он по-прежнему не включает тот, который я обычно использовал: 'Map alphabet1 = new HashMap ();'. [Я все еще использую Java 5] – splungebob

+0

И с Java 7 (см. Http://docs.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html) вы можете написать: «Карта <Символ, Целое>> alphabet1 = new HashMap <>();' – splungebob

ответ

5

Все, что с участием HashMap или Map без аргумента типа (угловые скобки < и > и часть между ними) является raw type and shouldn't be used. Необработанный тип не является общим и позволяет делать небезопасные вещи.

«правильный» способы являются

Map<Character, Integer> alphabet1 = new HashMap<Character, Integer>(); 
HashMap<Character, Integer> alphabet1 = new HashMap<Character, Integer>(); 

Первый использует интерфейс карты в качестве ссылочного типа. It is generally more idiomatic and a good style.

Также еще один способ вы не упомянули, using the Java 7 diamond operator

Map<Character, Integer> alphabet1 = new HashMap<>(); 
HashMap<Character, Integer> alphabet1 = new HashMap<>(); 

Что является более или менее эквивалентен первыми двумя правильными способами. Аргументы к ссылочному типу в левой части неявно снабжаются конструктором в правой части.

2

Вы пропустили правильный выбор:

Map<Character, Integer> alphabet1 = new HashMap<Character, Integer>(); 
  1. Дженерик декларация позволяет компилятору проверить использования «alphabet1» во время компиляции.
  2. Карта/HashMap с левой стороны объявляет, как следует учитывать переменную 'alphabet1': либо как Map (интерфейс), либо HashMap (экземпляр конкретного класса). Конечно, предпочтительный интерфейс - это делает ваш код более надежным для дальнейших изменений.
1
HashMap<Character, Integer> alphabet1 = new HashMap(); // (1) 

(1) инициализирует HashMap без использования дженерик, но использует небезопасное приведение к HashMap с воспроизведенными впоследствии. Это должно вызвать предупреждение компилятора.

HashMap<Character, Integer> alphabet1 = new HashMap<Character, Integer>(); // (2) 

(2) инициализация HashMap с воспроизведенными и объявляет переменную типа HashMap с воспроизведенными. Это может быть обсчитывается в

HashMap<Character, Integer> alphabet1 = new HashMap<>(); // (2b) 

Здесь компилятор использует тип вывода для вывода о genrics на HashMap от декларации с левой стороны.

HashMap alphabet1 = new HashMap<Character, Integer>(); // (3) 

(3) Initialzes в HashMap с дженериков, но переменная alphabet1 не использует повторно информацию дженериков. Таким образом, вы не можете получить доступ к методам этого значения HashMap в общем виде (например, вы получите значение, отличное от java.lang.Object при вызове alphabet1.get('a') и не переданное на Integer).

Map alphabet1 = new HashMap<Character, Integer>(); // (4) 

(4) аналогично (3), но здесь, то alphabet1 набирается Map вместо HashMap. Таким образом, вы не можете получить доступ к методам, определенным в HashMap, но не в его супер интерфейсе Map.

HashMap alphabet1 = new HashMap(); // (5) 

(5) аналогично (3), он не использует воспроизведенные для инициализации HashMap.

Map alphabet1 = new HashMap(); // (6) 

(6) аналогично (4) и не использует универсальные шаблоны для инициализации HashMap.

+1

1 и 2 ** не ** то же самое; 1 отсутствует пустая '<>'. – bcsb1001

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