Как определить, указывает ли объект URL на тот же путь, что и другой объект URL в коллекции - PullRequest
0 голосов
/ 16 марта 2011

Мне нужно написать что-то вроде этого:

private Set processedLinks = new HashSet();

public boolean isProcessed(String url) throws MalformedURLException {

        return processedLinks.contains(new URL(url));
    }

Это не работает, потому что созданный URL - это другой объект, чем URL в коллекции.Мне нужно сравнить соответствие хоста и файла созданного URL-адреса с URL-адресами в HashSet.Какой самый лучший способ?

Я хотел расширить URL своим классом и переопределить equals (), но URL является окончательным.Итак, вторая идея, которую я имею, состоит в том, чтобы сделать что-то вроде URLHashSet, расширяет HashSet и переопределяет содержащий метод.Но я не уверен, что это не окажет негативного влияния на производительность, потому что этот HashSet будет содержать десятки тысяч элементов.

У вас есть идея, как решить эту проблему?Спасибо.

Ответы [ 4 ]

1 голос
/ 16 марта 2011

Я бы рекомендовал использовать URI вместо URL.

URL.equals следует избегать.Из документов вы увидите, что для него требуется разрешение имен (что является блокирующей операцией) и что «известно, что оно несовместимо с виртуальным хостингом в HTTP».URI имеют больше смысла, потому что вы на самом деле не сравниваете физические местоположения, а просто идентификаторы.

0 голосов
/ 16 марта 2011

вы можете использовать композицию вместо наследования, например:

class MyUrl {

  private Url url;

  public boolean equals (MyUrl otherUrl) {
  }

}

и сделай Set of MyUrl.

0 голосов
/ 16 марта 2011

Я не хочу, чтобы это звучало грубо, но я думаю, что ваше понимание equals / hashCode неверно.

URL должен хэшироваться и сравниваться одинаково, даже если ссылки на объекты являются двумя отдельными объектами..

Я бы просто попробовал создать два отдельных объекта URL с одинаковым строковым значением URL.

Следующие тесты должны дать вам ответ:

u1 == u2 => false
u1.equals(u2) => true
u2.equals(u1) => true
u1.hashCode() == u2.hashCode() => true

Если мое понимание вашей проблемы неверно.

0 голосов
/ 16 марта 2011

Попробуйте использовать строковое представление объекта URL.

...