黑馬程序員——數組

-------android培訓、java培訓、期待與您交流! ----------

一、數組的定義

概念:  同一種類型數據的集合,其實數組就是一個容器。、

好處:可以自動給數組中的元素從0開始編號,方便操作這些元素。

數組的格式

格式1:元素類型 [ ]數組名 = new 元素類型 [元素個數或數組長度] ;

                  如: int []  arr = new int [3];  也可以寫成: int arr[] = new int[3];

        格式2:元素類型 []數組名 = new 元素類型 [ ]{元素1,元素2,…};

                   如: int []  arr = new int []{1,2,3,4,5};

        還有一種簡寫的靜態初始化格式:如: int [] arr={1,2,3,4,5};

        其中:new是用來在堆內存中產生一個容器實體。


二、內存結構

  Java程序在運行時,需要在內存中的分配空間。爲了提高運算效率,有對空間進行了不同區域的劃分,因爲每一片區域都有特定的處理數據方式和內存管理方式。

棧內存:用於存儲局部變量,當數據使用完,所佔空間會自動釋放。

        堆內存:1、數組和對象,通過new建立的實例都存放在堆內存中。

                      2、每一個實體都有內存地址值。

                      3、實體中的變量都有默認初始化值。

                      4、實體不在被使用,會在不確定的時間內被垃圾回收器回收。

方法區、本地方法去、寄存器後面再詳談,此地不多做介紹。


三、數組操作中常見的問題

1、數組腳標越界異常(ArrayIndexOutOfBoundsException)。例:

             int[] arr = new int[2];

              System.out.println(arr[3]);

            訪問到了數組中的不存在的腳標時發生。

    2、空指針異常(NullPointerException)。例:

            int[]arr = null;

             System.out.println(arr[0]);

             arr引用沒有指向實體,卻在操作實體中的元素時。


四、數組常見操作

1、 數組排序:

        常見的排序方式:冒泡排序和選擇排序。在Java已經定義好了一種排序方式,在開發使用中,直接調用即可。排序的方式有很多,其中最快的排序方式爲希爾排序。

下面是我自己敲的選擇和冒泡兩種排序方式的程序:

        選擇排序程序:

[java] view plaincopy
  1. //使用選擇排序方式對指定的數組進行排序  
  2.   
  3. class  Demo  
  4. {  
  5.     public static void main(String[] args)   
  6.     {  
  7.         int[] arr= {1,11,5,3,9,55,23,67,18};  //輸出原數組  
  8.         printArray(arr);  
  9.         selectSort(arr);  //調用排序方法 
  10.         printArray(arr);  //輸出排序後的數組 
  11.     }  
  12.       
  13. /* 
  14. 選擇排序 
  15. 1、先用0角標上的元素依次與其他元素進行比較,將較小值元素存放到0角標。 
  16. 2、然後再拿1角標上的元素依次進行比較,以此類推。 
  17. */  
  18.     public static void selectSort(int[] arr)  
  19.     {  
  20.         //外循環遍歷數組  
  21.         for (int x=0;x<arr.length-1;x++)  
  22.         {  
  23.             //內循環比較大小  
  24.             for (int y=x+1;y<arr.length;y++)  
  25.             {  
  26.                 //如果後一個元素比拿去比較的元素大,就交換兩元素位置  
  27.                 if(arr[x]>arr[y])  
  28.                 {  
  29.                     //arr[x]=arr[y];  
  30.                     //arr[y]=temp;  
  31.                     swap(arr,x,y);  
  32.                 }     
  33.             }  
  34.         }  
  35.     }  
  36.   
  37.     //遍歷數組  
  38.     public static void printArray(int[] arr)  
  39.     {  
  40.         System.out.print("[");  
  41.         for (int x=0;x<arr.length;x++)  
  42.         {  
  43.             if(x!=arr.length-1)  
  44.                 System.out.print(arr[x]+",");  
  45.             else  
  46.                 System.out.print(arr[x]+"]");  
  47.         }  
  48.         //換行  
  49.         System.out.println();  
  50.     }  
  51.   
  52.     //互換方法  
  53.     public static void swap(int[] arr,int a,int b)  
  54.     {  
  55.         arr[a]=arr[a]^arr[b];  
  56.         arr[b]=arr[a]^arr[b];  
  57.         arr[a]=arr[a]^arr[b];  
  58.     }  
  59. }  

 輸出結果:

         

 

