Есть ли у объектов Java Integer и Double ненужные издержки? - PullRequest
3 голосов
/ 29 декабря 2011

Я работаю с Java 1.3, поэтому он не поддерживает дженерики.Я придумал теневую работу вокруг.Я хочу знать, если объекты Integer и Double имеют ненужные накладные расходы;Я думаю, что я спрашиваю: занимают ли целые числа столько же места, сколько int?Тот же вопрос для Double и doubles.

Из того, что я знаю, массив Objects содержит массив 32-битных целых чисел, которые фактически хранят адрес объекта в памяти независимо от массива.Но когда я явно создаю массив примитивов, как я сделал здесь, результат будет плохим.Потому что, AFAIK, массив примитивов фактически является массивом данных, а не указателями на данные.Или я просто слишком много думаю о C ++?

Итак, если массив в DataPackage на самом деле содержит указатели вместо примитивов, я готов.Но если они сами хранят примитивы, доступ к данным будет проблемой, поскольку double - это 64 бита данных, но указатель на это все еще 32 бита.

/**
 *
 * 
 * @todo Comment all the code.
 * @author Davidthefat
 * @version 1.0
 */
public class DataPackage {

    private String dataType;
    private Object data;

    /**
     * 
     * @param type
     * @param numOfItems
     */
    public DataPackage(String type, int numOfItems) {
        dataType = type;
        if (type.equals("Wheels")) {
            data = new int[numOfItems * 2];
        }
        if (type.equals("Arms")) {
            data = new int[numOfItems * 1];
        }
        if (type.equals("Joysticks")) {
            data = new double[numOfItems * 2];
        }
        if (type.equals("Buttons")) {
            data = new boolean[numOfItems * 4];
        }
    }

    /**
     * 
     * @param t1
     */
    public void update(Object t1) {
        data = t1;
    }

    /**
     * 
     * @return
     */
    public Object getData() {
        return data;
    }

    /**
     * 
     * @return
     */
    public String toString() {
        return "This contains " + dataType;
    }
}

Чтобы получить доступ к этим данным, я приведу массив объектов в виде массива целых чисел, затем вызову функцию intValue (): temp - это массив целых чисел.Я также должен указать, что getData во входных данных просто возвращает DataPackage.

temp[0] = ((Integer[])input.getData("Wheels").getData())[0].intValue();

Я не могу просто запустить этот код прямо сейчас, так как он предназначен для робота FRC в моей школе, а школы нет.

Ответы [ 5 ]

2 голосов
/ 29 декабря 2011

Трудно следовать вашему вопросу, но я могу сказать следующее:

  1. Массив примитивов int, double и т. Д., Как вы подозреваете, просто массив значений, это не такуказатели на значения.
  2. Integer займет больше памяти, чем int, так как Integer - это объект, поэтому у вас будут служебные данные, тогда как int будет принимать толькотребуемое пространство данных.То же самое с Double и т. Д.
1 голос
/ 29 декабря 2011

Вы слишком много предполагаете из C ++.Если вы беспокоитесь о накладных расходах , вот статья об этом .

Подводя итог статьи, Integer имеет 12 байтов над обычной int;это наиболее вероятно, потому что JVM попытается выровнять данные.Однако Long имеет тот же размер, что и Integer, что доказывает, что это проблема выравнивания.

0 голосов
/ 29 декабря 2011

Нет, int и Integer не занимают одинаковое количество места.Значение int составляет 4 байта, Integer будет больше этого (насколько больше можно измерить, но это зависит от того, работаете ли вы в 32- или 64-битном режиме).Общий размер кажется целым числом 16 байтов.

Не совсем уверен, что вы хотите достичь, но ваш массив будет содержать ссылки на объекты, если вы используете Integer, Double и т. Д., Но сами значения, если выиспользуйте int double и т. д. Однако, поскольку Integer, Double и т. д. являются неизменяемыми, я на самом деле не знаю, что вы получите, имея только ссылки на объекты.

А какая у вас система, которая поддерживает только Java 1.3?EOL была начата 25 октября 2004 года и закончилась 11 декабря 2006 года, поэтому она довольно старая.

0 голосов
/ 29 декабря 2011

Согласно этому техническому документу, в мире Java вам не нужно сильно беспокоиться о накладных расходах, даже если с точки зрения распределения памяти Integer занимает немного больше, чем тип int. http://java.sun.com/docs/white/langenv/Simple.doc1.html

0 голосов
/ 29 декабря 2011

Я только размышляю, но я представляю, что целые числа занимают в несколько раз больше места, чем просто int и указатель.Я слышал, что сам объект также имеет некоторые издержки, которые увеличиваются с каждым методом.Я бы попробовал запустить несколько тестов в вашей системе.

...