2021-10-18  2021-10-18    2684 字   6 分钟

数组

数组的概念

用来存储数据的,多个变量组成的一个整体,用来便于批量操作数据的。

​ 元素:每一个数组中的变量空间。

​ 格式:

数组名称[索引]

​ 索引:每个元素的编号 称为索引,从0开始。又叫角标。

​ 长度:数组中可以存储多少个数据。用length表示

数组的声明和赋值:

① 动态初始化:

数据类型[] 数组名称 = new 数据类型[长度]

​ 注意:

  • 由于动态初始化开辟空间之后,赋的是数组数据类型的默认值。

  • 数据类型[]中 [] 可以跟在数据类型的后面,也可以跟在数组名称的后面。

    例如 :

    int[] arr

    int arr[]

    ​ 写法都对。

② 静态初始化 :

数据类型[] 数组名称 = new 数据类型[]{数据值1,数据值2,数据值3}

​ 注意:

  • 静态初始化 创建数组的时候,就被赋值了,有初始值 。

  • new 数据类型[]里面不放长度值,由{}里面的数据个数决定长度。

③ 静态初始化的简写形式:

数据类型[] 数组名称 = {数据值1,数据值2,数据值3}

​ 注意:

  • 声明与赋值不能分开写
/**

① 动态初始化:

数据类型[] 数组名称 = new 数据类型[长度]

② 静态初始化 :

数据类型[] 数组名称 = new 数据类型[]{数据值1,数据值2,数据值3}

③ 静态初始化的简写形式:

数据类型[] 数组名称 = {数据值1,数据值2,数据值3}

注意:

1》 声明与赋值不能分开写。

*/

class 数组概述

{

public static void main(String[] args)

{

//学生 40人

//40变量

int score = 98;

int score1 = 90;

//声明一个数组 ,用来存储学生的成绩 3个学生 成绩分别为 98 90 79

int[] scores = new int[3];

//System.out.println(scores[1]);

scores[0] = 98;//索引为0的数组元素赋值

scores[1] = 90;

scores[2] = 79;

//System.out.println( scores[1]);

String[] arr = new String[3];

//System.out.println(arr[0]);

//长度

//System.out.println(scores.length);

//静态初始化 数据类型[] 数组名称 = new 数据类型[]{数据值1,数据值2,数据值3}

double[] drr = new double[]{1.2,3.5,4.8,6.9};

//③ 静态初始化的简写形式:

//数据类型[] 数组名称 = {数据值1,数据值2,数据值3}

//声明与赋值不能分开写。

char[] crr = {'a','b','c','d'};

}

}

数组的遍历

将数组中的元素依次拿出来,输出一遍

采用for循环的形式

代码

class 数组的遍历 {
    public static void main(String[] args) { 
        //声明一个数组 
        int[] arr = {1,2,3,4,5,6,7,8};
        for (int i = 0; i<arr.length ;i++ ) { 
            System.out.println(arr[i]); 
        } 
    } 
}

数组的常见异常

1.数组角标越界异常:访问到了数组索引之外的空间。

ArrayIndexOutOfBoundsException

2.空指针异常: 对象为null

NullPointerException

数组的常见应用

求最值

标志位法

代码

/**
1.求最大值: 
标志位法: 
思路:
假设 数组的第一个元素是最大的,找一个变量空间存放该值。 
*/
class 数组的求最值 { 
    public static void main(String[] args) {
        int[] arr = {1,-5,23,-48,90,25};
        //标记最大值 int max = arr[0]; 
        //标记最小值 int min = arr[0];

        for (int i = 0 ; i< arr.length ;i++ ) { 
            //判断最大值
            if(max < arr[i]){
                max = arr[i];
            }
            //判断最小值
            if( min > arr[i]){ 
                min = arr[i]; 
            } 
        }
        System.out.println(max); 
        System.out.println(min);
    } 
}

数组的倒序/逆序

例如:

{1,2,3,4,5,6} ===> 倒序{ 6,5,4,3,2,1}

代码

/**
思路:
通过开始 和结束 标记指针的位置,来进行交换
*/
class 数组的倒序 { 
    public static void main(String[] args) {
        int[] arr ={1,2,3,4,5,6,7};
        /*for (int i = arr.length-1; i>=0 ; i-- ) 
        { 
        System.out.println(arr[i]);
        }*/ 
        //开始指针 结束指针 
        int start = 0; 
        int end = arr.length-1;
        for (;start <= end ; start++,end-- ) {
            //交换 
            int temp = arr[start];
            arr[start]= arr[end]; 
            arr[end] = temp; 
        }
        //遍历数组
        for (int i = 0; i<arr.length; i++ ) {
            System.out.println(arr[i]); 
        } 
    } 
}

数组的字符串拼接形式

默认打印数组时,打印的实际是数组的对象的形式。需要自己写方法,来显示数组中的元素值

代码:

