1. 程式人生 > >java基礎學習之函式、陣列

java基礎學習之函式、陣列

1、函式

1、函式的定義
函式是定義在類中有特定功能的一小段程式,也稱方法。定義格式:
修飾符 返回值型別 函式名(引數型別 形式引數1,引數型別 形式引數2, )
{
執行語句;
return 返回值;
}
2、功能
定義函式可以對功能程式碼進行封裝,提高程式碼的複用性,減少程式碼的重複度,提升程式的可讀性。函式只有被呼叫時才會執行。
3、函式的過載
同一個類中可以允許出現同一個函式名的多個函式,只要他們的引數不同即可,函式過載即是函式名相同,引數不同,引數的順序不同也叫做引數不同。
過載例項:

//返回兩個整數的和
int add(int x,int y){return
x+y;} //返回三個整數的和 int add(int x,int y,int z){return x+y+z;}

下面這一句不是過載:

double add(int x,int y){return x+y;}

在同一個類中函式名引數相同,但是返回值不同,這個會引起混亂,是不允許存在於一個類中的。

2、一維陣列

1、定義方法

int[] arr = new int[5];
int[] arr1 = {1,2,3};
int[] arr2 = new int[]{1,2,3};
int arr3[] = new int[3];

這四種方法都可以。
2、記憶體分配
如果這個陣列是在方法中定義一句int[] arr = new int[5];,那麼他的記憶體分配如下:
這裡寫圖片描述


並且預設情況下,陣列元素的值為0,記憶體是連續的。
3、常見異常
①、越界

int[] arr = new int[5];
System.out.println(arr[5]);

②、空指標

 int[] arr = null;
 System.out.println(arr[5]);

4、獲取最值

           public int getMax(int[] arr){
            int max = arr[0];
            for (int i = 1; i < arr.length; i++) {
                if
(arr[i]>max) //最小值這裡改為小於就可以 max = arr[i]; } return max; }

5、簡單排序(從小到大)
①、選擇排序(將小的放在前面)
思路:從第一個數開始,不停與後面的數比較,隨小就放在第一位,然後類似的第二個數,直到倒數第二個數與最後一個數比完後,排序完成。

     public static void sort1(int[] arr){
        //從第一個數到倒數第二個數
        for (int i = 0,temp = 0; i < arr.length-1; i++) {
          //與後面一個數到最後一個數比較
            for (int j = i+1; j < arr.length; j++) {
                if(arr[i] > arr[j]){
                //順序交換
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }

②、氣泡排序(將大的放在後面)
思路:從標號0開始將前一個數和後一個數比較,大的放後面,然後標號加1,再比,比到最後兩個一輪結束,然後從標號0開始比到倒數第二個和倒數第三個。。。。最後從標號0開始和標號1比,比完排序完成

    public static void sort2(int[] arr){
        for (int i = 0,temp =0 ; i < arr.length-1; i++) {
            for (int j = 0; j <arr.length - i - 1 ; j++) {
                if(arr[j]>arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }

6、進位制轉化(將十進位制轉化為其他進位制並且用陣列儲存)
思路:寫一個對映表,包含了字元0到字元A總共16個字元,對於二進位制每次與上1取出最後一位,儲存這個位到陣列,然後右移一位,繼續與,整個過程通過迴圈實現,迴圈結束的條件是十進位制的數為0.對於轉八進位制和十六進位制的思路一樣,只是十六進位制每次與15,右移4位,八進位制與7,右移三位。

  public static void changeSystem(int num,int base,int offset){
        char[] cc = new char[32];
        int i = 0;
        //當需要轉化的數不為0 
        while(num != 0){
        //儲存對應的位
            cc[i++] = table[num&base];
            //將這個數右移
            num = num >>>offset;
        }
        for (int j= i-1; j >= 0; j--) {
            System.out.println(cc[j]);
        }
    }
    //轉二進位制
    public static void toBinary(int num){
        changeSystem(num,1,1);
    }
    //轉十六進位制
    public static void toHex(int num){
        changeSystem(num,15,4);
    }
    //轉八進位制
    public static void toOctal(int num){
        changeSystem(num,7,3);
    }

7、折半查詢
思路:用三個變數儲存標號,一個是min初始指向0,一個值max預設指向最後一個數,mid等於min+max的和的一半,然後迴圈中不同比較要找的值和mid指向的值是否相等,相等就返回,大於min的標號等於mid右移一位,再算mid比,如果小於就將max指向mid左邊一位,再比,等到min的值大於max的時候,迴圈退出。

   public static int indexOfValue(int num,int[] arr){
        int max = arr.length - 1;
        int min = 0;
        int mid = (max + min)/2;
        //min小於max才比較,否則退出,
        while(min <= max){
            if(num > arr[mid]){
                min = mid + 1;
                mid = (max + min)/2;
            }else if (num <arr[mid]) {
                max = mid - 1;
                mid = (max + min)/2;
            }else {
                return mid;
            }
        }
        return -1;
    }

8、折半查詢可以用於有值要插入到有效數組裡面求插入位置的情況
思路:利用上面的折半查詢,如果插入的值原來的數列有,那麼直接返回mid即可,如果沒有就返回min舉個例子,在3和5之間插入4,這個時候,min和max都指向了3,那麼4和三比大於,那麼min加1,退出迴圈,這個時候的min正好就是需要標號:

  public static int getIndexOfInsert(int num,int[] arr){
        int max = arr.length - 1;
        int min = 0;
        int mid = (max + min)/2;
        while(min <= max){
            if(num > arr[mid]){
                min = mid + 1;
                mid = (max + min)/2;
            }else if (num <arr[mid]) {
                max = mid - 1;
                mid = (max + min)/2;
            }else {
                return mid;
            }
        }
        return min;
    }

2、二維陣列

1、定義格式
二維陣列其實就是陣列中的陣列,一個數組有三個格子,然後每個格子裡面又存了一個數組。
定義格式:

int[][] arr = new int[3][2];
int[][] arr = new int[3][];
int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};

除了這三格式外,還可以將前面的[]任意移動如:int[] arr[] int arr[][]都可以。
第一種定義方法表示定義了一個二維陣列,三行兩列,第二個定義方法是定義了一個二維陣列,三行,列還沒有定義,也就是,這個二維陣列分為三個一位陣列,arr[0] 指向null,arr[1],指向null,arr[2]指向null;第三種情況表示,arr[0] = {3,8,2},arr[1]={2,7},arr[2]={9,0,1,6}.
2、記憶體分配
這裡寫圖片描述