Ответ 1
Из JavaOne 2007:
Вторая головоломка, названная "More Joys of Sets", позволяет пользователю создавать ключи HashMap, которые состоят или несколько объектов URL. Опять же, большая часть аудитории не смогла угадать правильный ответ.
Важная вещь, которую узнала аудитория здесь, заключается в том, что метод equals() объекта URL, по сути, нарушен. В этом случае два объекта URL равны, если они разрешают один и тот же IP-адрес и порт, а не только, если они имеют одинаковые строки. Тем не менее, Блох и Пью указывают на еще более серьезную ахиллесову пяту: поведение равенства отличается в зависимости от того, подключены ли вы к сети, где виртуальные адреса могут разрешаться на одном и том же хосте, или если вы не в сети, где разрешение - операция блокировки. Итак, что касается извлеченных уроков, они рекомендуют:
Не использовать URL; вместо этого используйте URI. URI не пытается сравнивать адреса или порты. Кроме того, не используйте URL как элемент Set или ключ карты.
Для разработчиков API метод equals() не должен зависеть от среды. Например, в этом случае равенство не должно изменяться, если компьютер подключен к Интернету по сравнению с автономным.
Из документации URI равна:
Для того чтобы два иерархических URI считались равными, их пути должны быть равны, и их запросы должны либо быть undefined, либо равными.
В вашем случае два пути различны. один - "/", другой - "".
В соответствии с URI RFC §6.2.3:
Реализации могут использовать правила конкретной схемы, при дальнейшей обработке чтобы уменьшить вероятность ложных негативов. Например, потому что схема "http" использует компонент полномочий, имеет порт по умолчанию "80" и определяет пустой путь, эквивалентный "/" следующие четыре URI эквивалентны:
http://example.com http://example.com/ http://example.com:/ http://example.com:80/
Кажется, что эта реализация не использует правила, специфичные для схемы.
Ресурсы: