HashSet <String>.contains () - PullRequest
       7

HashSet <String>.contains ()

0 голосов
/ 23 февраля 2012

У меня проблемы с использованием .contains для проверки, хранится ли строка в HashSet.

import java.util.HashSet;

public class Controller
{
    private Queue<String> queue;
    private HashSet<String> blocked;

    public Controller()
    {
        queue = new Queue<String>();
        blocked = new HashSet<String>();
    }

    public void add(String item)
    {        
        if (!(blocked.contains(item))) queue.add(item);
    }
}

Я осмотрелся и понял, что мне нужно переопределить метод .equals. Означает ли это, что мне нужно создать новый класс, расширяющий HashSet, а затем объявить экземпляр этого нового класса вместо «HashSet заблокирован»??

Мне известна причина, по которой простое использование == для сравнения двух строк не работает, но я запутался, потому что приведенный ниже код действительно работает в некоторых случаях, но не во всех.

Любой совет будет высоко ценится!

Привет

1 Ответ

2 голосов
/ 23 февраля 2012

Вам не нужно переопределять метод equals - у String уже есть очень хорошая пара hashCode/equals, которые эффективны с точки зрения циклов ЦП и с точки зрения распределения разных строк в разные хэш-блоки.

Для элементов, помещенных в хэш-набор, требуется пара hashCode/equals методов, чтобы обеспечить правильную работу контейнера: hashCode определяет хеш-контейнер, в который помещается объект, иequals разрешает конфликты между неравными объектами с идентичными хэш-кодами.

В Википедии есть иллюстрированная статья на хеш-таблицах.Прочитайте его, чтобы лучше понять понятия hashCode/equals, они имеют основополагающее значение для использования несортированных ассоциативных контейнеров на любом языке, включая Java.

...