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、記憶體分配