1. 基本概念
数组是指一组相关数据类型的变量集合,并且这些变量按照一定的顺序排列。由数组的定义我们就能够得出数组是引用数据类型,所以数组的内容是放在堆空间上的。那么我们在创建一个数组时就要在堆上开辟空间,我们来看看数组的创建。
在介绍数组的创建之前,我们先来区分一下引用类型变量和基本类型变量。Java中,不是基本数据类型的变量就是引用数据类型。它们最大的区别就是:基本数据类型的值是存在栈上,而引用数据类型的值是存在堆上的。而且基本数据类型的不同类型数据默认值不同,但是所有引用数据类型的默认值都为null。这也是引用数据类型值存在堆上的一个体现。
1.1 数组的动态初始化
数据类型[ ] 数组名称 = new 数据类型 [数组长度];
实质:1.确定数组长度;
2.根据数组长度在堆上开辟空间;
3.开辟堆空间后在使用索引将数组的每个元素的值赋为其数据类型默认值。
注意:数组是引用数据类型,这是因为实际上数组的数据类型为:“数据类型[ ]”。很明显它不是一个基本类型数据,所以就是引用数据类型。
示例:
int[] ints = new int[5];
我们定义的"ints"这个变量的数据类型就是“int []”型数据类型。
1.2 数组的静态初始化
数据类型[ ] 数组名称 = new 数据类型 [ ]{ 值,值,值,... };
简化静态初始化:数据类型[ ] 数组名称 = { 值,值,值,... };
实质:1.在堆上开辟空间时顺便进行了赋值。
示例:
int[] ints = {1,2,3,4};
int[] ints = new int[]{1,2,3,4};
2. 数组与方法
2.1 方法接收数组,方法返回数组与方法修改数组
既然数组也是一种数据类型,那么我们在方法中当然也可以接收一个数组类型的变量或返回一个数组类型的变量。
示例:
public class Array {
public static void main(String[] args) {
int[] ints = new int[]{21,34,12,5,7,3,9,45,23,75,10};
myPrint(ints);
int[] newInts = addOneElement(ints);
myPrint(newInts);
}
//方法接收数组
private static void myPrint(int[] arr){
System.out.print("数组的内容为:");
for(int i=0; i<arr.length; i++){
if(arr.length-1 == i){
System.out.println(arr[i]);
}else{
System.out.print(arr[i] + " , ");
}
}
}
//方法返回修改后的数组
private static int[] addOneElement(int[] arr){
int[] ints = new int[arr.length + 1];
System.arraycopy(arr, 0, ints, 0, arr.length);
ints[ints.length - 1] = arr[arr.length - 1] - arr[0];
return ints;
}
}
结果:
2.2 对象数组
我们来看一下数组的定义:数组是指一组相关类型数据的集合,并且这些数据安照一定顺序排列。而Java中有一个数据类型是十分特殊的,它就是引用数据类型。我们把引用数据类型的类型称为类,把类实例化后得到的数据称为对象。那么数组中完全可以存放引用数据类型的数据,这种存放引用数据类型示例化对象的数组就是对象数组。
示例:
public class ObjectArray {
public static void main(String[] args) {
//这是一个对象数组
MyObject[] myObjects = new MyObject[3];
myObjects[0] = new MyObject("第一个",12);
myObjects[1] = new MyObject("第二个",23);
myObjects[2] = new MyObject("第三个",45);
myPrint(myObjects);
}
//方法接收对象数组
private static void myPrint(MyObject[] arr){
System.out.println("数组的内容为:");
for(int i=0; i<arr.length; i++){
System.out.println("\t" + arr[i].toString());
}
}
}
//这就是一个引用数据类型,我们称它为类
class MyObject{
private String objectName;
private int objectNum;
public MyObject(String objectName, int objectNum) {
this.objectName = objectName;
this.objectNum = objectNum;
}
public String getObjectName() {
return objectName;
}
public void setObjectName(String objectName) {
this.objectName = objectName;
}
public int getObjectNum() {
return objectNum;
}
public void setObjectNum(int objectNum) {
this.objectNum = objectNum;
}
@Override
public String toString() {
return "objectName='" + objectName + '\'' +
", objectNum=" + objectNum;
}
}
结果:
可以看到,实际上对象数组和一般数组没有什么区别。