陣列,陣列類,SyStem類

不會翹腚的皮柒柒發表於2020-09-23

陣列:

什麼是陣列

  • 陣列是具有相同的資料型別且按照一定的次序排列的一組變數的集合體。
  • 用一個變數來表示一組資料。
  • java中陣列在記憶體中分配一段連續的空間,這段空間中儲存資料的個數是固定的

陣列的特點

  • ​ 陣列是序排列的
  • ​ 陣列屬於引用資料型別的變數。陣列的元素,既可以是基本資料型別,也可以是引用資料型別
  • ​ 建立陣列物件會在記憶體中開闢一整塊連續的空間
  • ​ 陣列的長度一旦確定,就不能修改。

使用陣列的步驟

  • 定義陣列
  • 為陣列分配記憶體
  • 陣列元素初始化
  • 使用

一維陣列的宣告與初始化

  • int num;//宣告

    num = 10;//初始化

    int id = 1001;//宣告 + 初始化

  • int[] ids;//宣告

    //1.1 靜態初始化:陣列的初始化和陣列元素的賦值操作同時進行

    ids = new int[]{1001,1002,1003,1004};

    //1.2動態初始化:陣列的初始化和陣列元素的賦值操作分開進行

    String[] names = new String[5];

    int[] arr4 = {1,2,3,4,5};//型別推斷

分配記憶體

  • 通過 new 來為陣列分配記憶體空間

    陣列名 = new 資料型別[陣列長度]; eg: nums = new int[10];

    資料型別[] 陣列名 = new 資料型別[陣列長度]; eg: int[] nums = new int[10];

  • 注意:陣列的長度一旦指定,就不能改變了

陣列的屬性

  • array.length
  • 說明:陣列一旦初始化,其長度就是確定的。arr.length陣列長度一旦確定,就不可修改。

遍歷輸出陣列元素

//for迴圈遍歷陣列
for(int i = 0; i < nums.length; i ++){ 
	System.out.println(nums[i]); 
}
//for-each用法
for(int i : nums){ 
	System.out.prinln(i); 
}

for-each

		/*
		 *  for-each  陣列可以使用for-each迴圈
		 *  
		 *  for(變數 : 被迴圈的變數){ 
		 *  	// 程式碼塊
		 *  }
		 *  
		  *   每一次迴圈都會將 被迴圈的變數 的對應值賦值給 變數
		 */
		for(int num : nums) { // 可以理解為 for 迴圈中加入 int num = nums[i];
			System.out.println(num);
		}

陣列常見問題

  • 陣列下標越界

    java.lang.ArrayIndexOutOfBoundsException 原因是下標使用不正確,下標應是從0~陣列長度-

  • 空指標異常

    java.lang.NullPointerException 我們操作了一個為 null 的變數

  • 語法錯誤
    //因為宣告陣列時,是沒有陣列長度的。沒有這種寫法 
    	int array1[3] = new int[]{1,2,3}; 
    //在陣列宣告時要有陣列標識[],下面這種宣告是宣告一個int型別的變數。 
    //在初始化時,陣列的長度是根據初始化的情況來定的,不需要指定長度 
    	int array2 = new int[3]{1,2,3}; 
    //直接初始化陣列,必須與宣告寫在一起 
    	int array3[]; 
    	array3 = {1,2,3};
    

氣泡排序

/**
* 升序氣泡排序 
* @param nums */ 
  public static void bubbleSort(int[] nums) { 
  //控制排序次數 
  for (int i = 0; i < nums.length - 1; i++) { 
      for (int j = 0; j < nums.length - 1 - i; j++) { 
          //如果前邊的數大於後邊的數,交換位置 
          if(nums[j] > nums[j + 1]) { 
              //定義臨時變數儲存值 
              int temp = nums[j]; 
              nums[j] = nums[j + 1]; 
              nums[j + 1] = temp; 
          } 
      } 
  } 
}

二維陣列

如何理解二維陣列?

  • 陣列屬於引用資料型別
  • 陣列的元素也可以是引用資料型別
  • 一個一維陣列A的元素如果還是一個一維陣列型別的,則,此陣列A稱為二維陣列

