1、定义
数组在Java中的定义和c语言中的相同,都是:相同类型元素的集合。下面我们看看如何定义一个数组,以下是初始化数组的三种形式。
int[] arr1 = {1,2,3,4};
int[] arr2 = new int[10];
int[] arr3 = new int[]{1,2,3,4};
可以看到等号左边均是数组类型+数组名,等号右边如果初始化空间则不能对数组进行赋值,如果赋值则不能初始化空间,Java会根据你大括号中的值的个数初始化空间。
2、遍历数组
Java遍历数组一共有两种方法,下面是这两种方法的代码:
int[] array1 = {1,2,3,4};
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i] + " ");
}
可以看到,Java中遍历数组并不像C语言那样,还需要通过计算去求数组的长度,它可以直接通过数组名.length求的数组的长度。下面还有一种更安全的遍历数组的方法 :
int arr1 = {1,2,3,4};
for(int x : arr1){ //使用for else遍历数组
System.out.println(x + " ");
}
这是使用for else遍历数组的方法,为什么说它更安全呢?这是因为:使用它不会获取到数组的下标。
3、深入理解数组
Java有两种数据类型,分别是基本数据类型和引用数据类型。数组属于其中的引用数据类型,那么什么是引用数据类型呢?当前这个变量存储的是地址就是引用数据类型的特点。
那么数组到底存储在哪里呢?不要着急,我们先通过一张图来认识下JVM的内存划分:
如上图就是JVM的内存划分,而我们的数组就存储在堆中,那么在我们的main方法中是如何调用数组的呢?下面我们通过一张图来了解了解:
如图所示我们称array这个引用指向了数组对象,而下面的代码则表明了array2这个引用也指向了array这个引用指向的数组对象。
array2 = array;
我们可以通过任一一个数组的值来改变它的值,代码如下:
public static void main(String[] args) {
int[] arr1 = {1,2,3,4};
int[] arr2 = null; //arr2引用指向空对象
arr2 = arr1; //将arr1这个引用指向arr2这个引用指向的对象
arr2[0] = 100; //两个引用都可以修改这个对象的值
arr2[1] = 200;
for(int x : arr1){ //使用for else遍历数组
System.out.println(x + " ");
}
}
}
下面我们通过两个有关数组的方法,来检验下我们学习的成果:
1、
public static void fac1(int[] array){
array = new int[10]; //形参数组指向一个新的对象,并不影响实参的指向
//array = null;
}
public static void main(String[] args) {
int [] array1 = {1,2,3,4};
fac1(array1);
for (int i = 0; i < array1.length; i++) {
System.out.print(array1[i] + " ");
}
}
这是输出的结果:
相信应该有和博主一样认为会输出10个0的同学对这个结果感到震惊吧!!!下面博主继续通过图解来解释一波。
由图解可知:方法中的代码使形参引用指向了另外一个对象,而方法结束形参销毁 ,堆里存储数组没人指向它,如果一个对象没有人指向它,那么JVM会自动把它回收掉。因此,它并不会影响实参数组的值。
2、
public static void fac2(int[] array){
array[0] = 99; //都指向同一对象,因此会改变array2[0]的值
}
public static void main(String[] args) {
int [] array2 = {1,2,3,4};
fac2(array2);
for (int i = 0; i < array2.length; i++) {
System.out.print(array2[i] + " ");
}
}
这是输出的结果:
下面是图解:
由于,形参和实参的引用都指向同一对象,所以可以通过新参的引用改变对象的值。
4、数组的类方法
使用数组的类方法,能够极大的提高我们写数组代码的效率,下面是一些数组的类方法。
String str = Arrays.toString(arr)//将数组转为字符串的形式
int[]arr2 = Arrays.copyOf(arr1,arr1.length);//将数组arr1的内容拷贝给arr2
//**************************************************************************
//拷贝的其它形式:
System.arraycopy(arr1,0,arr2,0,arr1.length);//原数组,原数组开始拷贝的位置,目的数组,目的数组的哪个位置,拷贝的长度
//数组扩容
//若超出范围,则能拷贝多少拷贝多少,后面补0
int[]arr3 = Arrays.copyOf(arr1,arr1.length * 2);
//拷贝下标[1,4)的元素
int[]arr4 = Arrays.copyOfRange(arr1,1,4);
//**************************************************************************
Arrays.sort(arr3);//对数组进行排序
Arrays.binarySearch(arr3, 4)//对数组中的4进行二分查找
Arrays.equals(arr3, arr4)//比较数组对应位置的元素是否相同,返回bool类型
//**************************************************************************
//填充
Arrays.fill(arr,100);//将100填充进arr里
Arrays.fill(arr,1,4,1);//在[1,4)位置里填充1
如果想要了解更多的数组类方法,那么你可以下载一个Java的帮助手册,里面包含着所有类的各种方法。
这是其他两位博主提供的使用说明和下载链接: