天天看點

黑馬程式員——JAVA基礎之數組

------- android教育訓練、java教育訓練、期待與您交流!--------

數組的基本概念

數組是一種存放資料的 容器 數組的資料資料類型都相同 數組具有一個固定的長度 l 數組中的資料都有一個唯一的編号叫做數組元素 索引 或數組元素 下标 數組的索引從 0 開始 通路數組中的元素使用 索引 來通路 建立數組的記憶體空間使用 new 關鍵字實作、

數組是一種簡單的複合資料類型。它是存放具有相同資料類型的數值的資料結構,它的每一個元素都具有同一個類型,先後順序也是固定的,數組一旦建立之後,大小就固定了,不再發生變化,它的資料類型既可以是簡單類型,也可以是類,數組通常分為一維數組,二維數組和多元,但是使用比較多的還是一維數組和二維數組。

一維數組

一維數組可以存放成千上萬個資料,它們是一組相關的存儲單元,這些存儲單元在邏輯上被看作是互相獨立的若元素,它們具有相同的名字和資料類型,數組中的某個特定的元素有它的下标決定,隻有一個下标的數組稱為一維數組。聲明一個一維數組的形式如下:

資料類型   數組名[ ]或者資料類型   [ ]  數組名

格式 1 : • 資料類型 [ ]  數組名 ; • int [ ]   arr ; double[ ]  arr1; • boolean  arr2  [ ]  long  [ ] arr3   格式 2 : • 資料類型 [ ]  數組名 =  new  資料類型 [ 數組長度 ]; • int [ ]  arr = new int [4]; • double  [ ] arr1 = new double[5];   格式 3 : • 資料類型 [ ]  數組名 = new  資料類型 []{ 數組元素清單 }; • 數組元素清單包含數組中所有元素,中間用 , 分割 • int [ ]  arr = new int [ ]{1,3,5,7,9}; • long[ ]  arr1 = new long [ ] {2,4,6L,8,10L};   格式 4 : • 資料類型 [ ]  數組名 = { 數組元素清單 }; • int []  arr = {1,3,5,7,9};  不能分開指派   這裡的資料類型就是元所擁有的類型,常見的類型有整型、浮點型和字元型,數組名是使用者自己定義的合法的辨別符,用來統一這組相同資料類型的元素名稱,其命名規範和變量相同,[ ]表示這是一個數組,數組一旦被定義,它的資料類型和數組名就不可更改。以上聲明數組的文法格式都對,但是建議大家采用第一種例如:int [ ]  arrayName;就表示為int類型的一維數組,這樣可以增加代碼的可讀性。   數組初始化: 由于數組數組不過是一種特殊的類,Java中在數組聲明時并不為數組配置設定空間,是以在聲明的[ ]中不能指出數組中元素的個數即數組的長度,是以聲明之後并不能立即使用,必須經過初始化并配置設定存儲空間後,才能通路數組元素,為數組配置設定存儲空間有兩種方式:初始化和使用關鍵字new。 數組的初始化指的是在聲明數組的同時為其元素賦初值,它的初始化格式如下: 資料類型  數組名 [ ] = {值1,值2,.....,值n};"{ }"中是初始化表,在聲明時,并不需要将數組元素的個數列出,編譯器根據所給出的初值個數來判斷數組的長度,為這個數組配置設定足夠的記憶體空間,并在這些空間中依次填入這些值,例如: int  array[ ] = {0,1,2,3,4,5,6,8,9}; double day[ ] = {10.2,45.9,65.0,55.4}; 在上面的語句中聲明了一個整型數組array,雖然沒有特别指明數組的長度,但由于大括号裡的初值有9個,編譯器會按從0~8的順序将各元素進行存放,arr[0]為0,arr[1]為1,....,arr[8]為9,java中任何一個長度為n的數組,它的下标總是0,最後一個元素的下标總是n-1。 使用關鍵字new 通過使用new運算符可以為數組配置設定空間和指定初值,它的一般形式是: 資料類型  數組名 [ ]; 數組名 = new  數組類型 [數組長度];  或将聲明與建立寫在一起: 資料類型  數組名[ ]  = new 資料類型  [數組長度]; 其中資料類型和數組名與聲明時的相同,數組聲明後,接下來便是要配置數組所需的記憶體,其中"數組長度"是告訴編譯器,所聲明的數組要存放多少個元素,而"new"則是指令編譯器根據括号裡的資料個數,在記憶體中開辟一塊記憶體空間供該數組使用。例如: int a[ ]; a = new [5]; double [ ]  b = new double [10]; 一旦數組初始化或用new為數組配置設定了存儲空間以後,該數組的長度即被固定下來,不能在進行改變,除非在建立一個數組,重新配置設定存儲空間。 !注意:對同一個數組再次動态配置設定空間時,即用new運算符建立,若該數組的存儲空間沒有進行另外的存儲,那麼該數組的資料将會丢失。例如: int array [ ] = {11,12,13,14,15};   array = new int [10];在這裡通過new運算符為array數組重新配置設定空間,那麼它原來的11,12,13,14,15将丢失。   引用 要引用一個數組,其實使用的是這個數組中的元素,想要使用數組裡的元素,可以利用索引來完成,Java中的數組索引标号由0開始到數組長度-1為止數組元素使用形式: 數組名[下标] [ ] 中的下标是介于[0,數組長度-1]之間的整型數,也可以是byte、short、char等類型,但是不允許為long型,當然下标也可以是合法的表達式。 如果要直接通路某數組中的最後一個元素,這時就需要用到數組的一個屬性:length,它是一個特殊的屬性,表示數組共有多少個元素,也是數組的長度,使用者程式無法直接改變這個值,它的具體用法是:數組名.length,來看一個一維數組的使用方法的程式:

