javaSE基础-数组

数组

数组的简述

1、数组:是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行同一管理

2、数组的相关概念:
数组名
元素
角标、下标、索引
数组的长度:元素的个数

3、数组的特点:
数组是序排列
数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型
创建数组对象会在内存开辟一块连续的空间
数组的长度一旦确定,就不可修改

4、数组的分类:
按维度:一维数组、二维数组。。。
按元素的类型:基本数据类型元素数组、引用数据类型元素数组

数组的使用

1、一维数组的初始化两种方式

int[] arr = new int[3]; //动态初始化
String[] arr2 = new String[]{"Mary", "Jerry", "Tim"}; // 静态初始化

注:数组一旦初始化,其长度不可变(arr.length),长度确定就不可修改。

2、二维数组初始化的两种方式

int[][] arr1 = new int[][]{{1,2,3},{45,67,89}}; // 静态初始化
int[][] arr2 = new int[3][4]; //动态初始化
int[][] arr3 = new int[3][];  //动态初始化

二维数组内外层的注意事项

image

数组定义格式
一维数组:int[] x 或者 int x[]
二维数组:int[][] y 或者 int[] y[] 或者 int y[][]

数组-1

3、遍历二维数组

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

for(int i=0; i<arr.length; i++){
	for(int j=0; j<arr[i].length; j++){
		System.out.print(arr[i][j] + "\t");
	}
	System.out.println();
}

4、不同类型的一维数组元素的默认初始化值

整型:0
浮点型:0.0
Boolean:false
Char:0 或 \u0000
引用类型:null

5、一维数组的内存解析

一维数组内存解析

6、二维数组的内存解析

二维数组内存解析

7、数组使用常见异常

  • 数组角标越界:ArrayIndexOutOfBoundsException
int[] arr = new int[]{1,2,3,4};
for (int i = 0; i <= arr.length; i++) {
	System.out.println(arr[i]); //报错:ArrayIndexOutOfBoundsException
}

System.out.println(arr[-1]); //报错:ArrayIndexOutOfBoundsException
  • 空指针异常:NullPointerException
//情况一
int[] arr2 = new int[]{1,2,3};
arr2 = null;
System.out.println(arr2[0]); //报错:NullPointerException

//情况二
int[][] arr3 = new int[4][];
System.out.println(arr3[0][0]); //报错:NullPointerException

//情况三
String[] arr4 = new String[]{"AA","B","C"};
arr4[0] = null;
System.out.println(arr4[0].toString()); //报错:NullPointerException

Arrays工具类的使用

java.util.Arrays类为操作数组的工具类,包含用来操作数组的各种方法

1、常用方法

Arrays工具方法

示例

public class ArraysTest {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1,22,33,44};
        int[] arr2 = new int[]{1,33,22,44};

        //equal()
        boolean b = Arrays.equals(arr1, arr2);
        System.out.println(b); //false

        //toString()
        System.out.println(Arrays.toString(arr1)); //[1, 22, 33, 44]

        //fill()
        Arrays.fill(arr1, 10);
        System.out.println(Arrays.toString(arr1)); //[10, 10, 10, 10]

        //sort():使用快排
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2)); //[1, 22, 33, 44]

        //binarySearch():使用二分查找
        int index = Arrays.binarySearch(arr2, 22);
        System.out.println("22在数组arr2索引位置" + index); //1
    }
}

2、数组基本操作 - 最大值、最小值、求和、平均值、复制、反转、排序、遍历、查找

click me
public class ArrayUtil {

    //求数组的最大值
    public int getMax(int[] arr) {
        int maxValue = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > maxValue) {
                maxValue = arr[i];
            }
        }
        return maxValue;
    }

    //求数组的最小值
    public int getMin(int[] arr) {
        int minValue = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (minValue > arr[i]) {
                minValue = arr[i];
            }
        }
        return minValue;
    }

    //求数组的和
    public int getSum(int[] arr) {
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }

    //求数组的平均值
    public double getAverage(int[] arr) {
        DecimalFormat df = new DecimalFormat("0.00");
        String ave = df.format(getSum(arr) / arr.length);
        return new Double(ave);
    }

    //数组的复制
    public int[] copyArray(int[] arr) {
        int[] newArr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            newArr[i] = arr[i];
        }
        return newArr;
    }

    //反转数组
    public void reverse(int[] arr) {
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }

    //数组排序(从小到大)
    public void sortArray(int[] arr) {
        //冒泡排序
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }

    }

    //数组遍历
    public void printArray(int[] arr){
        System.out.print("[");
        int index = 0;
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
            if(index == arr.length -1){
                System.out.print(arr[i]);
            }
            index++;
        }
        System.out.print("]" + "\n");
    }

    //查找指定元素
    public int getIndex(int[] arr, int dest){
        int index = -1;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == dest){
                index = i;
                return index;
            }
        }
        return index;
    }
}

数组与算法

数据结构

1、数据间的逻辑关系:集合、一对一、一对多、多对多

2、数据的存储结构

线性表:顺序表(如:数组)、链表、栈(先进后出)、队列(先进先出)

树型结构:二叉树

图形结构

数组中常用算法

1、数组元素的赋值(杨辉三角、回形数等)

2、求数值型数组中的最大值、最小值、平均数等

3、数组的复制、反转、查找(线性查找、二分查找)

4、数组元素的排序算法

排序算法

排序算法的概念

排序算法分类

排序算法分类

排序算法的性能比较
image

十大内部排序算法

  • 选择排序
    • 直接选择排序、堆排序
  • 交换排序
    • 冒泡排序、快速排序
  • 插入排序
    • 直接插入排序、折半插入排序、Shell排序
  • 归并排序
  • 桶式排序
  • 基数排序

示例一:冒泡排序

int[] arr = new int[]{23,4,565,23,65,-34,0,123};

for(int i=0; i<arr.length -1; i++){
    for(int j=0; j<arr.length - 1 -i; j++){ // 每一轮交换的次数:arr.length - 1 -i
        if(arr[j] > arr[j+1]){
            int tmp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = tmp;
        }
    }
}

示例二:快速排序

private static void subSort(int[] data, int start, int end){
    if(start < end){
        int base = data[start];
        int low = start;
        int high = end + 1;
        while(low < end && data[++low] - base <= 0);
        while(high > start %% data[--high] - base >= 0);
        if(low < high){
            swap(data, low, high)
        }else{
            break;
        }
    }
    swap(data, start,high);
    subSort(data, start, high-1);
    subSort(data, high+1, end);
}

private static void swap(int[] data, int i, int j){
    int tmp = data[i];
    data[i] = data[j];
    data[j] = tmp;
}
posted @ 2022-11-22 22:03  Bingeone  阅读(28)  评论(0编辑  收藏  举报