class 数组的字符串拼接形式 {
    public static void main(String[] args) { 
        int[] arr1 = {1,2,3,4,5}; 
        System.out.println(arrayToString(arr1)); 
        int[] arr2 = {-10,28,19,30}; 
        System.out.println(arrayToString(arr2));
    }
    //arrayToString 转字符串 
    public static String arrayToString(int[] arr){
        String value = "{";
        for (int i=0; i<arr.length ;i++ ) {
            value += arr[i];
            if(i != arr.length-1 ){ 
                value += ",";
            }
        }
        value += "}";
        return value;
    } 
}

数组内存图

一个引用指向一个数组

1.当main方法开始压栈执行时,在main方法中开辟arr的引用变量空间。

2.在堆中创建数组对象,并进行初始化,如果是动态初始化的形式 ,数组中的值就是数据类型的默认 值,由于此时是静态初始化的简写形式,里面存放的就是初始值。

3.当数组对象初始化完毕之后,将内存首地址赋值给引用变量arr.

总结:

① arr 称为引用变量,并不是真实的数组。空间开辟在栈中。

② 真实的数组对象,空间开辟在堆中。

两个引用指向同一个数组

排序

概述

1.冒泡排序(Bubble Sort)

思路:

它重复地走访过要排序的元素列,依次比较两个相邻的元素,

如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。

走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成

2.排序的方式:

① 升序排序:从小到大

② 降序排序: 从大到下

代码

/** 
1.冒泡排序(Bubble Sort) 

思路: 
它重复地走访过要排序的元素列,依次比较两个相邻的元素,
如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。 
走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成

2.排序的方式:
	① 升序排序:从小到大
	② 降序排序: 从大到下 
*/
class 冒泡排序 {
    public static void main(String[] args) {
        int[] arr = {-19,23,38,47,15,19,-30}; 
        //外层控制比多少趟
        for (int i = 0 ; i<arr.length ;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; 
                } 
            } 
     }
      System.out.println(arrayToString(arr));
    }
    //arrayToString 转字符串 
    public static String arrayToString(int[] arr){
        String value = "{";
        for (int i=0; i<arr.length ;i++ ) { 
            value += arr[i];
            if(i != arr.length-1 ){
                value += ","; 
            }
        }
        value += "}";
        return value; 
    } 
}

二维数组

多维数组

java中 没有多维数组的概念,所谓的多维数组,实质就是数组套数组。

二维数组声明与赋值

① 动态初始化

数据类型[][] 数组名称 = new 数据类型[长度][长度];`

② 静态初始化

**数据类型 数组名称 = new 数据类型*{*{*}{*}*,*{*}*}*;**

③ 静态初始化的简写形式

数据类型[][] 数组名称 = *{*{*}*,*{*}*,*{*}*}*;

二维数组的内存图

1.二维数组声明与赋值

① 动态初始化

数据类型[][] 数组名称 = new 数据类型[长度1][长度2]; 

注意:

长度2可以省略不写的。

但是省略后,需要先赋值再使用。

② 静态初始化

数据类型[][] 数组名称 = new 数据类型[][]*{*{*}*,*{*}*,*{*}*};

③ 静态初始化的简写形式

数据类型[][] 数组名称 = *{*{*}*,*{*}*,*{*}*};

2.默认值:

基本数据类型:

整数类型: byte short int long 0

浮点数类型:float double 0.0

布尔类型: false

字符类型:’\u0000'

引用数据类型:

null

结论:

① 第一个[]表示外层的数组。第二个[]表示内层的嵌套数组。

② 外层的数组中存储的内层嵌套数组的引用地址。

代码

/**

1.二维数组声明与赋值

① 动态初始化

数据类型[][] 数组名称 = new 数据类型[长度1][长度2];

注意:

长度2可以省略不写的。

但是省略后,需要先赋值再使用。

② 静态初始化

数据类型[][] 数组名称 = new 数据类型[][]{{},{},{}}

③ 静态初始化的简写形式

数据类型[][] 数组名称 = {{},{},{}}

2.默认值:

基本数据类型:

整数类型: byte short int long 0

浮点数类型:float double 0.0

布尔类型: false

字符类型:'\u0000'

引用数据类型:

null

3.二维数组的遍历:

*/
class 二维数组 { 
    public static void main(String[] args) { 
        //① 动态初始化
        int[][] arr = new int [3][5]; 
        //System.out.println(arr[0][0]); 
        //System.out.println(arr[0]);
        //③ 静态初始化的简写形式
        int[][] arr1 = {**{1,2,3},{4,5},{7,8,9,10}**};
        //System.out.println(arr1[0][1]); 
        //System.out.println(arr1[1][0]); 
        //System.out.println(arr1[2][2]); 
        
        //② 静态初始化 
        int[][] arr2 = new int[][]{**{1,2,3},{4,5},{7,8,9,10}**}; 
        //System.out.println(arr2[1][0]); 
        //动态初始化需要注意的问题:但是省略后,需要先赋值再使用。
        int[][] arr3 = new int[3][]; 
        arr3[1] = new int[3]; 
        //System.out.println(arr3[1][0]); 
        //二维数组的遍历:

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

avatar
青山
悟已往之不谏 知来者之可追
一言
今日诗词
站点信息
本站访客数 :
本站总访问量 :