1.数组的定义
在Java中,数组是一种相同数据类型的集合。数组在内存中是一段连续的空间。
2.数组的创建和初始化
2.1数组的创建
在Java中,数组创建的形式与C语言又所不同。
Java中数组创建的形式
T[] 数组名 = new T[N];
1.T表示数组存放的数据类型。
2.T[]表示数组的类型。
3.N表示数组的长度。
2.2数组的初始化
数组的初始化分为动态初始化和静态初始化两种。
2.2.1 动态初始化
动态初始化就是在创建数组的时候,直接指定数组元素的个数。
如以下代码
int[]arr=new int[10];//10就是数组元素个数
2.2.2 静态初始化
静态初始化就是在创建数组的时候不指定数组中元素的个数,但指定数组的内容。
语法格式:
T[] 数组名称=new int[]{data1,data2,data3.....};
举例说明
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,4,5};
String[] man=new String[]{"red","man","lebron"};
double[] arr2=new double[]{1.2,1.2,2.5};
}
注意事项:
1.在Java中,数组在创建的同时不能同时指定数组的长度和数组的内容。否则就会报错。
public class CSDN {
public static void main(String[] args) {
int[] arr=new int[5]{1,2,3,4,5};
String[] man=new String[4]{"red","man","lebron"};
double[] arr2=new double[5]{1.2,1.2,2.5};
}
}
如上面同时所示,同时指定数组的长度和数组的内容就会报错。
2.虽然静态初始化没有指定数组的长度,编译器在编译时会根据 { } 里面的元素来确定数组的长度。
3.静态初始化时,{ } 里面的元素的数据类型必须和数组创建时声明的数据类型相同。
4.静态初始化可以简写,后面的new T[]可以省略掉。
public static void main(String[] args) {
int[] arr={1,2,3,4,5};
String[] man={"red","man","lebron"};
double[] arr2={1.2,1.2,2.5};
}
2.2.3 总结共同点
动态初始化和静态初始化都可以分两步写。
//动态初始化分两步
int[] arr;
arr=new int[10];
//静态初始化分两步写
int[] arr2;
arr2=new int[]{1,2,3,4,5,6};
注意:分两步进行初始化时,new T[ ] 这部分不能省略。
2.2.4 补充
1.数组的创建其实可以像C语言那样创立,但是不推荐。
2.如果数组在创建时没有初始化数组的内容,数组中元素都有默认的其对应的零值。如下表
2.3 数组的访问和遍历
2.3.1数组的访问
数组在内存中是一段连续的空间,空间的编号都是从0开始,一次递增。这些编号也就是数组的下标,我们可以通过数组的下标来访问数组中的元素。
比如:
int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
如上面的代码所示,0,1,2,3,4就是数组的下标,我们就通过这些下标来访问数组中对应的元素。
2.3.2 数组的遍历
数组的遍历就是将数组的元素都浏览一遍。
在Java中,我们有两种遍历数组的方法。
重点:在Java中,我们可以通过 数组名.length 来获取数组的长度。
1.for循环遍历数组
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,4,5};
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
2.foreach循环
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,4,5};
for(int x:arr){
System.out.print(x+" ");
}
}
foreach循环的做法是遍历数组,一次将数组中的元素放入x中。
3.数组是引用数据类型
3.1JVM的内存分布
在介绍引用数据类型之前,我们先来简单介绍以下JVM的内存分布。
如下图
这里我们就先简单了解一下虚拟机栈和本地方法栈。
本地方法栈:本质是由C/C++构造的一些方法,我们可以直接使用。
虚拟机栈:就是我们平常学习计算机语言说的栈。
3.2引用数据类型
在JAVA中,我们的数据类型分为基本数据类型和基本数据类型。
基本数据类型创建的变量被称为基本变量,其内存中存的是变量的值。
由引用数据类型创建的数据类型一般被称为对象的引用,其空间存储的是对象的地址。
什么是引用呢?
看一下代码
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,4,5};
System.out.println(arr);
int a=10;
}
我们在创建变量的时候,计算机系统都会在栈中为变量开辟内存。
如以上代码,我们创建了一个数组变量和一个int变量,那么栈就会为这两个变量分配内存。
由于int a是基本数据类型,所以创建变量是赋值的10就直接占据了为变量a开辟的内存中。
而数组是引用数据类型, 其内存可以简单理解为寸的是数组的首元素地址。
所以,引用数据类型中存的地址,我们就可以说通过array这个引用来访问数组中的元素。
我么再来看一段代码
public static void main(String[] args) {
int[] arr1=new int[]{1,2,3,4,5};
arr1[0]=3;
arr1[1]=4;
int[] arr2=new int[]{10,20,30,40,50};
arr2=arr1;
arr1[0]=100;
arr2[1]=200;
for(int x:arr2){
System.out.print(x+" ");
}
}
输出会是什么呢?
我们通过画图来分析代码
首先,我们创建了arr1数组。
我们就可以通过arr1这个引用来访问数组中的元素。接着我们对arr1进行了数组元素中的改变。
接着我们又创建了arr2。
我们就可以通过arr2这个引用来访问arr2中的数据。
接着就是一个重点了,我们写了一个 arr2=arr1 的代码是什么意思呢?
简单来说就是将arr1中存储的地址传给arr2,arr2中存的数据就变为了0x9了。
那样arr2就不指向arr2了,而是指向了arr1。
这时侯,我们我们同过arr1或arr2这两个引用访问的都是arr1了。
而原先arr2指向的对象由于没有了引用,其在堆占的内存就自动被计算机系统回收了。
所以最后两步都是对arr1数组数据的改变。
运行代码
4. 二维数组
4.1二维数组的创建和初始化
二维数组的创建和初始化我们直接以代码的形式介绍
public static void main(String[] args) {
int[][] arr1=new int[][]{{1,2,3},{4,5,6}};
int[][] arr2=new int[2][3];
int[][] arr3={{1,2,3},{1,2,3}};
}
主要有以上三种形式。
4.2 二维数组的遍历
首先,我们要清楚二维数组是一个特殊的一维数组。
Java中这个定义很清楚。
我们以arr1为例。
如下图所示
arr1是一个2行3列的数组,这个二维数组可以看作是有两个一维数组组成的。
其中arr1[0] 是访问arr1这个二维数组中第一个一维数组中的引用。
arr1[1]是访问arr1这个二维数组中的第二个一维数组的引用。
第一种遍历方法
public static void main(String[] args) {
int[][] arr1=new int[][]{{1,2,3},{4,5,6}};
int[][] arr2=new int[2][3];
int[][] arr3={{1,2,3},{1,2,3}};
for(int i=0;i<arr1.length;i++){
//打印行
for(int j=0;j<arr1[i].length;j++){
//打印列
System.out.print(arr1[i][j]+" ");
}
System.out.println();
}
}
第二种遍历方法
public static void main(String[] args) {
int[][] arr1=new int[][]{{1,2,3},{4,5,6}};
int[][] arr2=new int[2][3];
int[][] arr3={{1,2,3},{1,2,3}};
for(int[] subarr1:arr1){
for(int x:subarr1){
System.out.print(x+" ");
}
System.out.println();
}
}
4.3 不规则二维数组
首先,我们要知道二维数组在创建的时候,行不可以省略,列可以省略。
public static void main(String[] args) {
int arr[][]=new int[2][];
arr[0]=new int[]{1,2,3};
arr[1]=new int[]{4,5,6,70};
for(int i=0;i< arr.length;i++){
for(int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
运行代码