2016-03-07 128 views
1

我在問我Java中的數組初始化是否與C相同。在C中,您無法在程序運行時定義數組的大小。在Java中是否可能(或者恰如其分)?Java數組大小

public int[] createArray(int size) { 
    return new int[size]; 
} 

在我來說,我有,因爲我畫折線面板上

g.drawPolyline(xPoints[], yPoints[], n); 

感謝您的幫助

+0

你怎麼用'不能定義數組的大小是指當程序running'?你不能調整數組的大小,但是你可以創建一個大小爲「x」的新數組,或者直接重新指定一個數組變量。 – SomeJavaGuy

+0

我的意思是,如果有可能創建一個數組而不定義他的大小,但它會在用戶輸入後定義(例如) – user3721668

+0

不,這是不可能的。您至少需要定義數組的第一維。 – SomeJavaGuy

回答

2

您不能更改數組使用數組,而不是一個ArrayList大小,但可以使用System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)將數組的值複製到另一個更大的數組中,不必擔心它的速度,因爲它是內置函數並使用JNI實現,所以它非常快速

+0

是的,這是真的,謝謝 – user3721668

+0

在Java中,這將是System._array_copy :) – fge

+0

@ fge,是的,它是'arraycopy(對象src,int srcPos,對象dest,int destPos,int長度)' – starkshang

1

C沒有Java那樣的「數組」的基本概念;在C,你會

malloc(some_size * sizeof(one_element)) 

並影響到one_element *(當然,這是一個嚴重的描述)。

在Java中,數組同樣是動態分配的;如果你知道大小,在運行時,那麼你就可以在特定的SomeType數組和大小someSize做:

final SomeType[] myArray = new SomeType[someSize]; 

在本質上,這是相當一致;包括事實是,在這兩種情況下的數組是不可調整大小,但對如果指定了無效的指標發生了什麼巨大的差別:

    在Java中
  • ,這導致了IndexOutOfBoundsException;
  • 在C中,這是未定義的行爲。

總而言之,除了使用「陣列」錯誤,發生的事情在C和發生的事情在Java中其實只有語法不同,以創建陣列的後果開始與...

+0

感謝您的非常詳細回答:) – user3721668

0

正如其他人所說,你不能這樣做。而是你可以使用ArrayList(或任何其他列表),並在需要的地方,將其轉換爲簡單的數組,像這樣:

ArrayList<String> arrayList = new ArrayList<>(); 
String strings[] = (String[])arrayList.toArray(); 
0

在C,而該計劃是你無法定義數組的大小運行。在Java中是否可能(或者恰如其分)?

是的,你可以在運行時定義一個數組的大小,只是不重新定義它。這將在堆上創建一個具有足夠空間的對象來保存所需數量的基元(在基本數組的情況下)或對象引用(將它們視爲指針)。

如果您想重新定義陣列的大小,您需要創建一個新陣列並複製舊陣列(System.arraycopy()Arrays.copyOf(...))。

在我來說,我有,因爲我是一個面板

好上繪製折線使用數組,而不是一個ArrayList,你仍然可以使用列表並調用它toArray(...)。這也是在運行時創建數組的一個示例。

由於您最終需要撥打Graphics.drawPolyline(...),您必須保留兩個List<Integer>或最好是List<Point>,並在該列表內部構建x和y陣列。

+0

也許你的第二個答案,與我自己來說的問題是,我有畫折線不僅僅是通過INT元素組成點的名單,但幾個百分點(x和y) – user3721668

+0

@ user3721668是的,這就是我編輯它的原因。從設計的角度來看,我寧願提供一個點列表,並在調用draw方法之前構造這兩個數組。這樣你就不會遇到兩個數組長度不一致的錯誤,或者一個排序而另一個排序不正確的錯誤。 (另一種選擇可能是使用'GeneralPath'並在那裏收集座標)。 – Thomas

+0

確切地說,這就是我剛纔所做的,它似乎工作正常 – user3721668