2011-06-22 30 views
6

有人問我:java中的數組是否可以包含整數和浮點數?她從一位老師那裏得到了這個問題。數組可以包含整數和浮點數

現在,我的回答是:是的,因爲你可以申報對象和存儲的整數數組,並能浮在水面。

但是現在我想知道這是否正確,因爲從技術上講,當你將Integer和Float對象存儲在一個數組中時,它確實包含了這兩種類型,但是如果你要「詢問」數組,他會告訴你他包含對象,如果我不做記賬或類檢查,則無法告訴陣列中是否有整數和浮點數。

在另一方面,我還是覺得因爲從理論上講數組包含兩種類型的對象可能是正確的答案。

所以我要求一個聰明的意見:如果你被要求(在接受採訪時,測試等等)在Java閹一個數組可以包含整數和浮點數,是或否?你會回答什麼?

+2

我的答案是肯定的,你可以很好地解釋它。 –

回答

15

A intfloat不適合Object[]陣列。但是,通過自動裝箱,java會將FloatInteger放入數組中。

FloatInteger延伸Number。所以,你甚至可以使數字Number[]

另外的數組,你可以把一個intfloat[],但隨後java會投中的int轉換爲一個float。反過來也是可能的,但精確性將會喪失。 (編輯:即使從int-> float精度可能會丟失,float-> int可能會丟失關於值的整體大小的信息)。

的結論將取決於這個問題。對於原始數據類型,數組不能包含其他數據類型。如果你使用Object數組(整數,浮點數,數字),答案是肯定的。

+5

嚴格地說,你**不能**將'int'放入'float []'中。存儲在'float []'中的值總是** ** float值。另外:從「int」轉換爲「float」並不總是無損的。 –

+0

感謝您的回答,但只是要清楚:您的結論是'是'? – Samuel

+0

我的結論是'是的,但'。它很大程度上取決於問題的提出方式。當你使用一個原語時,它不能包含其他類型,你不能從中獲得其他類型,但是你可以把其他類型放入其中。因此,嚴格說出答案的是原始數據類型。 對於對象(Integer,Float,Number),答案是肯定的。 – Dorus

1

如果要使用原始數組,可以使用double[],因爲double可以存儲所有可能的intfloat值。丟失的唯一信息是數是否原本是intfloat(有33個百萬個整數其可以是)

若要存儲intfloat在雙[]

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

要檢索一個intfloat的值。

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

如果您使用Object []來存儲對象的任意組合,包括Integer和Float。

面試問題可以問他們,他們從來沒有想過的問題捉出受訪者,通常是因爲沒有充分的理由這樣做(可能是有史以來)如果這個問題聽起來很奇怪,也許它應該。 )

+0

但是,如果我將數字存儲在雙精度數組中,數組將不僅包含浮點數,不是嗎? :) – Samuel

+0

@Samuel,'int','float'和'double'都是數據的位。你可以讓他們意味着你想要的。 ;)爲了得到一個'int'你可以做'(int)array [n]'來獲得一個'float'你可以做'(float)array [n]' –

+1

我完全同意,實際上它全部歸結爲兩個一堆和零,但我想他們瞄準更高層次的演示文稿:p – Samuel

0

在java中只有兩種數據類型 - 對象(即延伸class對象)和原語(INT,字節,焦炭等)的一切。而且,每個基元都有它的對象兄弟 - 例如int和java.lang。整數

從技術上講,數組只能包含對象。

但在Java 5.0有可能原語到對象的轉換由於跳轉到「自動裝箱」功能 - 基本上它替換每個呼叫等
int myInt = 0; array[0] = myInt;

array[0] = new Integer(myInt);

此替換是自動完成的,但是在內部(在運行時)java機器將有對象(整數)而不是基元(int)的數組,這會影響數組操作的性能。

2

這不是一個明確的「是」或「否」答案的問題。

我可以看到三個不同的方面,其中,問題可以在肯定的答覆:

  1. 陣列可以是Number[]類型的,並且可以包含(引用)FloatInteger對象;
  2. 陣列可以是double[]類型的,並且可以包含float S和int演員到double(N.B.兩個鑄件是無損);
  3. 該陣列可以是int[]類型並且可以存儲int s as-as和float s使用Float.floatToRawIntBits轉換爲int

在情況3(並且可以證明情況2)的情況下,還需要一個並行數組來記錄存儲在主數組的每個元素中的值的類型。根據問題內置的假設,這可能很難取消這些作爲合適答案的資格。

如果這個問題出現在面試環境中,我會概述面試官的可能性,並詢問他們在尋找哪三種解釋(如果有的話)。如有需要,我會進一步闡述。

+0

2)int浮動也是無損的。 2 + 3)你確實丟失了原始值是int或float的信息。在情況3中,這個信息也非常重要。智能意見+1。 – Dorus

+0

@Dorus:非常好的重新輸入信息,謝謝。我已經更新了答案。至於直接的'int'->'float'類型轉換,這是有損的,因爲'float'的尾數只有23位,而'int'可能需要31位。 – NPE

+0

的確,我很快就在閱讀加寬原始轉換。 int浮動可能會失去精度,就像float一樣。 – Dorus