面向对象的一些知识暂时告一段落,从本文开始,进入java语法的重学阶段~
初识数组
什么是数组
数组:相同类型的、用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。
数组的定义及初始化
定义及动态初始化
- 方式一,java推荐用法: type [] 变量名 = new type[数组中元素的个数];
//举例
int[] a = new int[10];
for (int i = 0; i < a.length; i++){
a[i] = new Random().nextInt();
}
- 方式二,c语言用法(不推荐): type 变量名 [] = new type[数组中元素的个数];
int a[] = new int[10];
for (int i = 0; i < a.length; i++){
a[i] = new Random().nextInt();
}
以上两种方式都叫做动态初始化,也就是说,只有当程序运行以后,你才能知道数组里到底存了哪些数据。方式二的命名方式c和c++程序员比较熟悉,但是java官方推荐使用第一种,一看就能知道,这是一个int型的数组,叫a。
静态初始化
int[] b = new int[]{
1,2,3};
在定义数组的时候直接初始化,大括号里的值就是数组的值。
隐式初始化
int[] c = {
1,2,3};
可以不写new,直接使用大括号初始化,但是本质上还是调用了new的,只是可以不写出来而已,所以叫隐式初始化。
最后,我们回过头来仔细的研究一下下面这一句代码:
int[] a = new int[10];
这句代码做了哪些事呢?
- int[] a: 定义了一个int型数组的引用,名字叫做a,存放在栈中。
- new int[10]:初始化一个长度为10的int型数组,在堆中开辟相应大小的内存。
- int[] a = new int[10]:将堆中开辟的数组的内存地址赋给数组引用a。
这样就可以通过a这个变量,来操作这个数组了。
是不是觉得这个过程很熟悉?没错!我们创建一个对象的过程也是这样的!那这是不是证明,数组其实是一个对象呢?我们后面会详细分析。
数组的使用
数组自身的使用
数组是使用方式大家应该都很清楚了,我这里简单的提一下。
数组的遍历
- 方式一:for循环
for (int i = 0; i < myList.length; i++) {
System.out.println(myList[i] + " ");
}
- 方式二:foreach循环
for (int element: myList) {
System.out.println(element);
}
数组长度
int length = myList.length;
java中的每个数组都有一个名为length的属性,表示数组的长度。
length属性我们后面会详细分析。
数组元素不为基本数据类型
数组是可以存放任意类型的数据的,不一定非得是基本数据类型。数组元素不为基本原生数据类型时,存放的是引用类型,而不是对象本身。当生成对象之后,引用才指向对象,否则引用为null。
Person[] p = new Person[3];
//未生成对象时,引用类型均为空
System.out.println(p[0]);
//生成对象之后,引用指向对象
p[0] = new Person(10);
p[1] = new Person(20);
p[2] = new Person(30);
for(int i = 0; i < p.length; i++){
System.out.println(p[i].age);
}
数组作为方法的参数
public void printArray(int[] array) {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
数组作为方法的返回值
public int[] reverse(int[] list) {
int[] result = new int[list.length];
for (int i = 0, j = result.length - 1; i < list.length; i++, j--) {
result[j] = list[i];
}
return result;
}
数组内容的输出
首先,这样写是不对的。