1 數組的定義 2 數組的記憶體分配及特點 3 數組操作常見問題 4 數組常見操作 5 數組中的數組(二維數組) ...
1 數組的定義
- 概念:同一種類型數據的集合,其實數組就是一個容器。
- 數組的好處:可以自動的給數組中的元素從0開始編號,方便操作這些元素。
- 格式1:
- 元素類型[] 數組名 = new 元素類型[元素個數或數組長度];
- 格式2:
- 元素類型[] 數組名 = new 元素類型[]{元素1,元素2,……};
- 示例:
package java005; /** * 2017/9/3 * 說明:數組 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[5]; } }
- 示例:
package java005; /** * 2017/9/3 * 說明:數組 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[]{}; } }
- 示例:
package java005; /** * 2017/9/3 * 說明:數組 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[]{1,2,3}; } }
- 示例:
package java005; /** * 2017/9/3 * 說明:數組 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[5]; System.out.println(arr[0]); arr[1] = 59; for(int x = 0;x<arr.length;x++){ System.out.println(arr[x]); } } }
2 數組的記憶體分配及特點
- 記憶體的劃分:
- 寄存器
- 本地方法區
- 方法區
- 堆記憶體
- 棧記憶體
- 棧記憶體:存儲的都是局部變數,而且變數所屬的作用域一旦結束,該變數就自動釋放。
- 堆記憶體:存儲的數組和對象(其實數組就是對象)。
- 每一個對象都有一個首地址值。
- 堆記憶體中的每一個變數都有預設初始化值,根據類型的不同而不同。整數為0,小數是0.0,boolean類型是false,char類型是'\u0000'。
- 垃圾回收機制。
- 圖解:int[] arr = new int[5];
- ①main方法進棧
-
- ②main方法進入到棧中,執行main方法中的代碼,當執行到new int[5];的時候,在堆記憶體開闢了一段連續的空間,長度是5,並初始化堆中數組對象的預設值為對應類型的預設值,並分配堆中數組對象的記憶體地址。
-
- ③當將堆中地址賦值給左邊的arr變數的時候,arr就指向了堆中的數組對象。
3 數組操作常見問題
- ArrayIndexOutOfBoundsException
package java005; /** * 2017/9/3 * 說明:數組 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[5]; System.out.println(arr[5]); } }
- NullPointerException
package java005; /** * 2017/9/3 * 說明:數組 */ public class ArrayDemo { public static void main(String[] args) { int [] arr = new int[5]; System.out.println(arr[arr.length-1]); arr = null; System.out.println(arr[arr.length-1]); } }
4 數組常見操作
4.1 遍曆數組
package java005; /** * 2017/9/3 * 說明:數組 */ public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[]{1,2,3,4,5,6,7,8,9,0}; for(int x = 0 ;x<arr.length;x++){ System.out.print(arr[x] +"\t"); } } }
4.2 最值
package java005; /** * 2017/9/3 * 說明:求最值 */ public class ArrayDemo2 { public static void main(String[] args) { int[] arr = new int[]{1,11,33,-1,-10}; int max = max(arr); int min = min(arr); System.out.println("最大值是:"+max); System.out.println("最小值是:"+min); } /** * 求一個數組的最大值 * @param arr * @return */ public static int max(int[] arr){ if(arr.length == 0){ throw new RuntimeException("數組不能為空"); } int max = arr[0]; for(int x =0;x<arr.length;x++){ if(max < arr[x]){ max = arr[x]; } } return max; } /** * 求一個數組的最小值 * @param arr * @return */ public static int min(int[] arr){ if(arr.length == 0){ throw new RuntimeException("數組不能為空"); } int min = arr[0]; for(int x =0;x<arr.length;x++){ if(min > arr[x]){ min = arr[x]; } } return min; } }
4.3 選擇排序
package java005; /** * 2017/9/3 * 說明:選擇排序 */ public class ArraySortDemo { public static void main(String[] args) { int[] arr = {34,19,11,103,56}; //排序前 printArray(arr); //排序 sortArray(arr); //排序後 printArray(arr); } /** * 列印數組 * @param arr */ public static void printArray(int[] arr){ System.out.print("["); for(int x = 0;x<arr.length;x++){ if(x == (arr.length -1)){ System.out.print(arr[x] +"]"); }else{ System.out.print(arr[x] +"、"); } } } /** * 對數組進行排序 * @param arr */ public static void sortArray(int[] arr){ for(int x = 0;x< arr.length-1;x++){ for(int y = x+1;y<arr.length;y++){ if(arr[x] > arr[y]){ int temp = arr[y]; arr[y] = arr[x]; arr[x] = temp; } } } } }
4.4 冒泡排序
package java005; /** * 2017/9/4 * 說明:冒泡排序 */ public class ArraySortDemo2 { public static void main(String[] args) { int[] arr = new int[]{34,19,11,109,3,56}; //排序前 printArray(arr); sortArray(arr); //排序後 printArray(arr); } /** * 輸出數組中的每個元素 */ public static void printArray(int[] arr){ System.out.print("["); for (int x = 0;x<arr.length;x++){ if(x == arr.length-1){ System.out.println(arr[x] +"]"); }else{ System.out.print(arr[x]+"、"); } } } /** * 冒泡排序演算法 * @param arr */ public static void sortArray(int[] arr){ for(int x =0;x<arr.length -1;x++){ for(int y = 0; y<arr.length -1 -x;y++){ if(arr[y] > arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } }
4.5 找出數組中指定數值的位置
4.5.1 普通查找法
package java005; /** * 2017/9/4 * 說明:冒泡排序 */ public class ArraySortDemo2 { public static void main(String[] args) { int[] arr = new int[]{34,19,11,109,3,56}; int index = commonFindElementIndexByValue(arr,109); System.out.println("索引值是:"+index); } public static int commonFindElementIndexByValue(int[] arr,int value){ if(arr == null || arr.length == 0){ return -1; } for(int x =0;x<arr.length;x++){ if(value == arr[x]){ return x; } } return -1; } }
4.5.2 二分查找法(折半查找法)--必須先排序
package java005; /** * 2017/9/4 * 說明:二分查找法 */ public class BinarySearchDemo { public static void main(String[] args) { int[] arr = new int[]{34,19,11,109,3,56}; sort(arr); int index = binarySearch(arr,56); System.out.print("index:"+index); } /** * 排序 * @param arr */ public static void sort(int[] arr){ for(int x =0;x<arr.length -1; x++){ for(int y = 0; y<arr.length -1 -x;y++){ if(arr[y] > arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } /** * 二分查找法 * @param arr * @param value * @return */ public static int binarySearch(int[] arr,int value){ if(arr == null || arr.length ==0){ return -1; } int min = 0; int max = arr.length-1; int mid = (min + max) / 2; while(arr[mid] != value){ if(value > arr[mid]){ min = mid +1 ; }else if(value < arr[mid]){ max = mid - 1; } if(min > max){ return -1; } mid = (min + max) / 2; } return mid; } }
- 二分查找法,是有弊端的,如果當前數組不是排序過的,那麼返回的索引不是排序之前的索引值。
package java005; import javax.lang.model.element.VariableElement; /** * 2017/9/4 * 說明:二分查找法 */ public class BinarySearchDemo { public static void main(String[] args) { int[] arr = new int[]{34,19,11,109,3,56}; sort(arr); int index = binarySearch(arr,56); System.out.print("index:"+index); } /** * 排序 * @param arr */ public static void sort(int[] arr){ for(int x =0;x<arr.length -1; x++){ for(int y = 0; y<arr.length -1 -x;y++){ if(arr[y] > arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } /** * 二分查找法 * @param arr * @param value * @return */ public static int binarySearch(int[] arr,int value){ if(arr == null || arr.length ==0){ return -1; } int min = 0; int max = arr.length-1; int mid = 0; while(min < max){ mid = (min + max) >> 1; if(value > arr[mid]){ min = mid + 1; }else if(value < arr[mid]){ max = mid - 1; }else{ return mid; } } return -1; } }
5 數組中的數組(二維數組)