Может ли массив содержать целые числа и числа с плавающей запятой - PullRequest
6 голосов
/ 22 июня 2011

Кто-то спросил меня: может ли массив в java содержать целые числа и числа с плавающей запятой? Она получила этот вопрос от учителя.

Теперь мой ответ был: да, так как вы можете объявить массив объектов и хранить в нем целые и плавающие числа.

Но теперь мне интересно, если это правильно, поскольку технически, когда вы храните объекты Integer и Float в массиве, он в некотором роде содержит оба типа, но если вы «спросите» массив, он скажет, что содержит Объекты, и если я не делаю бухгалтерию или проверку классов, нет никакого способа сказать, что в массиве есть целые числа и числа с плавающей запятой.

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

Так что я прошу умного мнения: если бы вас спросили (в интервью, тесте) ли в java, массив может содержать целые числа и числа с плавающей запятой, да или нет? Что бы вы ответили?

Ответы [ 4 ]

15 голосов
/ 22 июня 2011

A int из float не вписывается в массив Object[].Тем не менее, при автоматической блокировке java вместо этого поместит Float или Integer в массив.

Оба Float и Integer расширяют Number.Таким образом, вы даже можете создать массив чисел Number[]

Также вы можете поместить int в float[], но java затем бросит int в число с плавающей точкой.Возможен и обратный путь, но точность будет потеряна.(редактировать: даже из int-> float точность может быть потеряна. float-> int может потерять информацию об общей величине значения).

Вывод будет зависеть от вопроса.Для примитивных типов данных массив не может содержать другой тип данных.Если вы используете массив объектов (Integer, Float, Number), ответ будет положительным.

2 голосов
/ 22 июня 2011

Это не вопрос с четким ответом "да" или "нет".

Я вижу три отличных способа ответить на вопрос утвердительно:

  1. массив может иметь тип Number[] и может содержать (ссылки на) Float и Integer объекты;
  2. массив может иметь тип double[] и может содержать float с и int с приведением к double (примечание: оба приведения без потерь );
  3. массив может иметь тип int[] и может хранить int s как-то и float s, преобразованные в int с использованием Float.floatToRawIntBits.

В случае 3 (и, возможно, в случае 2) вам также потребуется параллельный массив, который будет записывать тип значения, хранящегося в каждом элементе основного массива. В зависимости от допущений, заложенных в вопрос, это может привести к тому, что они не будут подходящими.

Если бы этот вопрос возник в ходе собеседования, я бы рассказал собеседнику о возможностях и спросил, какую из трех интерпретаций, если таковые имеются, они искали. При необходимости я бы уточнил подробнее.

1 голос
/ 22 июня 2011

Если вы хотите использовать массив примитивов, вы можете использовать double[], так как double может хранить все возможные значения int и float. Единственная потерянная информация - было ли это число int или float (33 миллиона целых чисел могут быть либо)

Для хранения int или float в двойном []

double[] d = 
int i = 
float f = 
d[0] = i;
d[1] = f;

Для получения значения int или float.

int i = (int) d[0];
float f = (float) d[1];

Если вы используете Object [] для хранения любой комбинации объектов, включая Integer и Float.

Вопросы для интервью могут привлечь респондентов, задав им вопросы, о которых они никогда не задумывались, обычно потому, что для этого не было веских оснований (возможно, когда-либо). ;)

0 голосов
/ 22 июня 2011

В Java есть только два типа данных - объекты (все, что расширяет класс Object) и примитивы (int, byte, char и т. Д.). Кроме того, у каждого примитива есть свой родной объект - например, int и java.lang.Integer

Технически, массив может содержать только объекты.

Но в java 5.0 можно пропустить преобразование примитива в объект благодаря функциям 'autoboxing' - в основном он заменяет каждый вызов как
int myInt = 0; array[0] = myInt;<br> с <br> array[0] = new Integer(myInt);

Эта замена выполняется автоматически, однако внутри (во время выполнения) java-машина будет иметь массив с объектами (Integer), а не с примитивами (int), и это может повлиять на производительность операций с массивами.

...