欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础知识总结(三):数组

程序员文章站 2024-03-15 12:44:41
...

1.数组概念

1.1 数组:一种容器,同时存放多个数据值
1.2 数组的特点

  • 数组是一种引用数据类型
  • 数组中的数据类型必须统一
  • 数组的长度在程序运行期间不可改变

2.数组初始化

2.1 数组初始化:在内存创建一个数组,向其中赋予一些默认值
2.2 初始化分类:

  • 动态初始化:(指定长度)
  • 数组格式:
数据类型[] 数组名称=new 数据类型[数组长度];
  • 解析含义:
    左侧数据类型:数组当中保存的数据,全都是统一的类型
    左侧中括号:代表数组
    左侧数组名称:对数组取名称
    右侧new:创建数组的动作
    右侧数据类型与左侧数据类型保持一致
    右侧中括号的长度,数组的长度为int类型.
  • 本质:创建数组,指定数组中的数据元素个数
  • 静态初始化:(指定内容)
  • 数组格式
    静态初始化的数组长度是可知的
数据类型[] 数组名称=new 数据类型[]{元素1,元素2,...};
  • 省略的格式
数据类型[] 数组名称 = {元素1,元素2,...};
  • 本质:创建数组,不指定数据个数多少,直接将具体数据内容进行指定.
  • 注意事项
  • 静态初始化无指定长度,仍然会自动推算长度
  • 静态初始化标准格式扩拆分两步
  • 动态初始化格式也可以拆分两步
  • 静态初始化一旦使用省略格式,不能拆分步骤
//省略格式静态初始化
int[] arrayA = {10,20,30};

//静态初始化标准格式,可拆分
int[] arrayB;
arrayB = new int[]{11,12,13};

//动态初始化可拆分
int[] arrayC;
arrayC = new int[7];

//静态初始化省略格式不可拆分
int[] arrayD;
xx:arrayD = {1,2,3,4};//错误

3.访问数组

3.1 获取数组元素

  • 直接打印数组名称

  • 得到数组对应的内存地址的哈希值

  • 数组创建在内存,位置信息称为内存地址

public class ArrayUse {
    public static void main(String[] args) {
        int[] array = {10,20,30};
        System.out.println(array);
    }
}
//内存地址值,[代表数组值,I为int类型,@后代表十六进制内存地址值
[I@4554617c
  • 访问数组元素格式
  • 索引值是int数字,代表数组元素编号,从0开始,一直到数组长度-1;
数组名称 [索引值];

3.2 赋值

  • 动态初始化数组, 元素自动拥有一个默认值
  • 整数类型默认值为0
  • 浮点类型默认值为0.0;
  • 字符类型默认值为’\u0000’;
  • 布尔类型默认值为false;
  • 引用类型默认值为null.
  • 静态初始化数组,系统自动将默认值替换为大括号的数值

4.java虚拟机内存划分

4.1 内存划分
Java基础知识总结(三):数组
4.2 数组内存图

  • 一个数组内存图

Java基础知识总结(三):数组

  • 两个数组内存图

Java基础知识总结(三):数组

  • 两个引用指向一个数组内存图
    Java基础知识总结(三):数组

5.常见问题

  • 数组索引越界异常
  • 数组元素编号从0开始,一直到数组长度-1为止.
  • 访问数组元素编号不能超出边界
  • 报错–>数组索引越界异常ArrayIndexOutOfBoundsException:
  • 修改为存在的正确索引编号
  • 空指针异常
  • 所有的引用类型(包括数组)可以赋值为null,代表空
  • 只赋值null,没有进行new创建,会发生空指针异常NullPointerException
  • new数组,就可以解决

6.数组操作

  • 获取数组长度
  • 基本格式:
  • 得到一个int数字,代表数组长度
  • 数组一旦创建.长度不能改变
数组名称.length;

数组长度运行期间不可改变

  • new数组变化的是创建新的数组,旧数组依然是原来的数组,不改变原来数组的长度

Java基础知识总结(三):数组

  • 数组遍历输出
  • 将数组的所有元素打印输出
  • 方法一:原始
System.out.println(array[0]);
...
System.out.println(array[n-1]);
  • 方法二:精简型
int n=array.length;
for(int i=0;i<n;i++){
	System.out.println(array[i]);
}
  • 求出数组的最值
  • 最大值初始化为数组第一个值
int max=array[0];
for(int i=1;i < array.length;i++){
	if(array[i]>max){
		max=array[i];
	}
}
System.out.println("max:"+max);
  • 数组元素反转
  • 前提是不创建一个新的数组>>>

Java基础知识总结(三):数组

...
public static void main(String[] args) {
	int[] array = {10,20,30,40};
	for(int i=0;i<array.length;i++){
		System.out.println(array[i]);
	}
	System.out.println("==========BBB==========");
	for (int min = 0, max = array.length - 1; min < max; min++, max--) {
            int temp = array[min];
            array[min] = array[max];
            array[max] = temp;
        }

    // 再次打印遍历输出数组后来的样子
    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
    }
}
...

7.数组与方法

  • 数组作为方法参数

  • 当调用方法的时候,向方法的小括号进行传参,传递进去的其实是数组的地址值。

  • 三要素:

  • 返回值类型:只是进行打印而已,不需要进行计算,也没有结果,用void

  • 方法名称:printArray

  • 参数列表:必须给我数组,我才能打印其中的元素。int[] array
    Java基础知识总结(三):数组

public static void printArray(int[] array) {
        System.out.println("printArray方法收到的参数是:");
        System.out.println(array); // 地址值
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }

int[] array = { 10, 20, 30, 40, 50 };
 printArray(array); // 传递进去的就是array当中保存的地址值
  • 数组作为方法返回值
  • 任何数据类型都能作为方法的参数类型,或者返回值类型。
  • 数组作为方法的参数,传递进去的其实是数组的地址值。
  • 数组作为方法的返回值,返回的其实也是数组的地址值。
    Java基础知识总结(三):数组
 public static int[] calculate(int a, int b, int c) {
        int sum = a + b + c; // 总和
        int avg = sum / 3; // 平均数
        // 两个结果都希望进行返回

        // 需要一个数组,也就是一个塑料兜,数组可以保存多个结果
        /*
        int[] array = new int[2];
        array[0] = sum; // 总和
        array[1] = avg; // 平均数
        */

        int[] array = { sum, avg };
        System.out.println("calculate方法内部数组是:");
        System.out.println(array); // 地址值
        return array;
    }