Java 数组的定义与使用

目录

1 定义数组

2 数组的初始化

2.1 动态初始化

2.2 静态初始化

3 数组的使用 

3.1 数组访问

3.2 遍历数组

4 数组是引用类型

4.1 JVM 内存划分

4.2 引用变量

4.3 再谈引用变量

4.4 认识 null

5 数组的应用场景

5.1 数组作为参数

5.2 数组作为返回值

6 Arrays(操作数组的工具类)

7 数组练习

7.1 数组排序(冒泡排序)

7.2 数组逆序

7.3 求数组中元素的平均值

7.4 顺序查找

7.5 二分查找

8 数组拷贝

9 二维数组

9.1 二维数组的定义

9.2 二维数组的使用


1 定义数组


数组 是一块连续的内存,用来储存相同类型的数据,数组下标从0开始



2 数组的初始化


局部变量在使用时一定要进行初始化

数组的初始化主要分为动态初始化以及静态初始化


2.1 动态初始化


在创建数组时直接指定数组中元素的个数,默认数组初始化为0



2.2 静态初始化

     ( 静态初始化可以简写,省去后面的 new int[] )


在创建数组时不直接指定数据元素个数



 静态和动态初始化也可以分为两步,但是 省略格式不可以

动态:

int[] array= new int[10];

分两步:

int[] array;

array = new int[10];

静态:

int[] array = new int[]{10, 20, 30};

分两步:

int[] array;

array = new int[]{10, 20, 30};

省略格式:

int[] array = {1, 2, 3, ..., n};

省略格式不可以拆分, 否则编译失败


数组就是一个引用数据类型,用来存放地址


int[] array = 0;  //会报错,因为数组里面存的是地址



如果数组中存储元素类型为基类类型未初始化,默认值为基类类型对应的默认值,比如:


如果数组中存储元素类型为引用类型,默认值为 null


3 数组的使用 


3.1 数组访问


通过下标访问快速访问数组中任意位置的元素,下标从0开始

不能越界,否则会报出下标越界异常



3.2 遍历数组


"遍历" 是指将数组中的所有元素都访问一遍,访问是指对数组中的元素进行某种操作

比如:打印(print输出不换行,println输出换行 


求数组长度:数组名.lenght


 使用 for循环 遍历数组    


使用 for-each 遍历数组


(遍历这个数组的时候,把数组当中的元素进行赋值给x)


for-each 是 for 循环的另外一种使用方式

能够更方便的完成对数组的遍历,可以避免循环条件和更新语句写错

区别:使用for循环有下标,for-each无下标


4 数组是引用类型


4.1 JVM 内存划分


(便于内存管理)


 


局部变量 存放于虚拟机栈中

new 对象放入堆中


4.2 引用变量


arr 引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址

通过该地址,引用变量便可以去操作对象

a,b是基本数据类型


4.3 再谈引用变量



一个引用不能同时指向多个对象

对象不能指向对象,只有引用才能指向对象


传引用不一定能改变实参的值,重要的是看拿引用做了什么

是让引用指向了新的对象(只是修改了形参的指向,打印出来的实参并未改变)

还是让引用里面的值改变(修改的是同一块内存,实参改变)


4.4 认识 null


null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用



5 数组的应用场景


5.1 数组作为参数


1、参数传基本数据类型

在 func 方法中修改形参 x 的值, 不影响实参的 num


2、参数传数组类型(引用数据类型)

func 方法内部修改数组的内容, 方法外部的数组内容也发生改变.

因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的


5.2 数组作为返回值


数组是可以以返回值形式传递的,(返回值可以是数组)



6 Arrays(操作数组的工具类)


Arrays.toString 把数组以字符串形式进行输出

因为 Arrays.toString 方法本来就有返回值(原码中返回字符串)

因此可以直接作为 println 方法参数进行返回


利用 Arrays.sort 进行排序(排序效率也高)


Arrays.sort 也可以进行区间排序,开发效率非常高


比较两个数组内容一不一样,可以 Arrays.equals 

返回值是 true 或 false


填充可以 Arrays.fill 

打印出来的都是9


Arrays.fill 也可以区间填充

0到3理论上4个数据,但 Java 里面0到3都是左闭右开区间,只有3个数据


7 数组练习


7.1 数组排序(冒泡排序)


import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] array = {44,99,22,4};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }

    public static void bubbleSort(int[]array){
        if (array == null){
            return;
        }
        // i 代表趟数
        for (int i = 0; i < array.length - 1; i++) {
            boolean flg = false;
            // 进行交换
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j+1]){
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                    flg = true;
                }
            }
            // !为非,结果为 boolean 类型,非假即为真,执行语句
            if (!flg){
                //flg = false ,没有进行交换
                return;
            }
        }
    }    
}        

7.2 数组逆序


 首尾交换直到相遇

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        int[] array = {44,99,22,4};
        reverse(array);
        System.out.println(Arrays.toString(array));
    }

    public static void reverse(int[]arrays){
        if (arrays == null){
            return;
        }
        int i = 0;
        int j = arrays.length-1;
        while (i < j){
            int tmp = arrays[i];
            arrays[i] = arrays[j];
            arrays[j] = tmp;
            i++;
            j--;
        }
    }
}

7.3 求数组中元素的平均值



注意打印单个字符和打印字符串的区别


System.out.println(avg(arr));

System.out.println(Arrays.toString(array));


7.4 顺序查找



7.5 二分查找


public class Test {
    public static void main(String[] args) {
        int[] arrays = {1,2,3,4,5,6};
        System.out.println(binarySearch(arrays, 6));
    }

    public static int binarySearch(int[] arrays,int key){
        int left = 0;
        int right = arrays.length-1;
        while (left <= right){
            int mid = (left + right) / 2;
            if (arrays[mid] == key){
                return mid;
            } else if (arrays[mid] < key) {
                left = mid + 1;
            }else {
                right = mid - 1;
            }
        }
        return -1;
    }
}

8 数组拷贝


最简单的拷贝方法


可以直接调用工具类 Arrays.copyOf 进行拷贝,有两个参数,一个数组,一个长度


这个拷贝返回值是一个数组,所以定义一个数组变量进行接收然后打印


也可以把这个拷贝当成一个扩容


 Arrays.copyOfRange 一定区间内容进行拷贝


拷贝数组返回的都是一个新的数组


也可以直接用 arraycopy 进行拷贝


两个引用指向同一个引用不属于拷贝


9 二维数组


9.1 二维数组的定义


两行三列


Java 里面行不能省略

列能省略


9.2 二维数组的使用


访问二维数组 



打印二维数组 


这样打印二维数组,打印出来的是地址


应该用 Arrays.deepToString 打印二维数组


另一种打印二维数组方法


特殊的二维数组打印

只定义了两行,没有定义列有多长,列此时是值null不能.lenght,所以出现空指针异常


定义列后 :

这个二维数组不是方方列列,也就是所说的不规则的二维数组


二维数组是一个特殊的一维数组

因此打印二维数组可修改为:


  • 14
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值