class  ArrayClass
{
	public static void main(String[] args) 
	{
		int i;
		int [] arr = new int [10];//聲明數組并指派開辟空間
		System.out.println("數組長度是: "+arr.length);//輸出數組長度
		for (i=0;i<10;i++)//輸出數組的元素内容。
		{
			System.out.print("a["+i+"]="+arr[i])+",");
			if (i%2==1)//控制列印行數,每行列印2個元素
			{
				System.out.println();
			}
		}
	}
}
運作結果:數組長度是:10
a[0] =0;a[1]=0;
a[2] =0;a[3]=0;
a[4] =0;a[5]=0;
a[6] =0;a[7]=0;
a[8] =0;a[9]=0;
           

上述代碼聲明了一個整型數組arr并用new運算符為其配置設定空間,其元素個數為10,然後利用for循環輸出數組内容。由于程式中沒有賦具體值,是以數組元素指向了int的預設值0,是以輸出為0。arr .ength代表數組的長度為10,也就說數組元素個數是10個。   二維數組的概念 二維數組可以看做是一種特殊的一維數組,即數組中的元素全部是一維數組 二維數組中儲存的一維數組必須結構相同,即儲存的數組存儲的資料類型必須完全相同 二維數組的長度僅僅表明其中儲存的一維數組的數量,并不能限制其中儲存的一維數組的長度   二維定義格式: 聲明有3種: 資料類型   數組名[ ] [ ] 或者資料類型 [ ] [ ]  數組名 或者資料類型[ ]  數組名[ ]   它可以是簡單的資料類型,也可以是複合類型,和一維數組一樣,兩個“[ ]”中都必須是空的。二維數組的合法聲明形式: int a [ ] [ ];      double  [ ] [ ] b; myClass [ ]  c [ ]; 初始化: 二維數組的初始化同一維數組一樣,在聲明數組的同時為資料元素賦初值: 二維數組聲明的方式和一維數組類似,記憶體的配置設定也一樣用new這個關鍵字。與一維數組不同的是,二維數組在配置設定記憶體時,必須告訴編譯器二維數組的行與列的個數,“行的個數”是告訴編譯器所聲明的數組多少行(行指的是一維數組的個數);“列的個數”則是說明該數組有多少列(一個一維數組中有多少個元素);例如: int a [ ] [ ] = new int [4] [6];  z這裡建立了一個4行6列的整型二維數組a,它仍然由4個一維數組組成,每個一維數組的長度都是6。 格式 2 : • 資料類型 [] [] 數組名 =  new  資料類型 [ 長度 ] [ 長度 ]; • int [][] arr = new int [4][5]; • double  [][] arr1 = new double[5][10];   格式 3 : • 資料類型 [][]  數組名 = new  資料類型 [][]{{ 數組元素清單 1},{ 數組元素清單 2},……}; • int [][] arr = new int [][]{{1,3},{7,9}}; • long[][]arr1 = new long[][] {{2,4},{6L,8},{10L,12L}};   格式 4 : • 資料類型 [][]  數組名 = {{ 數組元素清單 1}, { 數組元素清單 2},……};  不能分開指派 • int [][]  arr = {{1,3},{5,7}};   格式 5 : • 資料類型 [][]  數組名 = new 資料類型 [ 長度 ][]; • 數組名 [ 索引 ] = new 資料類型 [ 長度 ]; • 先對二維數組外層數組的長度進行初始化,然後再對其中儲存的資料即内層一維數組進行單獨初始化 • 使用此格式可以建立出特殊的二維數組,即其中儲存資料的一維數組長度均不相同 • 此格式更有利于對現實生活中的資料進行描述     !注意: 由于二維數組可以看作是一維數組的數組,是以數組的記憶體空間不一定是連續的,是以不要求二維數組中每一維的大小必須相同。  

引用 :

Java是通過以下方式來引用二維數組的元素的,引用形式為;

數組名 [行号] [列号]      例如:

n = a[3][4];   表示要通路二維數組a的第4個一維數組中的第5個元素,如果要通路是以元素中的第一個應該這麼些:n = a[0] [0];

如果要直接通路是以元素中的最後一個,要這麼寫:

r = a.length-1;

c1 =a[r].length-1;

k = a[r] [c1];

!注意:不管在多元數組中還是在一維數組中,下标都是從0開始到數組的長度-1為止

數組名.length     //取得數組的行号即一維數組的個數。

數組名[行的索引].length  //取得特定行元素的個數即指定的一維數組内的元素的個數。

下面是關于二維數組使用方法的程式:

class  ArrayClass_2
{
	public static void main(String[] args) 
	{
		int i,j,sum=0;
		int score[][]={{60,70,85,45},{89,78,86,66},{56,84,76,91}};//聲明數組并設定初值

		for (i=0;i<score.length;i++ )
		{
			sum = 0;
			System.out.println("第"+(i+1)+"個人成績為:");
			for (j=0;j<score[i].length ;j++)
			{
				System.out.println(score[i][j]+" ");//輸出個人單科成績
				sum+=score[i][j];//計算總成績
			}
				System.out.println("總成績為: "+sum);
		}
	}
}
運作結果:
第1個人的成績為:60 70 85 45 總成績為:260
第2個人的成績為:89 78 86 66 總成績為:319
第3個人的成績為:56 84 76 91 總成績為:307
           

上面這段程式利用整數變量i、j作為外層循環與内層循環控制變量及數組的下标,變量i控制行的個數,變量j控制一行中列的個數;而sum則用來存放是以數組元素的和,也就是總成績。

數組最值

數組的最值可通過對數組中元素周遊,逐一比對,最終找到數組元素的最值 在進行數組最值的求解過程中,盡量避免使用固定值對數組元素進行比對,避免出現特殊值影響最終結果,可以改變資料儲存的方式,使用索引作為儲存的資料,完成求最值元素對應的下标的形式來避免上述問題

class ArrayDemo2{
	public static void main(String[] args){
		//數組求最值
		
		//思路
		//兩兩相比,留一個大的,再與下面的所有的
		//數重複兩兩相比,直到所有的數字全部比完
		
		int[] arr = {4,2,6,8,11,3,9};
		int max = 0;
		//周遊數組,使用每一個元素與max相比
		//如果比較的值比max小,跳過
		//如果比較的值比max大,将max改成比較的值
		//對數組循環完畢後,max就是最大值
		for(int i = 0;i<arr.length;i++){
			if(max<arr[i]){
				max = arr[i];
			}
		}
		System.out.println(max);
}	
           

數組排序

數組排序是數組的常用操作,數組排序方式有多種 • 冒泡排序法  交換排序法  選擇排序法 • 插入排序法  基數排序法   希爾排序法 • 快速排序法   歸并排序法   堆排序法

 選擇排序

選擇排序法是将原始數組空間分為兩個部分,第一部分用于存放已經排序完成的資料,第二部分用于存在未完成排序的資料 排序過程中,每次從未完成排序

  的區域中找出最大/小值并将其放

