Java數組
在java裏數組是一種數據結構,用來存儲同一類型值的集合, 通過整形下標來訪問數組中的每一個值
數組的聲明及其初始化
聲明:
需指明其數據類型,類型後面緊跟 “[ ]”,最後是數組變量的名字;
例如:int [] a;double[] d;
上面的語句只是聲明瞭一個變量,並沒有初始化一個真正的數組,應該使用new關鍵字給數組初始化 例如:
int[] a = new int[100]; double[] d = new double[100];
這裏就創建了一個可以存儲100個整形類型的數組,和一個可以存儲100個雙精度浮點類型的數組,數組的長度不要求是一個常量,new int[n];會創建一個長度爲n的數組;
數組有兩種聲明方式:
int [] a; 或者 int a[];
大多數java程序員喜歡第一種風格,因爲它將類型與變量的名字分開了
這個數組的下標是從 0 開始的,即數組的第一個值應該是a[0],而不是a[1],創建一個整形數組時,裏面所有的元素初始化都是 0 ,Boolean的話,都是false
由於數組的下標是從0 開始的,所以當你訪問a[100](任何在0~99之外的下標)時,會出現報錯,數組下標越界的報錯信息
如一下代碼:
public class Main {
public static void main(String[] args)
{
int [] a = new int[4];
System.out.println(a[4]);
}
}
執行結果如下:
我們可以看到出現一段英文,大意爲:數組下標越界異常
由於異常,程序終止了運行,如果想要獲得數組中元素的個數,可以使用 a.length,如 int i = a.length;
關於length本文的後面會有講解
java中的數組一旦創建了,就不能改變其大小(雖然可以改變每一個元素)
初始化
有一種比較簡單的初始化形式是在數組對象被創建時就對其進行賦值 例如:
int[ ] nums = { 1,2,3,4,5,6,7,8,9}; 這種聲明的初始化方式,不需要new關鍵字
我們還可以命名一個匿名的數組new int [] {1,3,5,7};其中數組的大小就是初始化值的個數,這樣,可以在不創建新變量名的請款下,重新初始化一個數組:如 nums = new int {,1,3,5,7,9};
java裏面,允許數組的長度爲 0,但是 0與null不同
數組拷貝
java中,可以將一個數組變量拷貝給另一個數組變量;這個時候,兩個變量引用一個數組:
例:
int [] moneyNumber = {1,2,5,10,20,50,100};
int [] copyNumber = moneyNumber;
拷貝結果如圖
此時兩個數組變量都是指向同一個地址空間的,改變一個,則兩個都將會改變,如果希望將一個數組的所有值拷貝到另一個數組,可以使用Arrays類的copyOf方法:copyNumber = Arrays.copyOf(moneyNumber,moneyNumber.length) ;這樣兩個變量纔不是指向同一個地址空間,方法內的參數,第一個是被複制的數組名,第二個是新數組的長度(這裏由於只需要與第一個數組等長的,是使用moneyNumber.length);
二維數組
多維數組將使用多個下標訪問數組的元素,適用於表示更加複雜的排列形式。常見的有二維數組(也稱爲矩陣)、
二維數組和一維數組的命名方式相似
int[][] array = new int[x][y];
如果知道數組的元素,就可以不用new對其進行初始化,就可以直接簡寫爲:
int[][] array =
{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{0,13,14,15},
}
一旦數組被初始化,就可以利用兩個方括號來訪問每一個元素,例如array[i][j];
實例:
public class Main {
public static void main(String[] args)
{
int [][] a = new int[4][4];
for(int i = 0;i < a.length;i++)
{
for(int j = 0;j < a[i].length;j++)
{
a[i][j] = i + j;
}
}
for(int i = 0;i < a.length;i++)
{
for(int j = 0;j < a[i].length;j++)
{
System.out.print(a[i][j] + "\t");
}
System.out.println();
}
}
}
執行結果:
不規則數組
Java中實際沒有多維數組,只有一維數組。多維數組被解釋爲“數組的數組”
這是一個簡單的不規則數組:
public class Main {
public static void main(String[] args)
{
int [][] a =
{
{1,2,3,4,5},
{6,7,8},
{9,0},
{5,9,4,1,2,6,7}
};
for(int i = 0;i < a.length;i++)
{
for(int j = 0;j < a[i].length;j++)
{
System.out.print(a[i][j] + "\t");
}
System.out.println();
}
}
}
執行結果:
一個不規則數組的簡單內存形勢圖:
可以看到,這相當於一個一維數組,然後數組裏面的元素也是一個數組,即數組的數組,這也嚴格的遵循一維數組的所有限制條件,也能夠使用一維數組的所有方法
數組一些常用的方法
方法 | 作用描述 | 參數類型 |
---|---|---|
static String toString(type[] a) | 返回包含a中數據元素的字符串,這些數據元素被放在括號內,並用逗號隔開 | 類型爲int 、long、short、char、byte、Boolean、float、double的數組 |
static String copyOf(type[] a,int length) | 返回一個與a類型相同的數組,其長度爲length或者end - start數組元素爲a的值 | 參數 a:int 、long、short、char、byte、Boolean、float、double的數組;參數start:起始下標(包括這個值);參數end:終止下標(不包括這個值);參數length:拷貝數據長度 |
static String copyOfRange(type[] a,int start,int end) | ||
static void sort(type[] a) | 採用優化的快速排序算法對數組進行排序 | 類型爲int 、long、short、char、byte、Boolean、float、double的數組 |
static int binarySearch(type[] a,type v) | 採用二分搜索算法查找值 v,若成功嗎,則返回下標,否則返回一個負數值 | 參數 a :int 、long、short、char、byte、Boolean、float、double的數組;參數 start:起始下標(包含這個值);參數end:終止下標(不包含這個值);參數 v :與a的數據元素類型相同的一個值 |
static int binarySearch(type[] a,int start,int end,type v) | ||
static void fill(type[] a,type v) | 將數組的所有數據元素的值設置爲v | 參數a :int 、long、short、char、byte、Boolean、float、double的數組;參數 v:與a的數據元素類型相同的一個值 |
static boolean equals(type[] a,type[] b) | 如果兩個數組大小相等,並且下標相同的元素都對影響等。返回true | 參數a、b:類型爲int 、long、short、char、byte、Boolean、float、double的兩個數組; |