您的位置:首页 > 其它

一维数组创建的几种方法

2018-04-07 22:14 155 查看
数组可以说是对于每种语言学习中的最基础的数据结构之一,几乎是在所有项目中都会涉及到数组的使用,接下来就详细介绍一下数组的声明、创建和初始化以及实例代码解析,以Java语言描述

声明

数据类型 数组名称[]
或
数据类型[] 数组名称 //首选的方法


这部分来说俩种声明方式的效果是相同的,但是推荐首选第一种方法来声明,因为第一种方法更加直观,更具有可读性,可以通过声明看出是一种引用类型,而不是普通的数据类型

具体整型数组声明如下:

声明int型数组
int[]  arrNum;
int arrNum[];


这里的命名看个人喜好,不管怎样要有自己的规范,我个人一般是加前缀
arr


另外需要注意的是,Java语言中声明数组时不能指定其长度,因为数组是一种引用型变量,也就是说在数组定义时实质上是定义了一个引用变量(或者说是一个指针),而此时这个引用变量还没有指向任何有效的内存,并且这时候在内存中还没有开辟任何内存空间,所以不能指定长度.

错误定义

//int[5] arrNum;
//int arrNum[5];


那么这个时候学过C++的可能会问,为什么在C++中这样定义数组是合法的呢?而且是这样定义以后就可以使用,Java却需要创建、初始化以后才可以使用?

因为C和C++中的数组就是内存块,而Java中出于安全性考虑,定义的数组是对象,数组保存的仅仅是对象的引用,而不是对象本身,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

创建

Java使用new关键字创建数组,如果数组创建没有初始化,必须指定数组的大小

arrNum = new int[5];//正确
arrNum = new int[]{0,1,2,3,4};//正确
//arrNum = new int[];//错误,未初始化也未指定数组的大小


案例一:

public class ArrayDemo {
public static void main(String []args){
int [] arrNum;
int [] arrNum1;
int [] arrNum2 = new int[5];
arrNum = new int[5];
arrNum1 = new int[]{1,2,3,4,5};
System.out.println(arrNum[0]);
System.out.println(arrNum1[0]);
System.out.println(arrNum2[0]);
}
}


可以看到以上这三种方法创建数组都是正确的

初始化

其实在上面的案例中已经涉及到了数组的初始化,数组的初始化分为静态初始化、动态初始化以及默认初始化

动态初始化就是在创建过程中只是声明数组的大小,而由系统为数组分配值

int [] arrNum;
arrNum = new int[5];
int [] arrNum = new int[5];//简化方式


静态初始化 就是由程序员显式的指定每个数组元素的值

int [] arrNum1;
arrNum1 = new int[]{1,2,3,4,5};
int[] arrNum1 = {1,2,3,4,5};//简化方式


这里对于静态初始化的方式,推荐使用第一种方式,不推荐简化方式。

堆栈分析

以上数组创建的方式,其实归根到底总共是俩种方式:

方式一:

int[] arrNum;
arrNum = new int[5];


对于这种方式,实质上第一句是创建了一个引用对象,可以认为是在栈内存中开辟了一个对象,而为这个对象创建了一个空指针,这时候如果没有第二句,那么编译器就会报错空指向异常,第二句的作用就是在堆内存中开辟出大小为5的内存空间

方式二:

int[] arrNum = new int[5];


实际上这种方法就是省去了第一步,也可以说是将对象在堆栈中开辟的过程合为了一个过程

引用传递

既然前面提到了数组实际上是一种引用类型,那么数组是一定可以发生引用传递的,什么叫引用传递?实质就是同一块堆内存空间能够被不同的栈空间所访问,那么数组的引用传递是怎么实现?

案例二:

public class ArrayDemo {
public static void main(String[] args) {
int[] arrNum;
arrNum = new int[]{1, 2, 3, 4, 5};
int[] temp = arrNum;
temp[0] = 10;
for (int i = 0;i < arrNum.length; i++){
System.out.println(arrNum[i]);
}
}
}
输出:
10
2
3
4
5

Process finished with exit code 0


这个时候对于语句
int[] temp = arrNum;
 执行的就是将temp数组在栈内存空间中开开辟的地址指向和data数组同样的堆内存地址,而这个时候改变temp[0]的值实质上同时改变了arrNum[0]的值。

总结

以上就是详细的学习了数组的一些相关操作,但是这只是为了掌握数据的底层一些设计,在实际工作中,不管动态还是静态的方法一般都不会用到,因为数组有一个最大的缺点就是数组的长度不能改变,实际过程中一般都是通过传值或者别的方式进行动态的生成数组,而不是提前指定数组的大小。

Java创建数组的几种方式

数组在C++和java中的区别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: