1. 程式人生 > >黑馬程式設計師——Java語言基礎之陣列

黑馬程式設計師——Java語言基礎之陣列

八、陣列

           1、定義:同一種資料型別的集合,其實質就是一個容器。

           2、好處:自動給陣列的元素從0開始編號,方便操作

           3、格式1: 元素型別[ ]  陣列名= new 元素型別 [元素的個數或者陣列的長度] ;

                                 eg:int  [ ]  arr= new int[4];  在記憶體中的儲存結構如下:

                     

    注意: int [ ] x代表在棧記憶體中定義陣列型別x;new代表在記憶體中產生一個容器實體,只要new就會產生開闢一個新的空間;int [] x=new int[4]中的”=“代表把堆記憶體的首地址賦值給x或者說是x引用這個陣列的。

  格式2: 元素型別[ ]  陣列名= new 元素型別{元素,元素,.......} ;  

              eg:int arr[]=new int[ ] {3,1,5,7}  ;   int arr[]={3,1,5,7};

4、棧和堆

        棧記憶體:資料使用完畢會自動釋放,棧存放的是區域性變。區域性變數包括定義在方法中的變數,定義在方法中引數上的變數和for迴圈裡的變數。         堆記憶體:new出來的實體或是物件。                            堆記憶體的特點:                     1)、每個實體都有記憶體地址值;                     2)、實體的資料都有預設初始值;                     3)  、垃圾回收機制。        垃圾回收機制GC:C++程式設計師需要手動呼叫功能清除垃圾,而在java中只要實體變成垃圾,虛擬機器便會自動啟動垃圾回收機制,將堆記憶體中不在使用的實體清除掉,而這種清除會不定時間處理。

5、陣列中常遇到的問題

          1)、.陣列下標越界異常:訪問到陣列中不存在的角標,                                                         java.lang.ArrayIndexOutOfBoundsException;           2)、空指標異常:當引用沒有任何指向值時,即陣列值為NULL,該引用還用於操作實體,                                              java.lang.NullPointerException

6、陣列的操作

        1)、獲取陣列中的元素,通常會用到遍歷,用for迴圈遍歷;         2)、陣列長度:陣列名.length;         3)、陣列獲得最大最小值;

7、陣列的排序方法

       1)、選擇排序:                  思想:找最小值或者是最大值的元素放在首位,以此類推。時間複雜度O(n*n),空間複雜度(1),排序過程如下:                                      核心演算法:
/**
選擇排序
1、選擇排序傳遞的是引用型別的陣列,改變的是堆記憶體,所以是無返回值型別void;
2、引數列表:傳遞要排序的陣列。
*/

  public static void SelectSort(int[] arr){
  
     for(int i=0;i<arr.length-1;i++){
	 
	   for(int j=i+1;j<arr.length;j++){
	   
	     if (arr[i]>arr[j])     // ‘>’代表從小到大排序,‘<’代表從大到小排序
	     {
			 int temp=arr[i];
			 arr[i]=arr[j];
			 arr[j]=temp;
	     }
	   }
	 }
  }
  2)、氣泡排序:             思想:相鄰兩個元素進行比較,如果符合條件換位。時間複雜度O(n*n),空間複雜度(1),排序過程如下:                         核心演算法:            
 public static void bubbleSort(int[] arr){
  
     for(int i=0;i<arr.length-1;i++){
	 
	    for(int j=0;j<arr.length-i-1;j++){ //-i:讓每一次比較元素減少,-1:避免角標越界
		
		  if (arr[j]>arr[j+1])     // ‘>’代表從小到大排序,‘<’代表從大到小排序
	      {
			 int temp=arr[j];
			 arr[j]=arr[j+1];
			 arr[j+1]=temp;
		  }
	    }
     }
  }
    

8、陣列的查詢

       1)、線性查詢:                  思       想:   從表頭開始,依次將每一個值與目標元素進行比較,找到返回其下標,如果到表尾還是沒有找到返回-1,表示查詢失敗;                  核心演算法程式碼如下:
/**定義一個功能:查詢陣列的值
 1、返回值為:int 找到返回元素元素所在的下標,不存在返回-1
 2、引數列表:傳遞陣列和要查詢的值
*/

 public static int arrCheck(int[] arr ,int key){
  
    for(int i=0;i<arr.length;i++){
	 
	  if(arr[i]==key){
	    return i;    //返回第一次出現key值的位置
	  }
	}
	return -1;
  }
    2)、折半查詢:能提高程式碼的執行效率,但要求程式碼有序。               思        想:首先,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置                                   記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表,重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到                                   子表不存在為止,此時查詢不成功。               核心程式碼如下:           