二維陣列的宣告與初始化

		//靜態初始化
		int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
		//動態初始化1
		String[][] arr2 = new String[3][2];
		//動態初始化2
		String[][] arr3 = new String[3][];
		//也是正確的寫法:
		int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
		int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};//型別推斷

二維陣列的遍歷

//將二維陣列遍歷成一維陣列 
for (int i = 0; i < nums1.length; i++) { 
//遍歷輸出一維陣列 
	for (int j = 0; j < nums1[i].length; j++) { 
		System.out.print(nums1[i][j] + ","); 
	}
    //換行
    System.out.println(); 
}

工具類 java.util.Arrays:static方法可以直接使用類名.方法名()呼叫

Arrays.equals(a, a2)

  • 判斷引用是否一致
  • 判斷是否為 null,對於 null 返回 false
  • 判斷陣列長度是否一致
  • 判斷陣列中每個元素是否一樣
System.out.println(Arrays.equals(nums, nums1)); // true

Arrays.toString(nums)

String result = "[";
		for (int i = 0; i < nums1.length; i++) {
			if(i == nums1.length - 1) {
				result = result + nums1[i] + "]";
			}else {
				result = result + nums1[i] + ", ";
			}
		}
//		
System.out.println(result);
//String str = Arrays.toString(nums);

println

		/*
		 * println(o)方法會執行 String.valueOf(o),
		 * String.valueOf(o)方法中會執行  o.toString()
		 *    型別名稱 + @ + hash值
		 */
  • 直接使用System.out.println(arr),得到的是 (型別名稱 + @ + hash值)一種地址值。

Arrays.sort(nums);

  • 排序

    Arrays.sort(nums);
    System.out.println("排序後: " + Arrays.toString(nums));
    

二分搜尋

  • 二分搜尋,必須先排序

    int index = Arrays.binarySearch(nums, 90);
    		
    System.out.println("90 在陣列中的下標是:" + index);
    

Arrays.fill(nums, 6)

  • 將陣列 nums 中的每個元素都填充為 6

    Arrays.fill(nums, 6);;
    System.out.println(Arrays.toString(nums));
    

複製陣列

int[] newArr = Arrays.copyOf(nums, nums.length);
System.out.println(newArr == nums); // false
System.out.println(Arrays.equals(nums, newArr)); // true
		
int[] newArr1 = Arrays.copyOf(nums, 4);
System.out.println(Arrays.toString(newArr1));
		
// 複製陣列的長度大於源陣列的長度的話,大於源陣列長度部分用陣列資料型別的預設值填充
int[] newArr2 = Arrays.copyOf(nums, 14);
System.out.println(Arrays.toString(newArr2));

System

  • ​ arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :將指定源陣列中的陣列從指定位置複製到目標陣列的指定位置

    ​ src 源陣列

    ​ srcPos 源陣列中的起始位置

    ​ dest 目標陣列

    ​ destPos 目的地資料中的起始位置

    ​ length 要複製的陣列元素的數量

    int[] src = {1, 2, 3, 4, 5};
    		int[] dest = new int[3];
    		System.arraycopy(src, 0, dest, 0, Math.min(src.length, dest.length));//
    		System.out.println(Arrays.toString(dest));
    		
    		// 將陣列中下標為 3 的元素刪除掉  {1, 2, 3, 5}
    		int[] nums = {1, 2, 3, 4, 5};
    		int[] result = new int[nums.length - 1];
    
    		// 先複製原陣列 result.length 位
    		result = Arrays.copyOf(nums, result.length);
    		// 1, 2, 3, 4
    		for (int i = 3; i < nums.length - 1; i++) {
    			result[i] = nums[i + 1];
    		}
    		
    		
    //		for (int i = 0; i < nums.length - 1; i++) {
    //			if (i >= 4) {
    //				// 跳過刪除元素
    //				result[i] = nums[i + 1];
    //			}else {
    //				// 被刪除元素之前 複製
    //				result[i] = nums[i];
    //			}
    //		}
    		System.out.println(Arrays.toString(result));
    

相關文章