冒泡排序程序:

[java] view plaincopy
  1. //使用冒泡排序方式對指定程序進行排序  
  2.   
  3. class Demo1   
  4. {  
  5.     public static void main(String[] args)   
  6.     {  
  7.         int arr[]={22,63,89,13,6};  
  8.         //打印原數組  
  9.         printArray(arr);  
  10.         //調用排序方法  
  11.         bubbleSort(arr);  
  12.         //打印排序後的數組  
  13.         printArray(arr);  
  14.     }  
  15.   
  16.     /* 
  17.     冒泡排序 
  18.     1、先從頭角標相鄰兩個元素之間進行比較,將較大值存放在後一個元素中,然後再與後一個元素的進行比較,直至最大值存放到最後一個元素中。 
  19.     2、再重複1操作,每次計較次數減一,一圈比完後存放的較大元素不再參與比較。 
  20.     */  
  21.   
  22.     public static void bubbleSort(int[] arr)  
  23.     {  
  24.         for (int x=0;x<arr.length-1;x++)  
  25.         {  
  26.             for (int y=0;y<arr.length-1-x;y++)//-x:讓沒每一次比較的元素減少。-1:避免角標越界。  
  27.             {  
  28.                 if(arr[y]>arr[y+1])  
  29.                     swap(arr,y,y+1);  
  30.             }  
  31.         }  
  32.     }  
  33.     //遍歷數組  
  34.     public static void printArray(int[] arr)  
  35.     {  
  36.         System.out.print("[");  
  37.         for (int x=0;x<arr.length;x++)  
  38.         {  
  39.             if(x!=arr.length-1)  
  40.                 System.out.print(arr[x]+",");  
  41.             else  
  42.                 System.out.print(arr[x]+"]");  
  43.         }  
  44.         //換行  
  45.         System.out.println();  
  46.     }  
  47.   
  48.     //互換方法  
  49.     public static void swap(int[] arr,int a,int b)  
  50.     {  
  51.         arr[a]=arr[a]^arr[b];  
  52.         arr[b]=arr[a]^arr[b];  
  53.         arr[a]=arr[a]^arr[b];  
  54.     }  
  55. }  

 輸出結果

 

2、 折半查找

程序:

[java] view plaincopy
  1. /* 
  2. 需求:將一個已知元素插入到一個有序數組中,要求不改變數組順序,打印元素應該插入數組位置的角標。 
  3. 思路:1、可以利用折半查找的方式,先定義兩個變量,一個初始化0角標,作爲最小值,一個初始化爲最後一個角標,作爲最大值, 
  4.         再定義一個變量,存儲最小值與最大值的一半,也就是中間位置,然後將已知元素與中間值位元素進行比較。 
  5.       2、如果比中間值元素大,則將最小值變爲中間值加1,繼續取最小值與最大值的中間值元素與已經元素進行比較,以此反覆 
  6.       3、如果比中間值元素小,則將最大值變爲中間值減1,繼續取最小值與最大值的中間值元素與已經元素進行比較,以此反覆 
  7. */  
  8. class  HalfSearch  
  9. {  
  10.     public static void main(String[] args)   
  11.     {  
  12.         int[] arr={2,6,9,11,15,19,22,30};  
  13.         //打印數組  
  14.         printArray(arr);  
  15.         int key=20;  
  16.         //用第一種折半方式輸出插入的角標值  
  17.         System.out.println("當key=20在數組arr中插入的角標位置是:"+halfSearch1(arr,key));  
  18.         key=1;  
  19.         //用第二種折半方式輸出插入的角標值  
  20.         System.out.println("當key=1在數組arr中插入的角標位置是:"+halfSearch2(arr,key));  
  21.     }  
  22.   
  23.     //折半查找<一>  
  24.     public static int halfSearch1(int[] arr,int key)  
  25.     {  
  26.         int min=0,max=arr.length-1,mid=(max+min)/2;  
  27.         while(key!=arr[mid])  
  28.         {  
  29.             if(min>max)  
  30.                 return min;  
  31.             else if(key>arr[mid])  
  32.                 min=mid+1;  
  33.             else   
  34.                 max=mid-1;  
  35.             mid=(max+min)>>>1;//折半操作             
  36.         }  
  37.         return mid;   
  38.     }  
  39.   
  40.     //折半查找<二>  
  41.     public static int halfSearch2(int[] arr,int key)  
  42.     {  
  43.         int min=0,max=arr.length-1,mid;  
  44.   
  45.         while(min<max)  
  46.         {  
  47.             mid=(max+min)>>>1;//折半操作  
  48.             if(key>arr[mid])  
  49.                 min=mid+1;  
  50.             else if(key<arr[mid])  
  51.                 max=mid-1;  
  52.             else  
  53.                 return mid;  
  54.         }  
  55.         return min;   
  56.     }  
  57.   
  58.     //遍歷數組  
  59.     public static void printArray(int[] arr)  
  60.     {  
  61.         System.out.print("[");  
  62.         for (int x=0;x<arr.length;x++)  
  63.         {  
  64.             if(x!=arr.length-1)  
  65.                 System.out.print(arr[x]+",");  
  66.             else  
  67.                 System.out.print(arr[x]+"]");  
  68.         }  
  69.         //換行  
  70.         System.out.println();  
  71.     }  
  72. }  

