Путаница с doublevalue() в хеш-таблицах

// Demonstrate a Hashtable
import java.util.*;
class HTDemo {
    public static void main(String args[]) {
        Hashtable balance = new Hashtable();
        Enumeration names;
        String str;
        double bal;
        balance.put("John Doe", new Double(3434.34));
        balance.put("Tom Smith", new Double(123.22));
        balance.put("Jane Baker", new Double(1378.00));
        balance.put("Todd Hall", new Double(99.22));
        balance.put("Ralph Smith", new Double(-19.08));

        // Show all balances in hash table.
        names = balance.keys();
        while(names.hasMoreElements()) {
            str = (String) names.nextElement();
            System.out.println(str + ": " +
            balance.get(str));
        }
        System.out.println();

        // Deposit 1,000 into John Doe's account
        ***bal = ((Double)balance.get("John Doe")).doubleValue();***
        balance.put("John Doe", new Double(bal+1000));
        System.out.println("John Doe's new balance: " +
        balance.get("John Doe"));
    }
}
  1. В соответствии bal = ((Double)balance.get("John Doe")).doubleValue(); Какая польза от doubleValue? (Я знаю, что он преобразует объект в двойное значение), но программа работает нормально, если я запускаю без этого.
  2. (поправьте меня, если я ошибаюсь) balance.get получить здесь двойной объект стоимости 3434.34 и (double) перед ним выполняет распаковку и преобразовывает его в двойной объект с двойным значением, тогда как и почему doubleValue() относится к этому двойному 3434.34 как объект?????

3 ответа

Я не уверен, правильно ли я получил ваши вопросы. Я постараюсь объяснить с точки зрения того, что я поняла ваши вопросы.

  1. Да, вы правы, вам не нужно doubleValue (). Это просто способ явного указания Java для распаковки. Если вы не используете doubleValue()Java распакует его автоматически. Таким образом, если Java не поддерживает автоматическое [un] объединение примитивных типов в соответствующие типы объектов, вам понадобится doubleValue() как (Double)balance.get("John Doe") вернет объект bal переменная примитивного типа.
  2. Для второй части вашего вопроса, на Java double является примитивным типом данных и Double это тип объекта. API коллекций Java и, следовательно, Hashtable хранить только предметы. Они не хранят примитивные типы. Следовательно, balance.get() возвращает объект. Вы бросаете его в другой объект типа Double, doubleValue() метод здесь необязателен из-за автоматической упаковки / распаковки, предоставляемой Java.

Надеюсь это поможет!

Коллекции работают только с типами OBJECT, а не с примитивными. Одна из причин, по которой классы-обертки были созданы, вы не можете хранить 3.4 но ты можешь хранить new Double(3.4)Да, как вы сказали, вы можете использовать значение без его doubleValue, но это стандартный способ работы. А для неявных вызовов и преобразований существует риск, что разные версии jvms/jre будут вести себя немного по-разному в таких случаях, чтобы избежать их, вы хотели бы сделать это стандартным способом, чтобы на него не влияли

  1. В строке bal = ((Double)balance.get("John Doe")). DoubleValue(); какая польза от doubleValue(знаю, что он преобразует объект в двойное значение), но программа работает нормально, если я запускаю без этого.

Правильный.

  1. (поправьте меня, если я ошибаюсь) balance.get() получает двойной объект со значением 3434.34 и (двойной) перед ним делает распаковку

Нет нет (double), Есть (Double), Это происходит из Object в Double,

и превращает его в двойной объект

Да.

в двойном значении

Нет, это объект, а не ценность. Эта фраза не имеет смысла.

тогда как и почему doubleValue() обрабатывает этот double 3434.34 как объект?

Это не так. Он вызывает Double.doubleValue(), который возвращает double,

Этот код вообще не использует автобокс. doublevalue() вызовы в этом коде устарели с тех пор, как 5 лет назад появилась Java 1.5. Он также не использует Generics. Я подозреваю, что вы смотрите на очень старый код.

Другие вопросы по тегам