Класс HashSet наследуется от AbstractSet и реализует обобщенный интерфейс Set. Класс также является обобщенным. Коллекция хранит уникальные объекты. Для того, чтобы коллекция могла производить сравнение объектов при добавлении в коллекцию, а также осуществлять проверку на вхождение объекта в коллекцию, класс объекта-элемента коллекции должен реализовывать методы equals() и hashCode(). Метод equals() должен возвращать результат логического сравнения объектов, метод hashCode() логически равных объектов должен возвращать одинаковое значение. В общем случае, метод hashCode() должен вычисляться по всем полям, по которым идет сравнение в equals().
Класс HashSet не хранит объекты в том порядке, в котором элементы добавляются в коллекцию. Операции добавления и удаления из HashSet осуществляются за константное время не зависимо от количества элементов в коллекции (это методы add(), contains(), remove(), size()), так как элементы не упорядочиваются в коллекции. Пример работы с коллекцией:
//класс с координатами - элемент коллекции class Coordinate{ private int X; private int Y;
public Coordinate(int X, int Y) { this.X = X; this.Y = Y; }
@Override public String toString() { return "X: " + X + ", Y: " + Y; }
@Override public boolean equals(Object obj) { if(obj instanceof Coordinate){ Coordinate c = (Coordinate)obj; return c.X == this.X && c.Y == this.Y; }else { return super.equals(obj); } }
@Override public int hashCode() { int hash = 7; hash = 59 * hash + this.X; hash = 59 * hash + this.Y; return hash; } }
void CollectionToTextArea(HashSet<Coordinate> c, JTextArea ta){ for(Coordinate item: c){ta.append(item.toString() + "\n"); } ta.append("--------------------------------------------------" + "\n"); } void CoordinateToTextArea(Coordinate c, JTextArea ta, String comment){ if(c != null){ ta.append(comment + c.toString() + "\n"); } } //выводим все содержимое очереди в текстовую область (при этом очередь очищается) void RemoveAllQueueElements(Queue <Coordinate> q){ Coordinate c = null; c = q.poll(); while(c != null) { jTextArea1.append("Удалили из очереди: " + c.toString() + "\n"); c = q.poll(); } } void IteratorToTextArea(Iterator <Coordinate> iter, JTextArea ta){ if (iter != null & ta != null){ while(iter.hasNext()){ ta.append(iter.next().toString() + "\n"); } } }; private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //создаем коллекцию хеш-таблицу HashSet <Coordinate> hs = new HashSet <Coordinate>(); //будем осуществлять доступ к коллекции через интерфейс Set Set <Coordinate> sitf = hs; //добавляем элемнты в коллекцию for(int i = 0; i < 10; i ++){ sitf.add(new Coordinate(i, i)); } //выводим коллекцию в текстовую область - выводятся элемнты //не в том порядке котором добавлялись в коллекцию CollectionToTextArea(hs, jTextArea1); //выводим через итератор в текстовую область //получаем тот же результат, что и выше IteratorToTextArea(sitf.iterator(), jTextArea1); //осуществляем поиск созданной координаты в хеш-таблице Coordinate c = new Coordinate(5, 5); if (sitf.contains(c)) CoordinateToTextArea(c, jTextArea1, "Найден элемнт в коллекции типа HashSet:"); }
|