Почему SimpleDateFormat Constructor возвращает тот же объект для разных потоков? [Дубликат]

Поддержка Unicode в sed не определена. Вам может быть лучше использовать командную строку perl:

echo "abcABC123" | perl -CS -pe 's/[\x{FF21}-\x{FF3B}]+//g'

abc123

Важно использовать флаги -CS здесь, чтобы иметь возможность получать правильные кодировки UTF8 для ввода / вывода / ошибки.

8
задан rixmath 24 May 2013 в 10:51
поделиться

3 ответа

SimpleDateFormat и DateFormat (SimpleDateFormat суперкласс), а также Format (DateFormat суперкласс) реализовано toString(), поэтому toString() из класса Object действительно выполняется, код которого is:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

Теперь генерируется hashCode SimpleDateFormat:

public int hashCode()
{
    return pattern.hashCode();
    // just enough fields for a reasonable distribution
}

Это означает, что если вы создадите многочисленные экземпляры SimpleDateFormat с тем же pattern, например в вашем случае они будут иметь одинаковый hashCode, и, следовательно, toString() вернет то же самое для этих экземпляров.

Кроме того, поскольку он был замечен rixmath, экземпляры SimpleDateFormat с тем же pattern также будет равным.

14
ответ дан Adam Siemion 27 August 2018 в 23:04
поделиться

Это разные экземпляры, попробуйте

    DateFormat d1 = new SimpleDateFormat("ddMMyyyy");
    DateFormat d2 = new SimpleDateFormat("ddMMyyyy");
    System.out.println(d1 == d2);

, он печатает

false

как для того же java.text.SimpleDateFormat@c5bfbc60, они основаны на имени класса и хэш-коде. В соответствии с Object.hashCode API он не обязательно возвращает отдельные значения для отдельных объектов

5
ответ дан Evgeniy Dorofeev 27 August 2018 в 23:04
поделиться

SimpleDateFormat фактически реализует hashCode, возвращая хэш-код шаблона.

Вы можете убедиться, что на самом деле существуют различные объекты с помощью System.identityHashCode() :

System.out.println("d1 = " + d1 + " / " + System.identityHashCode(d1));
System.out.println("d2 = " + d2 + " / " + System.identityHashCode(d2));
System.out.println("d3 = " + d3 + " / " + System.identityHashCode(d3));

Это напечатает 3 разных значения.

6
ответ дан Joachim Sauer 27 August 2018 в 23:04
поделиться
Другие вопросы по тегам:

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