**何为数组:**数组是在内存中存储相同数据类型的连续的空间,声明一个数组就是在内存空间中划出一串连续的空间。在Java的标准函数库中包含了许多复杂的数据结构,如map、tree、set等等,但如果需要快速、有序、有效率地排列元素时,数组是一个不错的选择。它能够让你使用位置索引来快速、随机地存取其中的元素。
值得注意的是,在Java中,数组长度一旦被声明,就不可再更改。不同于C或一些其他语言,可以声明为长度可变的数组。
在Java中(或许其他语言也是这样,但这里我以Java举例)数组也是对象。那么如何理解这句话呢?
数组中的每个元素都是变量。换而言之,会是8种primitive主数据类型变量中的一种,或者是引用变量,但这两种是不同的。例如对于int类型数组中,每个元素都可以装载一个int。但是对于引用变量来讲,它只会保存引用,而非这个对象的本身。
我们用代码来具体看看
我们创建大小为7的数组,并将它赋值给之前声明为int[ ]的变量nums:
int[] nums = new int[7];
赋予int数组的每一个元素int值(注意在int数组中每个元素皆为int类型的变量)
nums[0] = 6;
nums[1] = 7;
nums[2] = 8;
nums[3] = 9;
nums[4] = 10;
nums[5] = 11;
nums[6] = 12;
这里注意到,虽然元素本身是primitive主数据类型,但数组本身却是个对象。
再看引用数组
我们声明并创建一个大小为7的Dog数组,并赋值给前面所声明出的Dog[ ]类型变量pets.。
Dog[] pets = new Dog[7];
但是这里我们需要注意,这里我们是对Dog的引用,而缺少了实际的Dog对象!
于是我们需要创建新的Dog对象并将他们赋值给数组的元素。
pets[0] = new Dog();
pets[1] = new Dog();
...
和8种主数据类型不同,数组也是对象的概念这里已可以初见端倪。
用一段完整的代码来看看。
Dog的范例:
Dog |
name |
bark() |
class Dog{
String name;
public static void main(String[] args){
//创建Dog对象
Dog dog1 = new Dog();
dog1.bark();
dog1.name = "Bart";
//创建Dog数组
Dog[] myDogs = new Dog[3];
myDogs[0] = new Dog();
myDogs[1] = new Dog();
myDogs[2] = dog1;
//通过数组引用存取Dog
myDogs[0].name = "Fred";
myDogs[1].name = "Marge";
//myDog[2]的名字是
System.out.print(myDogs[2].name);
//逐个对Dog执行bark()
int x = 0;
while (x < myDogs.length){
myDogs[x].bark();
x++;
}
}
public void bark(){
System.out.println(name);
}
}
输出如下
null
Bart
Fred
Marge
Bart
(没有引用到任何对象的引用变量的值为null值)
Java注重类型
一旦数组被声明出来,你就只能装入所声明类型的元素。
举例来讲,就是不能将Cat装入Dog数组中。double也不能放入int数组中(但是可以将byte放进int数组中,这被称作隐含展开)。
数组一定是个对象,不管所声明的元素是否为primitive主数据类型。
没有primitive主数据类型的数组,只有装载primitive主数据类型的数组。