[Java笔记]day07

标签: Java  java

day07

review

  1. 一维数组的初始化

    int[] arr = new int[5];  // 动态初始化
    String[] arr1 = new String[]{"Tom", "Jerry", "Pony"};  // 静态初始化
    

    数组一旦初始化,其长度就是确定的。通过arr.length获取数组长度,且不可更改

  2. 二维数组的初始化

    int[][] arr = new int[3][4];  // 动态初始化1
    int[][] arr1 = new int[3][];  // 动态初始化2
    int[][] arr2 = new int[][]{{1, 2, 3}, {2, 3}, {4, 5, 7, 4}}; // 静态初始化
    
  3. 一维数组默认初始化值

    • 整型:0
    • 浮点型:0.0
    • char型:ASCII码的0或’\u0000’,而不是’0’
    • boolean型:false
    • 引用类型:null
  4. 二维数组内存解析

在这里插入图片描述

数组

  1. 复制

    • 虚假的复制
    // 这里假设arr1已经初始化 且 arr2.length = arr1.length
    int[] arr1, arr2;
    
    // 虚假的复制(实际上是数组变量的赋值)
    arr2 = arr1;  // 修改arr2,arr1也会改变,因为arr1和arr2指向的地址相同
    

在这里插入图片描述

  • 真正的复制

    // 真正的复制
    for (int i = 0; i < arr1.length; i++) {
        arr1[i] = arr2[i]; // 此时arr1和arr2指向的地址不同,修改arr2不会影响arr1的值
    }
    

在这里插入图片描述

  1. 反转

    // 原地反转
    // String[] arr2;
    for (int i = 0; i < arr2.length / 2; i++) {
        // swap:注意下标关系
        String temp = arr2[i];
        arr2[i] = arr2[arr2.length - 1 - i];
        arr2[arr2.length - 1 -i] = temp;
    }
    
  2. 查找

    • 线性查找

      String[] arr1 = new String[]{"JJ", "GG", "MM", "BB", "DD", "AA"};
      String dest = "BB";
      int index = -1;
      
      for (int i = 0; i < arr1.length; i++) {
          if (arr1[i].equals(dest)) {  // String判断相等用equals() 而非 == 
              index = i;
              break;
          }
      }
      
    • 二分查找

      前提:所要查找的数组必须有序

      int[] arr3 = new int[]{2, 5, 7, 8, 10, 12, 20, 25, 28};  // 有序
      int dest1 = 55;
      int index1 = -1;
      int left = 0;
      int right = arr3.length - 1;
      
      while(left <= right) {
          int mid = left + (right - left) >>> 1;  // (left + right) / 2, 防止越界
          if (arr3[mid] == dest1) {
              index1 = mid;
              break;
          } else if (dest1 < arr3[mid]) {
              right = mid - 1;
          } else {  // dest1 > arr3[mid]
              left = mid + 1;
          }
      }
      
  3. 冒泡排序

for (int i = 0; i < arr.length - 1; i++) {  // 共执行arr.length - 1轮
    for (int j = 0; j < arr.length - 1 - i; j++) {  // 第i轮比较 arr.length - 1 - i次
        if (arr[j] > arr[j + 1]) { 
            // swap
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}

Arrays工具类

  1. 操作数据的工具类,包括很多对数组操作的方法。导包java.util.Arrays
  2. 常见方法的使用
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
//1. boolean equals(int[] a, int[] a2):判断两个数组是否相等
boolean isEquals = Arrays.equals(arr1, arr2);
System.out.println(isEquals);

//2. String toString(int[] a):输出数组信息
System.out.println(Arrays.toString(arr1));

//3. void fill(int[] a, int val):将val的值填充到数组中
Arrays.fill(arr1, 10);

//4. void sort(int[] a):对数组进行排序
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));

//5. int binarySearch(int[] a, int key)
int[] arr3 = new int[]{-2, -5, 7, 8, 10, 12, 20, 25, 28};
int index = Arrays.binarySearch(arr3, 13);
if (index < 0) {  // 未找到时返回负值
    System.out.println("Not found");
} else {
    System.out.println(index);
}
  1. 源代码
//1. equals
public static boolean equals(int[] a, int[] a2) {
    if (a==a2)
        return true;
    if (a==null || a2==null)
        return false;

    int length = a.length;
    if (a2.length != length)
        return false;

    for (int i=0; i<length; i++)
        if (a[i] != a2[i])
            return false;

    return true;
}
//2. toString
public static String toString(int[] a) {
    if (a == null)
        return "null";
    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(a[i]);
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}
// 3. fill
public static void fill(int[] a, int val) {
    for (int i = 0, len = a.length; i < len; i++)
        a[i] = val;
}
// 4. sort
public static void sort(int[] a) {
    DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);  // 快排
}
// 5. binarySearch
public static int binarySearch(int[] a, int key) {
    return binarySearch0(a, 0, a.length, key);
}
    
private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {
    int low = fromIndex;
    int high = toIndex - 1;
	// 源码中的二分查找
    while (low <= high) {
        int mid = (low + high) >>> 1;  // ?
        int midVal = a[mid];

        if (midVal < key)
            low = mid + 1;
        else if (midVal > key)
            high = mid - 1;
        else
            return mid; // key found
    }
    return -(low + 1);  // key not found.  // 负值
}

数组常见异常

  1. 数组角标越界异常:ArrayIndexOutOfBoundsException

    • 检查数组下标范围是否介于[0, arr.length - 1]
  2. 空指针异常:NullPointerException

    • 数组未初始化
    • 通过指向null的对象调用方法
版权声明:本文为weixin_42580646原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42580646/article/details/109396686