вопросы по использованию hashset для определения нового набора - PullRequest
0 голосов
/ 10 июня 2011

В отношении следующих двух разных определений наборов, в чем различия:

Set<Integer> intset = new Hashset<Integer>();

Set<Integer> intset = new Set<Integer>();

Спасибо.

Ответы [ 8 ]

4 голосов
/ 10 июня 2011

Поскольку Set является интерфейсом, второй не будет компилироваться.

3 голосов
/ 10 июня 2011

Второй даже не скомпилируется. Часто люди спрашивают, в чем разница между этими :

HashSet<Integer> intset = new Hashset<Integer>();

Set<Integer> intset = new HashSet<Integer>();

и, возможно, это то, что вы хотели спросить. Разница здесь в том, что код, написанный с использованием первого определения, зависит от конкретного выбора реализации Set (HashSet против TreeSet или чего-то еще), тогда как второе объявление позволит вам тривиально перейти на другую реализацию без изменения какого-либо другого кода. В целом, это хорошая практика - она ​​сохраняет гибкость.

3 голосов
/ 10 июня 2011

Вы не можете объявить новый Установите его интерфейс. Все они (Set, Map, List) являются интерфейсами пакета java.collections. Они не могут быть созданы напрямую, но требуют, чтобы реализации (HashSet, ArrayList, Hashmap) были указаны справа от операции присваивания.

1 голос
/ 10 июня 2011

java.util.Set - это интерфейс, а java.util.HashSet - фактическая реализация.

0 голосов
/ 10 июня 2011

Ошибка компилятора в строке:

Set<Integer> intset = new Set<Integer>();
0 голосов
/ 10 июня 2011

Set - это интерфейс, предоставляющий некоторые абстрактные методы для конкретных реализаций Set. Вы не можете инициализировать Set объект, так же, как вы не можете List. Интерфейс похож на класс, однако все, что он содержит, является абстрактным, и класс может реализовывать несколько интерфейсов, но расширять только один класс. Кроме того, класс может содержать как абстрактные, так и конкретные методы, а интерфейс - нет. Интерфейсы являются своего рода способом борьбы с множественным наследованием.

В любом случае: http://download.oracle.com/javase/6/docs/api/java/util/Set.html http://download.oracle.com/javase/tutorial/java/concepts/interface.html

0 голосов
/ 10 июня 2011

В Java Set является интерфейсом и, следовательно, не может быть инициирован, поэтому второй неверен.

Но фактическое различие в терминологии заключается в том, что Набор - это математическое понятие, передающее некоторым правилам (например, уникальность, неважность порядка). HashSet - это метод реализации концепции Set, использующий Hashtable , что делает его в вычислительном отношении очень быстрым - амортизируется вставка, удаление и доступ с постоянным временем.

0 голосов
/ 10 июня 2011

Вы не можете создать экземпляр Set таким, каким вы являетесь во втором определении.

Set - это Интерфейс, и его нельзя создать, он просто определяет контракт, по которому могут следовать конкретные реализации.

Однако вы можете создать экземпляр анонимного внутреннего класса, который будет следовать интерфейсу Set:

Set<Integer> intSet = new Set<Integer>() {
    //need to define all set methods here...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...