  置到未完成排序區域的首位,然

  後改變兩個區域的空間大小,并

  反複上述過程,直到未排序區隻

  有一個資料

/*
數組的排序
選擇排序法
選擇排序法改良
*/
class SortDemo2{
	public static void main(String[] args){
		/*
		int[] arr = {4,26,51,38,3,45,69,87,70,92};
		
		for(int x = 0 ; x<arr.length -1 ;x++){
			//一輪
			//使用第一個作為參考值,然後與後面的每個元素進行比較,大就換
			for(int i = x+1 ;i<arr.length;i++){
				if(arr[x]>arr[i]){
					int temp = arr[x];
					arr[x] = arr[i];
					arr[i] = temp;
				}
			}
		}
		
		for(int i = 0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
		*/
		int[] arr = {4,26,51,38,3,45,69,87,70,92};
		
		//一輪
		//設定0号為參考值
		for(int x = 0;x < arr.length-1;x++){
			int temp = x;
			//使用參考值與1号比,誰大誰做參考值
			for(int i = x+1; i < arr.length ;i++){
				if(arr[temp]<arr[i]){
					temp = i;
				}	
			}
			//交換
			//0位置與temp位置交換
			int temps = arr[x];
			arr[x] = arr[temp];
			arr[temp] = temps;
		}
		
		for(int i = 0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
		
		
	}
}
           

冒泡排序

冒泡排序法是較為常用的排序方法,日常生活中大多數的排序方案均為冒泡排序法 排序過程中,使用第一個元素與第二個元素

  進行比較,并将其較大/小的放在後面,然後

  使用第二個與第三個元素進行比較,重複上

  述操作,當數組周遊一輪時,最大/小的元素

  将置于數組末端;第二輪,改變周遊數組範

  圍,從第一個元素到倒數第二個元素,對其

  進行上述操作;第三輪對第一個元素到倒數

  第三個元素進行上述操作,如此反複,最終

  對數組實作排序

class SortDemo{//冒泡排序法
	public static void main(String[] args){
		
		int[] arr = {4,2,6,1,8,3,5,9,7,0};
		//找出最大的,把最大的放到隊尾
		for(int i = 1 ;i<= arr.length - 1;i++){
			for(int j = 0;j<arr.length - i;j++){
				//比較兩個相鄰的資料,如果前面的大,交換位置
				if(	arr[j] > arr[j+1]){
					//資料交換
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
		for(int i = 0;i<arr.length;i++){
			System.out.println(arr[i]);
		}
	}
}		
           

減少排序過程中資料移動次數

排序過程中需要進行大量的元素位置對調的操作,這一操作将開銷大量的運算時間,通過添加額外的資料存儲區域,可以減少資料移動操作次數,此操作思想與求最值操作過程中使用的額外變量具有相同的功效

數組元素查找

數組中元素衆多,最快速度的查找出需要的資料成為數組操作中的一個重要操作,常用查找方式如下 二分法查找  索引查找法  哈希查找法 二分法查找 二分法查找又名折半查找法,首先要保障要查詢的資料是有序的,然後與資料總量一半位置處的資料進行比對,以升序排列為例,如果比對的結果發現查找資料比比對資料大,則在後半段再次重複上述操作,直到找到最終的資料。如果原始資料中不包含要查找的資料,資料查找将失敗,通常傳回一個固定的值 -1 作為查找失敗的結果。

/*
二分法查找

*/
class QueryDemo{
	public static void main(String[] args){
		//查找得到的一定是對應所在的位置
		int num = 9;
		int[] arr = {1,2,3,4,5,6,7,8,9};
		
		int min = 0;
		int max =	arr.length-1;
		
		while(min<max){
			//比對值對應的索引
			int mid = (min+max)/2;
			//使用你要查找的資料域要比對的索引上的資料進行比對
			if(num > arr[mid]){
				//min要移動到mid+1,max不動
				min = mid + 1;
			}else if(num < arr[mid]){
				//max要移動到mid-1,min不動
				max = mid - 1;
			}else{
				System.out.println(mid);
				break;
			}
		}	
	}
}
           

關于數組暫時總結出這些,歡迎各位批評指正! 

 ----------------- android教育訓練、java教育訓練、期待與您交流!------------------

 詳細請檢視:http://edu.csdn.net