有人问我:java中的数组是否包含整数和浮点数?她从老师那里得到了这个问题。
现在我的回答是:是的,因为你可以声明一个对象数组并在其中存储整数和浮点数。
但现在我想知道这是否正确,因为从技术上讲,当你将Integer和Float对象存储在一个数组中时,它确实包含两种类型,但是如果你要“询问”数组,他会告诉你他包含对象,如果我不进行簿记或类检查,则无法判断数组中是否存在整数和浮点数。
另一方面,我仍然觉得这可能是正确的答案,因为从理论上讲,数组包含两种类型的对象。
所以我要求一个聪明的意见:如果你被问到(在一次采访中,测试什么),java中的数组可以包含整数和浮点数,是或否?你会回答什么?
答案 0 :(得分:15)
int
的{{1}}不适合float
数组。但是,通过自动装箱,java会将Object[]
或Float
放入数组中。
Integer
和Float
都延伸Integer
。所以你甚至可以制作一组数字Number
此外,您可以将Number[]
放入int
,但java会将int转换为浮点数。反过来也是可能的,但精确度将会丧失。 (编辑:即使从int->浮点精度也可能丢失.float-> int可能会丢失有关值的整体大小的信息。)
结论将取决于问题。对于原始数据类型,数组不能包含其他数据类型。如果使用Object数组(Integer,Float,Number),答案是肯定的。
答案 1 :(得分:2)
这不是一个明确的“是”或“否”答案的问题。
我可以看到三种不同的方式可以回答肯定的问题:
Number[]
类型,可以包含(引用)Float
和Integer
个对象; double[]
类型,可以包含float
s和int
强制转换为double
(注意,两个演员都无损 ); int[]
类型,并且可以使用Float.floatToRawIntBits
将int
存储为float
并将int
转换为{{1}}。在案例3中(可以说在案例2中),您还需要一个并行数组,该数组将记录存储在主数组的每个元素中的值的类型。根据问题中的假设,这可能会使这些视为合适的答案。
如果在面试环境中提出这个问题,我会概述面试官的可能性,并询问他们正在寻找的三种解释中的哪一种,如果有的话。如有必要,我会进一步详细说明。
答案 2 :(得分:1)
如果您想使用基本数组,可以使用double[]
,double
可以存储所有可能的int
和float
值。丢失的唯一信息是该数字最初是int
还是float
(有3300万个整数可以是其中之一)
将int
或float
存储在double []
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。
面试问题可以通过询问他们从未想过的问题来捕捉受访者,通常是因为没有充分理由这样做(可能永远)如果这个问题听起来很奇怪,也许应该是。 ;)
答案 3 :(得分:0)
在java中只有两种数据类型 - 对象(扩展类Object的所有内容)和基元(int,byte,char等)。此外,每个原语都有其对象兄弟 - 例如int和java.lang.Integer
从技术上讲,数组只能包含对象。
但是在java 5.0中,由于'autoboxing'功能,它可以跳过原始到对象的转换 - 基本上它正在取代每个调用
int myInt = 0;
array[0] = myInt;
同
array[0] = new Integer(myInt);
此替换是自动完成的,但是在内部(在运行时)java机器将具有带对象的数组(整数),而不是基元(int),这可能会影响数组操作的性能。