Большой массив типа int должен быть передан в общий массив и коллекции - PullRequest
0 голосов
/ 18 марта 2011

Я генерирую из функции большие массивы (размер> 1000) с элементами типа int.Мне нужно передать этот массив в массив универсального типа, но так как массив универсального типа не принимает массивы примитивного типа, я не могу этого сделать.

Боюсь использовать Integer тип array, так как он будет дорогостоящим с точки зрения создания, производительности, используемого пространства (массив из 12-байтовых объектов) при этом для массивов большого размера.Более того, он создаст неизменяемые значения Integer с, когда мне нужно будет выполнить некоторые операции сложения с элементами массива.

Каков будет наилучший путь?

РЕДАКТИРОВАТЬ Просто чтобы устранить некоторые недоразумения, мне нужно передать int [] методу типа подписи: void setKeys(K... keys).

Ответы [ 5 ]

3 голосов
/ 18 марта 2011

Я хочу передать int[] этой функции: public Query<K> setKeys(K... keys);

Я предполагаю, что вы имеете в виду, что int[] должен быть набором ключей ... а не только одним ключом.

Это невозможно. Параметры типа универсального типа должны быть ссылочными типами. Ваш вариант использования требует, чтобы K был int.

У вас есть два варианта:

  • используйте Integer (или изменяемый класс int владельца) и платите штраф за производительность, или
  • отказаться от использования обобщений и изменить сигнатуру этого метода.

Кстати, класс Integer хранит кеш из Integer объектов для небольших значений int. Если вы создаете свои объекты, используя Integer.valueOf(int), есть большая вероятность, что вы получите ссылку на уже существующий объект. (Конечно, это работает только потому, что Integer объекты неизменны.)

3 голосов
/ 18 марта 2011

Если ваши массивы имеют порядок 1000 (или даже 10000 или 100000) элементов, разница в стоимости с точки зрения памяти и производительности, вероятно, не будет заметна, если вы не будете обрабатывать массивы тысячи раз каждый.Напишите код с Integer и оптимизируйте позже, если у вас есть проблемы с производительностью.

0 голосов
/ 20 марта 2011

Если вы не хотите, чтобы целые числа были в штучной упаковке, вы можете передать результат Ints.asList() из библиотеки Google Collections (http://guava -libraries.googlecode.com / svn / tags / release08 / javadoc) /com/google/common/primitives/Ints.html#asList(int...)), который будет List<Integer> поддержан массивом. При получении доступа к значениям они будут упакованы, так что это имеет смысл, только если к значениям не обращаются много раз.

0 голосов
/ 18 марта 2011

Если вам действительно действительно нужно беспокоиться о влиянии на производительность целых чисел бокса / распаковки, вы можете рассмотреть GNU Trove , особенно их TIntArrayList.Это позволяет имитировать функциональность ArrayList<Integer> при поддержке примитивов.Тем не менее, я не уверен, что вам это нужно, и я не уверен, что это именно то, что вы ищете.

0 голосов
/ 18 марта 2011

Если вы обеспокоены производительностью , вы можете написать простой класс, который обернет общедоступный int, что означает, что вы можете сделать свой вызов и по-прежнему изменять его по мере необходимости.Сказав это, я согласен, что вы хотите быть абсолютно уверены, что вам нужно это улучшение производительности, прежде чем делать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...