数组概述
Java中的数组定义如下:
- 相同类型数据的有序集合
- 相同类型的若干数据,按照一定的先后次序排列组合而成
- 每个数据称之为一个数组元素,每个数组元素可以通过一个下标来访问它们
数组的声明创建
- 首先声明数组变量,才能在程序中使用数组。下面时声明数组变量的语法:
dataType[] arrarRefVar; //首选的方法 dataType arrayRefVar[]; //效果相同,但不推荐
- Java语言中使用new的操作符来创建数组,语法如下:
dataType[] arrayRefVar = new dataType[arraySize];
- 数组元素通过索引访问,数组索引从0开始
- 获取数组长度:
arrays.length
测试code:
public class ArrayDemo {
//变量类型 变量名字 = 变量的值
public static void main(String[] args) {
int[] nums; //定义,Java风格 1.声明一个数组
// int nums2[]; //C/C++风格
nums = new int[10]; //这里可以存放10个int类型的数据 2.创建一个数组
//3.给数组元素赋值
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 4;
nums[4] = 5;
nums[5] = 6;
nums[6] = 7;
nums[7] = 8;
nums[8] = 9;
nums[9] = 10;
//计算所有元素的和
int sum = 0;
for (int i =0; i<nums.length; i++){
sum = sum + nums[i];
}
System.out.println(sum);
}
}
数组的使用
- 普通的For循环
- For-Each循环(
arrays.for
)public static void main(String[] args) { int[] arrays = {1,2,3,4,5}; //JDK1.5 没有下标 for (int array : arrays) { System.out.println(array);//1 2 3 4 5 } }
- 数组作为方法入参
- 数组作返回值
多维数组
多维数组可以看成是数组的数组,例如二维数组:
int a[][] = new int[2][5];//两行五列的数组
Arrays类
- 数组工具类:
java.util.Arrays
API
提供的工具类供我们使用- 通过查看
JDK
文档 - Arrays类中的方法都是static修饰的静态方法,在使用的时候直接用类名进行调用,不用使用对象来调用
常用功能:
- 给数组赋值:通过
fill
方法 - 对数组排序:通过
sort
方法,按升序 - 比较数组:通过
equals
方法比较数组中元素值是否相等 - 查找数组元素:通过
binarySearch
方法能对排序好的数组进行二分查找操作
数组的四个基本特点
- 长度确定,一旦被创建,它的大小就不可以改变
- 元素类型必须相同,不允许出现混合类型
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型
- 数组变量属于引用类型,数组也可以看作是对象,数组中的每一个元素相当于该对象的成员变量,数组本身就是对象,Java中对象在堆中,因此数组无论保存原始数据类型还是其他对象类型,数组对象本身是在堆中
数组边界
- 下标的合法区间:
[0,length-1]
,如果越界就会报错; ArrayIndexOutOfBoundsException
:数组下标越界异常!- 数组长度是确定的,不可变。如果越界,则报:
ArrayIndexOutOfBounds
稀疏数组
- 当一个数组中大部分元素为0,或者为同一数组时,可以使用稀疏数组来保存该数组
- 稀疏数组的处理方式:
- 记录数组一共有几行几列,有多少个不同的值
- 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
- 如图
番外 Java内存分析
Java内存一般有以下三种:
- 栈(Java Virtual Machine Stacks)
- 堆(Heap Memory)
- 方法区(Method Area)
栈
栈帧:
一个栈帧随着一个方法的调用开始而创建,方法调用完成而销毁。栈帧内存存放方法中的局部变量,操作数栈等数据。
Java栈对栈帧进行存储、压栈和出栈操作。
当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。
堆
堆区是用来存放对象和数组,随着JVM的启动而创建。
- 堆区存储的全部是对象
- JVM只有一个堆区,被所有线程共享
- 堆区是可以动态地分配内存大小,它在运行时动态分配内存,Java的垃圾收集器会自动收走这些不再使用的数据。
- 缺点:由于要在运行时动态分配内存,存取速度较慢。
方法区
它方区和堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。