/**
 二分查詢:可以提高查詢的效率,但是要求陣列有序
 1、返回值型別:int 找到返回陣列下標,沒找到返回-1;
 2、引數列表:傳遞陣列和要查詢的數值。
*/
public static int halfSearch(int[] arr,int key){

     int min=0,max=arr.length-1,mid;
	 while (min<=max)  // min<=max代表要使最大值和最小值有距離
	 {
	   mid=(min+max)/2;
	   if(arr[mid]<key){     //如果中間值小於要找的值則要修改min下標
	      min=mid+1;
	   }else if(arr[mid]>key){ //如果中間值大於要找的值則要修改max下標
	      max=mid-1;
	   }else{
	      return mid;
	   }
	 }
	  return -1;
}

           

9、進位制之間的轉換

     1)、十進位制轉化成二進位制核心程式碼如下:
/**
十進位制轉化為二進位制
*/
  public static void toBin(int num){
  
    StringBuffer sb= new StringBuffer(); //定義StringBuffer容器來儲存轉換的之後的數
    while(num>0){
	 
	  sb.append(num%2); //把餘數裝到sb的容器中
	  num=num/2;    //做除二運算
	}
	System.out.println(sb.reverse()); //f通過reverse()的方法,逆序輸出
  }
     2)、十進位制轉換成十六進位制:         思想:通過查表法,將所有的元素通過陣列存臨時儲存起來,建立對應關係。每一次&15之後的值作為索引去查建立好的表,就可以找對應的元素,要比-10+‘A’簡單很多。本方法不管是正數還是負數都可以通過此方法操作求取十六進位制。
    核心程式碼的實現過程:
/**
  通過查表法獲得十六進位制
*/

 public static void toHex_2(int num){
   //先建立一個字元陣列把十六進位制的字元儲存起來
   char[] chs={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
   //建立一個字串陣列
   char[] arr=new char[8];
   //通過指標來控制元素的儲存
   int pos=arr.length;

    while(num!=0){
	  int temp=num&15;
	  arr[--pos] =chs[temp]; //將查詢到的資料存放在陣列當中
	  num=num>>>4;
	}
   for(int i=pos;pos<arr.length;pos++){
   
     System.out.print(arr[pos]);//輸出資料
   }
 }
   3)、通過查表把十進位制轉化成二進位制程式碼核心程式碼如下:
/**
通過查表法轉化成二進位制
*/
 public static void toBin_2(int num){
  
   //定義一個二進位制的表
   char[]chs={'0','1'};
   //定義一個臨時儲存容器
   char[] arr=new char[32];
   //定義指標來存取數組裡的數
   int pos=arr.length;

   while(num!=0){
    int temp=num&1;
	//查表儲存在臨時表裡面
    arr[--pos]=chs[temp];
    //右移一位
	num=num>>>1;
   }
   for(int i=pos;i<arr.length;i++){
    System.out.print(arr[i]);
   }
 }

10、二維陣列:把陣列作為一個元素,存到陣列當中,稱之為二維陣列

 1)、格式1:int[][] arr = new int[2][3];             含義:一維陣列中有2個一維數,每一個一維陣列中有3個元素,一維陣列的名稱分別為arr[0], arr[1], arr[2]。            儲存結構:          2)、格式2:int[][] arr = new int[3][];
                 含義:二維陣列中有3個一維陣列,每個一維陣列都是預設初始化值null,可以對這個三個一維陣列分別進行初始化。
                儲存結構:
     3)、格式3:int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};                 含義: 每一個一維陣列中具體元素也都已初始化,第一個一維陣列arr[0] = {3,8,2};,第二個一維陣列arr[1] = {2,7};,第三個一維陣列arr[2] = {9,0,1,6};,第三個                                一維陣列的長度表示方式:arr[2].length                 應用:二維陣列的求和,核心程式碼如下:
public class ArrayRep
{
  public static void main(String[] args){
  
   //用格式三初始化陣列
   int [][] arr={{1,2,3,4},{5,6},{7,8,9,10}};
    int sum=0;
	for(int i=0;i<arr.length;i++){ //行陣列
	 for(int j=0;j<arr[i].length;j++){ //列陣列
	   sum+=arr[i][j]; //求和
	 }
	}
    System.out.println("sum="+sum);
  }
}