運行結果:

 

3、 進制轉換

十進制轉換爲二進制、八進制、十六進制的小程序:

[java] view plaincopy
  1. /* 
  2. 使用查表法將十進制轉換爲二進制、八進制、十六進制 
  3. */  
  4. class  Conversion  
  5. {  
  6.     public static void main(String[] args)   
  7.     {  
  8.         int num=60;  
  9.   
  10.         toBin(num);  
  11.   
  12.         toOct(0);  
  13.   
  14.         toHex(-num);  
  15.     }  
  16.   
  17.     //轉換爲二進制  
  18.     public static void toBin(int num)  
  19.     {  
  20.         conversion(num,1,1);  
  21.     }  
  22.   
  23.     //轉換爲八進制  
  24.     public static void toOct(int num)  
  25.     {  
  26.         conversion(num,7,3);  
  27.     }  
  28.   
  29.     //轉換爲十六進制  
  30.     public static void toHex(int num)  
  31.     {  
  32.         conversion(num,15,4);  
  33.     }  
  34.     //轉換  
  35.     public static void conversion(int num,int diwei,int yiwei)  
  36.     {  
  37.         //如果num等於0,結果輸出爲0  
  38.         if(num==0)  
  39.         {  
  40.             System.out.println("num="+0);  
  41.             return;  
  42.         }  
  43.         //定義一個包含二進制、八進制、十六進制的表  
  44.         char[] chs={'0','1','2','3','4','5','6','7',  
  45.                     '8','9','A','B','C','D','E','F',};  
  46.   
  47.         //定義一個臨時容器  
  48.         char[] arr=new char[32];  
  49.   
  50.         //定義一個操作數組的指針  
  51.         int pos=arr.length;  
  52.   
  53.         //利用與低位最大值的方式取出低位,存到臨時數組中  
  54.         while(num!=0)  
  55.         {  
  56.             arr[--pos]=chs[num&diwei];//--pos倒着往臨時容器裏存  
  57.             num >>>=yiwei; //無條件右移相應位數  
  58.         }  
  59.           
  60.         //打印轉換後的結果  
  61.         for(int x=pos;x<arr.length; x++)  
  62.             System.out.print(arr[x]);  
  63.           
  64.         //換行  
  65.         System.out.println();  
  66.     }  
  67. }  

 輸出結果:


五、數組中的數組——二維數組[][]

也稱多維數組,這裏我們主要講二維數組。

        格式1 int[][] arr= new int[3][2];

        解釋:以上格式表示定義了名稱爲arr的二維數組。有3個一維數組,每一個一維數組中有2個元素。一維數組的名稱分別爲arr[0],arr[1],arr[2]。給第一個一維數組1腳標位賦值爲78寫法是:arr[0][1] = 78

        格式2 int[][] arr= new int[3][];

         注:此種格式中每個一維數組都是默認初始化值null

         格式3int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};//每一個一維數組中具體元素都初始化了。

注:一種特殊定義寫法:int[]x,y[]; x是一維數組,y是二維數組。



-------android培訓、java培訓、期待與您交流! ----------


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章