изменяемые поля для объектов в наборе Java

К сожалению, значение таких вещей, как (и \ (меняются между регулярными выражениями стиля Emacs и большинством других стилей). Поэтому, если вы попытаетесь избежать этого, вы можете делать противоположное тому, что вы хотите.

Итак, вам действительно нужно знать, какой стиль вы пытаетесь процитировать.

11
задан Community 23 May 2017 в 10:29
поделиться

4 ответа

Что не так с указанным выше RegEx?
Стандарт RFC822 для адресов электронной почты очень расплывчатый, поэтому трудно найти краткое регулярное выражение, охватывающее все возможные допустимые электронные письма. Дело усложняется тем фактом, что не каждый почтовый сервер / клиент применяет этот стандарт, поэтому фактические данные могут быть

. Хотя вы, конечно, можете догадаться или обеспечить соблюдение определенного формата, написание специального выражения в значительной степени является гарантией что у вас будет либо много нежелательных адресов электронной почты, либо недействительные.

Какой регулярный формат хорош для проверки электронных писем?
Это эталонное регулярное выражение для проверки на соответствие RFC, здесь оно реализовано как модуль Perl, но есть также окончательный список в O'Reillys " изменяемые объекты используются как набор элементы. Поведение набора не указывается, если значение объекта изменен таким образом, чтобы равно сравнениям, пока объект элемент в наборе. Особый случай этого запрета в том, что это не допустимо для набора содержать сам как элемент.

Это просто означает, что вы можете использовать изменяемые объекты в наборе и даже изменять их. Вы просто должны убедиться, что изменение не повлияет на способ поиска элементов набором Set . Для HashSet это потребовало бы не изменять поля, используемые для вычисления hashCode () .

8
ответ дан 3 December 2019 в 09:20
поделиться

Это верно, это может вызвать некоторые проблемы при поиске записи на карте. Официально поведение не определено, поэтому, если вы добавляете его в хэш-набор или как ключ в хэш-карте, вы не должны его изменять.

3
ответ дан 3 December 2019 в 09:20
поделиться

В HashSet / HashMap вы можете изменить содержащийся объект, чтобы изменить результаты операции compareTo () - относительное сравнение не используется для поиска объектов. Но внутри TreeSet / TreeMap это было бы фатально.

Вы также можете изменять объекты, находящиеся внутри IdentityHashMap - для определения местоположения содержимого не используется ничего, кроме идентификатора объекта.

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

0
ответ дан 3 December 2019 в 09:20
поделиться

Да, это приведет к плохим вещам.

// Given that the Toy class has a mutable field called 'name' which is used
// in equals() and hashCode():
Set<Toy> toys = new HashSet<Toy>();
Toy toy = new Toy("Fire engine", ToyType.WHEELED_VEHICLE, Color.RED);
toys.add(toy);
System.out.println(toys.contains(toy)); // true
toy.setName("Fast truck");
System.out.println(toys.contains(toy)); // false
1
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: