javaSE中陣列的定義與使用
一維陣列的初始化
收先要說明一點,java中的陣列和C語言中的陣列的寫法是不一樣的,之前一直學的C語言,在這裡改改過來了!!!
java中的陣列初始化分為兩種:動態初始化和靜態初始化
動態初始化
資料型別[] 陣列名稱 = new 資料型別 [長度] ;//長度固定
陣列是一種引用資料型別,這就會涉及到它的記憶體分配問題,一般情況下,我們在建立陣列時,就會在堆上開闢出空間存放陣列,陣列長度是幾,就會在堆上開闢出多少個空間,我們訪問陣列的時候是同過索引進行訪問的,假如我的陣列長度是3,那麼堆上就會給出0,1,2這三個索引。
需要注意的是:
我們在動態初始化陣列開闢空間時,陣列的每個元素會是資料型別的預設值。意思就是,如果我的陣列是int型的,那麼陣列當中每個元素的預設值就是0;如果是String型的,那麼每個元素的預設值就是null。
我們會發現陣列的長度是固定的,這樣就很容易出現訪問越界的情況,一旦訪問越界,就會出現陣列訪問越界的異常。
拿段程式碼來舉個例子吧:
public class Arrays{
public static void main(String[] args){
int a[]=new int[3];//開闢了一個長度為3的陣列
//我們不妨列印一下,看看結果中每個元素預設值是什麼?
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
a[0]=1;
a[1]=2;
a[ 2]=3;
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
結果如下:
我們可以看到我們在做動態初始化的時候沒有賦值之前三個元素的預設值都是0(因為陣列型別是int,預設值是0),我們賦了初值之後就有了。
陣列分佈例項化
int[] x = null ;
x = new int[3] ;
陣列屬於引用資料型別,因此在使用之前一定要開闢空間(例項化),否則就會產生NullPoninterException (空指標異常)
引用傳遞
剛開始我也不知道這個引用傳遞是什麼意思?後來經過了解,我來解釋一下引用傳遞:
引用傳遞其實說的是記憶體分配的問題,前面提到陣列是引用資料型別,那麼它在堆上會開闢空間的,但是陣列這個變數是在棧上的,也就是說這個在棧上的變數指向了在堆上給它分配的空間,而引用傳遞指的是同一塊堆記憶體空間可以被不同的佔空間所指向,說了一大頓,你可能還是不理解,沒關係,用一個圖來看再清楚不過了:
比如下面一段程式碼:
public class Arrays{
public static void main(String[] args){
int a[]=null;//開闢了一個長度為3的陣列
int x[]=null;
a=new int[3];
a[0]=1;
a[1]=2;
a[2]=3;
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
x=a;
x[0]=55;
//我們不妨列印一下,看看結果中每個元素預設值是什麼?
System.out.print(a[0]); //55
//結果表明a[0]被改變了
}
}
靜態初始化
在動態初始化陣列時,我們是先開闢的記憶體空間,之後才設定的內容,而如果我們要向在開闢空間的同時設定內容的話,就要用到靜態初始化了。
靜態初始化有以下兩種形式:
<1> 資料型別[] 陣列名稱 = {值,值,....}
<2> 資料型別[] 陣列名稱 = new 資料型別[] {值,值,....}
例如下面這段程式碼:
public class Arrays{
public static void main(String[] args) {
int[] x = {1,2,3,4,5} ; // 格式一
for (int i = 0; i<x.length ; i++) {
System.out.print(x[i]) ;
}
System.out.println();
int[] a=new int[]{1,2,3,4,5};//格式二
for (int i = 0; i<a.length ; i++) {
System.out.print(a[i]) ;
}
}
}
這兩種靜態化初始結果一樣:
建議使用完整格式(格式二),這樣可以輕鬆的使用匿名陣列這一概念,下面簡單看一下匿名陣列的形式。
匿名陣列
直接看程式碼就明白了:
public class ArrayDemo{
public static void main(String[] args) {
System.out.println(new int[]{1,2,3,4,5}.length) ; //匿名陣列
}
}
二維陣列
二維陣列開發過程中用的並不多,簡單瞭解即可
二維陣列動態初始化
二維陣列動態初始化和一維陣列一樣都是先開闢記憶體空間,後賦值
資料型別[][] 物件陣列 = new 資料型別[行個數][列個數] ;
程式碼示例:
public static void code5(){
int[][] intArray=new int[2][4];
intArray[0][0]=1;
intArray[0][1]=2;
intArray[0][2]=3;
intArray[0][3]=4;
for(int i=0;i<intArray.length;i++){
for(int j=0;j<intArray[i].length;j++){
System.out.printl(intArray[i][j]+" ");
}
System.out.println();
}
}
二維陣列靜態初始化
在開闢空間的同時賦值
資料型別[][] 物件陣列 = new 資料型別[][]{{值,值,…},{值,值,…},…} ;
程式碼示例:
public class Arrays{
public static void main(String[] args) {
// 陣列並不是等列陣列
int[][] data = new int[][] {
{1,2,3},{4,5},{6,7,8,9}
};
// 在進行輸出的時候一定要使用雙重迴圈
for (int x = 0; x<data.length ; x++) {
for (int y = 0; y<data[x].length ; y ++) {
System.out.println("data["+x+"]["+y+"]="+data[x][y]+" ") ;
}
System.out.println();
}
}
}
物件陣列
之前所定義的陣列都屬於基本型別的陣列,物件陣列往往是以引用資料型別為主的定義,例如:
類、介面
。
物件陣列的動態初始化
其實學到這裡,我們應該都知道了動態初始化和靜態初始化的區別了,就是在記憶體開闢和賦值先後順序上的區別,我們看看物件陣列動態初始化的語法:
類名稱[] 物件陣列名稱 = new 類名稱[長度] ;
之前我們並沒有接觸過物件陣列,這裡我們舉個例子來說明一下:
看一段程式碼:
class Person{//先定義一個Person類
private String name ;
private int age ;
public Person(String name, int age) {
this.name = name ;
this.age = age ;
}
public void getInfo() {
System.out.println("姓名:"+this.name+",年齡:"+this.age) ;
}
}
public class Test {
public static void main(String[] args){
Person[] per = new Person[3] ; // 陣列動態初始化,每個元素都是其對應資料型別的預設值
per[0] = new Person("張三",1) ;
per[1] = new Person("李四",2) ;
per[2] = new Person("王五",3) ;
for (int x = 0 ; x < per.length ; x++) {
per[x].getInfo() ;
}
}
}
物件陣列靜態初始化
這樣我們就知道 了,靜態初始化其實只需將Test裡面的部分稍作改動,如下:
public class Test {
public static void main(String[] args){
Person[] per = new Person[] {
new Person("張三",1) ,
new Person("李四",2) ,
new Person("王五",3)
} ; // 物件陣列靜態初始化
for (int x = 0 ; x < per.length ; x++) {
per[x].getInfo() ;
}
}
}
結果和上面一樣。
在java中陣列的使用和c語言中大多一樣,比如說方法接收陣列、方法返回陣列、方法修改陣列等等,但是要注意的是在方法返回陣列的時候,我們要考慮兩種情況:返回的陣列是新陣列還是修改原來陣列的值,如果返回新陣列,那麼一開始一定要先new一個新陣列,如果是修改原來陣列的值,直接修改即可,無需返回值。