java陣列 基本內容
什麼是陣列
陣列(Array)是有序的元素序列。 若將有限個型別相同的變數的集合命名,那麼這個名稱為陣列名。組成陣列的各個變數稱為陣列的分量,也稱為陣列的元素,有時也稱為下標變數。用於區分陣列的各個元素的數字編號稱為下標。陣列是在程式設計中,為了處理方便, 把具有相同型別的若干元素按有序的形式組織起來的一種形式。 這些有序排列的同類資料元素的集合稱為陣列。
陣列的宣告與建立
Java程式中的陣列必須先進行初始化才可以使用,所謂初始化,就是為陣列物件的元素分配記憶體空間,併為每個陣列元素指定初始值,而在Java中,陣列是靜態的,陣列一旦初始化,長度便已經確定,不能再隨意更改。
首先必須宣告陣列變數,才能在程式中使用陣列。下面是宣告陣列變數的語法:
dataType[] arrayRefVar; // 首選的方法
或
dataType arrayRefVar[]; // 效果相同,但不是首選方法 c++沿用
public class Demo01 { public static void main(String[] args) { //靜態初始化:由程式猿自己確定每個陣列元素的初始值,而陣列的長度則由系統自己決定, int[] a = {1,2,3,4,5}; System.out.println(a.length); // 第二行程式碼可以看出,陣列擁有類的性質,可以用dot訪問其變數 // 第一行程式碼靜態初始化了陣列整型陣列a,賦予其固定的長度,系統可以為其分配空間 //動態初始化:初始化時由程式猿確定陣列的長度,而沒一個數組元素的值,則由系統來分配初始值, int[] b=new int[5]; System.out.println(b[0]);//預設值是0 // 很明顯,陣列就是類 //所以對於陣列變數來說,他並不需要初始化,我們常說的初始化其實是初始化陣列物件而非陣列變數, // 有時候我們不進行初始化,而讓陣列變數指向一個有效的陣列物件,陣列也可以使用 int[] c = {0,1,2,3,4}; int[] d; d = c; System.out.println(d[1]); // 輸出結果為 1 d[1] = 99; System.out.println(c[1]); // 輸出結果為 99 //利用增強型迴圈輸出如下陣列 int [] numbers = {10, 20, 30, 40, 50}; for(int x :numbers){ System.out.print(x+" "); } System.out.println(); System.out.println("==============="); String [] names ={"James", "Larry", "Tom", "Lacy"}; for (String string:names){ System.out.print(string+" "); } } }
java三種初始化和記憶體分析
1.靜態初始化
除了用new關鍵字來產生陣列以外,還可以直接在定義陣列的同時就為陣列元素分配空間並賦值。
例 int[] a={1,2,3};//靜態初始化基本型別陣列
Man[] mans={new Man(1,1),new Man(2,2)};//靜態初始化引用型別陣列
2.動態初始化
陣列定義與為陣列元素分配空間並賦值的操作分開進行
int[] a1=new int[2];//動態初始化元素,先分配空間
a1[0]=1;//給陣列元素賦值
a1[2]=2;
3.陣列的預設初始化
陣列是引用型別,他的元素相當於類的例項變數,因此陣列一經分配空間,其中的每個元素也被按照例項變數同樣的方式被隱式初始化
例項:int a2[]=new int[2];//預設值0,0
boolean[] b=new boolean[2];//預設值 false,false
String[] s=new String[2];//預設值null
public class Demo02 {
public static void main(String[] args) {
//陣列的初始化方式
//1.靜態初始化
int[] a = {10,20,30,40,50};
//建立之後a不可改變
System.out.println(a[2]);
//2.動態初始化
int[] b = new int[3];
b[0] = 10;
b[1] = 20;
b[2] = 30;
System.out.println(b[2]);
//3.陣列的預設初始化
int a2[]=new int[2];//預設值0,0
boolean[] b2=new boolean[2];//預設值 false,false
String[] s=new String[2];//預設值null
}
}
陣列的特性
- 其長度是確定的。陣列一旦被建立,它的大小就是不可以改變的。其元素必須是相同型別,不允許出現混合型別。
- 陣列中的元素可以是任何資料型別,包括基本型別和引用型別。
- 陣列變數屬引用型別,陣列也可以看成是物件,陣列中的每個元素相當於該物件的成員變數。
- 陣列本身就是物件,Java中物件是在堆中的,因此陣列無論儲存原始型別還是其他物件型別,陣列物件本身是在堆中的。
陣列的使用
public class Demo03 {
public static void main(String[] args) {
//陣列的基本使用
//靜態定義一個數組
int[] a = {10,30,50,64,21,35};
//輸出所有值
//for迴圈輸出
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
System.out.println("==============");
//增強型迴圈輸出
for (int x:a){
System.out.println(x);
}
System.out.println("==============");
//計算陣列中所有元素的和
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
System.out.println("sum="+sum);
System.out.println("==============");
//輸出陣列中的最大值
int max = a[0];
for (int i = 0; i < a.length; i++) {
if(a[i] > max){
max = a[i];
}
}
System.out.println("陣列元素的最大值為:"+max);
}
}
public class Demo04 {
public static void main(String[] args) {
int[] a = {10,21,12,65,85} ;
printArray(a);
int[] ints = returnArray(a);
System.out.println();
printArray(ints);
}
//列印陣列所有元素
public static void printArray(int[] array){
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
}
//將陣列反轉
public static int[] returnArray(int[] array){
int[] result = new int[array.length];//定義一個數組,長度和需要反轉的陣列一樣的
for (int i = 0,j=result.length-1; i < array.length; i++,j--) {
result[j] = array[i];
}
return result;//最終返回這個陣列
}
}
二維陣列
public class Demo05 {
public static void main(String[] args) {
int [][] ar = {{4,5,6,8},{2,3,5,8},{1,6,9,5}};
System.out.println(ar.length);//輸出行數
System.out.println(ar[0].length);//輸出列數
//按照行列輸出二維陣列
/*
4 5 6 8
2 3 5 8
1 6 9 5
*/
for (int i = 0;i < ar.length;i++){
for(int j = 0;j<ar[i].length;j++){
System.out.print(ar[i][j]+" ");
}
System.out.println();
}
}
}
Arrays類
陣列的工具類java.util.Arrays
由於陣列物件本身並沒有什麼方法可以供我們呼叫,但API中提供了一個工具類Arrays供我們使用,從而可以對資料物件進行一些基本的操作。
檢視JDK幫助文件,Arrays類中的方法都是static修飾的靜態方法,在使用的時候可以直接使用類名進行呼叫,而"不用"使用物件來呼叫
(注意:是"不用”而不是"不能")
具有以下常用功能:
- 給陣列賦值:通過fill方法。
- 對陣列排序:通過sort方法,按升序。
- 比較陣列:通過equals方法比較陣列中元素值是否相等。
- 查詢陣列元素:通過binarySearch方法能對排序好的陣列進行二分查詢法操作。
import java.util.Arrays;
public class demo06 {
public static void main(String[] args) {
int [] nums = {10,30,8,52,21};
Arrays.sort(nums);
System.out.println("------升序-----");
for (int num : nums) {
System.out.print(num+"");
}
System.out.println("\n------降序-----");
for (int i = nums.length-1; i >=0 ; i--) {
System.out.print(nums[i]+"");
}
System.out.println("\n------字串排序-----");
String [] mm = {"n","1","6","M","a","5"};
Arrays.sort(mm);
for (String s : mm) {
System.out.print(s);
}
System.out.println("\n------判斷兩個陣列是否相等-----");
int [ ] num1 = {1,2,3};
int [ ] num2 = {1,2,4};
boolean b = Arrays.equals(num1, num2);
System.out.print(b);
System.out.println("\n------轉換為字串-----");
int [] num3 = {5,6,4,5,8};
String s = Arrays.toString(num3);
System.out.print(s);
System.out.println("\n------賦值相同數值-----");
int [ ] num4 = {1,2,4};
Arrays.fill(num4,66);
for (int i : num4) {
System.out.print(i+" ");
}
System.out.println("\n------複製為新陣列-----");
int [ ] num5 = {1,2,4};
int[] num55 = Arrays.copyOf(num5, 5);
for (int i : num55) {
System.out.print(i);
}
System.out.println("\n------查詢元素下標-----");
int [ ] num6 = {1,2,4};
int i = Arrays.binarySearch(num6, 4);
System.out.println(i);
}
}