JAVA数组

数组概述 初始化 使用 边界 稀疏数组

java数组

数组概述

image-20260923185654487

数组声明创建

1
2
3
4
//声明
dataType[] arrayRefVar;//首选方法 数组类型 变量的名字 = 变量的值;
或者
dataType arrayRefVar[];//效果相同,但不是首选方法

java语言使用new操作符来创建数组,语法如下:

1
2
dataType[] arrayRefVar= new dataType[arraySize]; //新建数组创建 定义什么就new什么 
int[] nums1=new int[10]; //创建数组,可以存放10个int类型的数据 一组数 一个名字
  • 数组的元素是通过索引访问的,数组索引从0开始

  • 获取数组的长度

    1
    arrays.length
1
2
//赋值
nums1[0]=1;

数组的四个特点

  • 其长度是确定的,一旦被创建,它的大小就是不可改变的。扩容要创建新的数组
  • 其元素必须是相同类型,不允许出现混合类型
  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型
  • 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
  • 数组本身就是对象,java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的

三种初始化和内存分析

java内存

1
2
3
4
5
6
7
8
9
10
11
堆
存放new的对象和数组
可以被所有线程共享,不会存放别的对象引用

栈
存放基本变量类型(会包括这个基本类型的具体数值)
引用对象的变量(会存放这个引用在堆里面的具体地址)

方法区
可以被所有的线程共享
包含了所有class和static变量

初始化

1
2
3
4
5
6
7
8
9
10
11
静态初始化
int[] a={1,2,3}; //你直接把数组元素的值一次性写出来,JVM 自动算数组长度。
Man[] mans={new Man(1,1),new Man(2,2)};

动态初始化
int[] a=new int[2];//你先指定数组长度,先开辟数组空间元素先给默认值,之后再逐个赋值元素。
a[0]=1;
a[1]=2;

/*数组的默认初始化:
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化*/

关于初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
默认值规则:
-byte/short/int/long → 0
-float/double → 0.0
-boolean → false
-char → '\u0000'(空字符)
-所有引用类型(对象、数组)→ null
原理:
对象在堆创建的时候,堆内存会清零,自动填充默认值;
静态变量在类加载时,方法区分配内存并赋默认值

1. 成员变量(类里面定义的,不是方法内) 会自动赋默认值
包括实例成员、static静态成员。只要new对象/类加载,JVM自动给默认值
2. 局部变量 ,哪怕是引用类型的局部变量->方法里面定义的变量 没有默认值 不会自动赋值
局部变量放在栈帧的局部变量表。栈内存不会自动清零,里面是脏数据,java语法强制要求:使用局部变量之前,必须手动赋值,否则编译失败

3.数组里面的元素-> 堆上的数组,有默认值
new数组,堆上数组元素自动给默认值,不管在哪

数组边界

  • 下标的合法区间:[0,length-1],如果越界就会报错:ArrayIndexOutOfBoundsException:数组下标越界异常!

小结:

  • 数组是相同数据类型(数据类型可以为任意类型)的有序集合
  • 数组也是对象,数组元素相当于对象的成员变量
  • 数组的长度是确定的,不可变的。如果越界会报错

数组使用

  • For-Each循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //1.普通for循环
    int[] arrays={1,2,3,4,5};
    for(int i=0;i<arrays.length,i++){
    System.out.println("arrays[i]");
    }
    //2.增强for循环 .for 取不到下标,适合打印输出,不适合操作
    for(int array:arrays){ //array 每一个元素
    System.out.println(array)
    }
  • 数组作方法入参

  • 数组作返回值

多维数组

多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组

二维数组

1
int[][] a=new int[2][5];//a可以看成一个两行五列的数组

Arrays类

  • 数组的工具类java.util.Arrays
  • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作
  • 查看JDK帮助文档
  • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而“不用”使用对象来调用 注意是不用而不是不能
  • 具有一下常用功能
    • 给数组赋值:通过fill方法
    • 对数组排序:通过sort方法,按升序
    • 比较数组:通过equals方法比较数组中元素值是否相等
    • 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作

冒泡排序

八大排序之一

  • 比较数组中两个相邻的元素,如果第一个数比第二个数打,我们就交换他们的位置
  • 每一次比较,都会产生出一个最大或者最小的数字
  • 下一轮则可以少一次排序
  • 依次循环,直到结束

稀疏数组 一种数据结构

  • 当一个数组中大部分元素为0时,或者为同一值的数组时,可以使用稀疏数组来保存该数组
  • 稀疏数组的处理方式:
    • 记录数组一共几行几列,有多少个不同值
    • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模

image-20260929204124047


JAVA数组
http://lotus.github.io/2026/09/28/java数组/
作者
Lotus
发布于
2026年9月28日
许可协议