JavaSE基础(四)—— 数组、内存分配

目录

一、数组的定义

1. 静态初始化数组

1.1 数组的访问

1.2 数组的几个注意事项        

2. 动态初始化数组

2.1 动态初始化数组的元素默认值

3. 两种初始化的的使用场景总结、注意事项说明

二、数组的遍历

三、数组的案例

1. 数组元素求和

2. 数组求最值

3. 数组排序

3.1 数组排序的技术

3.2 数组搜索相关的技术

四、数组的内存图

1. Java 内存分配介绍

2. 数组内存图

3. 两个变量指向同一个数组

五、数组使用的常见问题

1. ArrayIndexOutOfBoundsException

2. NullPointerException

六、Debug工具的使用


数组就是用来存储一批同种类型数据内存区域(可以理解成容器)。

一、数组的定义

1. 静态初始化数组

定义数组的时候直接给数组赋值

静态初始化数组的格式:

// 完整格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2 ,元素3… };

double[] scores = new double[]{89.9, 99.5, 59.5, 88.0};
int[] ages = new int[]{12, 24, 36};

// 简化格式
数据类型[] 数组名 = { 元素1,元素2 ,元素3,… };

int[] ages = {12, 24, 36};

注意:数组变量名中存储的是数组在内存中的地址,数组是引用类型。 

1.1 数组的访问

// 数组名称[索引]
int[] arr = {12, 24, 36};
// 取值
System.out.println(arr[0]); // 12
// 赋值
arr[2] = 100;
System.out.println(arr[2]); // 100

// 数组的长度属性:length
// 获取数组的长度(就是数组元素的个数)
System.out.println(arr.length); // 3

数组的最大索引:数组名. length – 1(前提:元素个数大于0)

1.2 数组的几个注意事项        

  • 数据类型[] 数组名”也可以写成 “数据类型 数组名[]
    int[] ages =...;
    int ages[] =...;
    
    double[] scores = ...;
    double scores[] = ...;
  • 什么类型的数组存放什么类型的数据,否则报错
  • 数组一旦定义出来,程序执行的过程中,长度、类型就固定了

2. 动态初始化数组

定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据

数组的动态初始化格式:

// 数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[3];
// 后赋值
arr[0] = 10;
System.out.println(arr[0]); // 10

2.1 动态初始化数组的元素默认值

元素默认值规则:

数据类型明细默认值
基本类型byte、short、char、int、long0
float、double0.00.0
booleanfalsefalse
引用类型类、接口、数组、Stringnull

3. 两种初始化的的使用场景总结、注意事项说明

  • 动态初始化:只指定数组长度,后期赋值,适合开始知道数据的数量,但是不确定具体元素值的业务场景。
  • 静态初始化:开始就存入元素值,适合一开始就能确定元素值的业务场景。
  • 两种格式的写法是独立的,不可以混用。

二、数组的遍历

遍历:就是一个一个数据的访问。

int[] ages = {20, 30, 40, 50};
for (int i = 0; i < ages.length; i++) {
    System.out.println(ages[i]);
}

三、数组的案例

1. 数组元素求和

int[] money = {16, 26, 36, 6, 100};
int sum = 0;
for (int i = 0; i < money.length; i++) {
    // i = 0 1 2 3 4
    sum += money[i];
}

2. 数组求最值

int[] faceScores = {15, 9000, 10000, 20000, 9500, -5};
int max = faceScores[0];
for (int i = 1; i < faceScores.length; i++) {
    if(faceScores[i] > max) {
        // 替换
        max = faceScores[i];
    }
}

3. 数组排序

就是对数组中的元素,进行升序(由小到大)或者降序(由大到小)的操作。

3.1 数组排序的技术

  • 冒泡排序
  • 选择排序
  • 快速排序
  • 插入排序

3.2 数组搜索相关的技术

  • 二分搜索
  • 分块查找
  • 哈希表查找

四、数组的内存图

1. Java 内存分配介绍

  • 方法区
  • 本地方法栈
  • 寄存器

2. 数组内存图

public class Test {
    public static void main(String[] args) {
        int a = 10;

        int[] arr = new int[]{11, 22, 33};

        arr[0] = 44;
        arr[1] = 55;
        arr[2] = 66;

        System.out.println(arr[0]); //44
        System.out.println(arr[1]); //55
        System.out.println(arr[2]); //66
    }
}

3. 两个变量指向同一个数组

public class Test2{
    public static void main(String[] args) {
        int[] arr1 = {11, 22, 33};
        int[] arr2 = arr1;
        System.out.println(arr1);
        System.out.println(arr2);
        arr2[1] = 99;
        System.out.println(arr1[1]);
        System.out.println(arr2[1]);
    }
}

五、数组使用的常见问题

1. ArrayIndexOutOfBoundsException

如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)

int[] arr = new int[]{11, 22, 33};
System.out.println(arr[2]);
System.out.println(arr[3]) // 出现异常

2. NullPointerException

如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException(空指针异常)

arr = null;
System.out.println(arr); // null
System.out.println(arr.length) // 出现异常

六、Debug工具的使用

IDEA自带的断点调试(排错)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心上学事上练

感谢您的支持,让我们一起成长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值