Как определить, указывает ли объект URL на тот же путь, что и другой объект URL в коллекции
Мне нужно написать что-то вроде этого:
приватный Set processingLinks = new HashSet(); public boolean isProcessed(String url) выдает MalformedURLException { возвращать обработанный ссылки.содержит (новый URL(URL)); }
Это не работает, потому что созданный URL является другим объектом, чем URL в коллекции. Мне нужно сравнить соответствие хоста и файла созданного URL с URL в HashSet. Какой самый лучший способ?
Я хотел расширить URL своим классом и переопределить equals(), но URL является окончательным. Итак, вторая идея, которую я имею, состоит в том, чтобы сделать что-то вроде URLHashSet, расширяет HashSet и переопределяет метод. Но я не уверен, что это не окажет негативного влияния на производительность, потому что этот HashSet будет содержать десятки тысяч элементов.
У вас есть идея, как решить эту проблему? Благодарю.
4 ответа
Я не хочу, чтобы это звучало грубо, но я думаю, что ваше понимание equals/hashCode неверно.
URL должен хэшироваться и сравниваться одинаково, даже если ссылки на объекты являются двумя отдельными объектами.
Я бы попробовал простой тест создания двух отдельных объектов URL с одинаковым значением строки URL.
Следующие тесты должны дать вам ответ:
u1 == u2 => false
u1.equals(u2) => true
u2.equals(u1) => true
u1.hashCode() == u2.hashCode() => true
Если только мое понимание вашей проблемы неверно.
Я бы рекомендовал использовать URI вместо URL.
URL.equals
необходимо избегать. Из документов вы увидите, что оно требует разрешения имен (что является блокирующей операцией) и "известно, что оно несовместимо с виртуальным хостингом в HTTP". URI имеют больше смысла, потому что вы на самом деле не сравниваете физические местоположения, а просто идентификаторы.
Вы можете использовать композицию вместо наследования, например:
class MyUrl {
private Url url;
public boolean equals (MyUrl otherUrl) {
}
}
и сделай Set of MyUrl .