Почему Double.compare Java (дважды, дважды) реализовал способ, которым это?

Я добавлю примечание, которое в 99% веб-приложений, даже ajax тяжелые приложения, скорость соединения и ответ веб-сервера собирается определить эффективность Вашего приложения, а не JavaScript. Я не говорю, что Вы должны записать намеренно медленный код или что обычно быть знающим, какие вещи, вероятно, будут быстрее, чем другие, не хорошо.

, Но я задаюсь вопросом, пытаетесь ли Вы решить проблему, которая еще действительно не существует, или даже если Вы оптимизируете для чего-то, что могло бы изменение в ближайшем будущем (скажите, если больше людей начинает использовать браузер, который поддерживает getElementsByClassName(), функция упомянула ранее), делая Ваш оптимизированный код на самом деле выполненным медленнее.

35
задан DavidS 15 September 2011 в 18:41
поделиться

4 ответа

Ответ @ Shoover правильный (прочтите его!), Но здесь есть кое-что еще.

В качестве javadoc для Double: : equals утверждает:

«Это определение позволяет хеш-таблицам работать должным образом».

Предположим, что разработчики Java решили реализовать equals (...) и compare (...) с той же семантикой, что и == в обернутых экземплярах double . Это означало бы, что equals () всегда будет возвращать false для обернутого NaN. Теперь подумайте, что произойдет, если вы попытаетесь использовать обернутый NaN в карте или коллекции.

List<Double> l = new ArrayList<Double>();
l.add(Double.NaN);
if (l.contains(Double.NaN)) {
    // this wont be executed.
}

Map<Object,String> m = new HashMap<Object,String>();
m.put(Double.NaN, "Hi mum");
if (m.get(Double.NaN) != null) {
    // this wont be executed.
}

В этом нет большого смысла!

Другие аномалии могут существовать, потому что -0,0 и +0.

41
ответ дан 27 November 2019 в 06:44
поделиться

Заслуга в том, что это самый простой код, который выполняет

Одной из общих черт начинающих программистов является переоценка чтения исходного кода и недооценка чтения спецификаций . В этом случае спецификация:

http://java.sun.com/javase/6/docs/api/java/lang/Double.html#compareTo%28java.lang.Double%29

.. ... делает поведение и причину поведения (согласованность с equals ()) совершенно ясными.

2
ответ дан 27 November 2019 в 06:44
поделиться

Объяснение находится в комментариях в коде. В Java есть значения типа double для 0,0 и -0,0 , а также для «не числа» ( NaN ). Для этих значений нельзя использовать простой оператор == . Взгляните на источник doubleToLongBits () и на документацию Javadoc для метода Double.equals () :

Обратите внимание, что в большинстве случаев для два экземпляры класса Double , d1 и d2 , значение d1.equals (d2) равно истина , если и только если

 d1.doubleValue () == d2.doubleValue ()

также имеет значение истина . Однако, есть два исключения:

  • Если d1 и d2 оба представляют Double.NaN , то метод equals возвращает true , даже хотя Double.NaN == Double.NaN имеет значение false .
  • Если d1 представляет +0,0 , а d2 представляет -0,0 , или наоборот, проверка равенства имеет значение ложь , хотя +0,0 == -0,0 имеет значение true .

Это определение позволяет хеш-таблицам работать должным образом.

43
ответ дан 27 November 2019 в 06:44
поделиться

Эта реализация позволяет определять действительное число как

0
ответ дан 27 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

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