Java中数组的定义与使⽤(⼀)
数组的基本概念
如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下:
int i1, i2, i3, ... i100;
但是这个时候如果按照此类⽅式定义就会⾮常⿇烦,因为这些变量彼此之间没有任何的关联,也就是说如果现在突然再有⼀个要求,要求你输出这100个变量的内容,意味着你要编写System.out.println()语句100次。
其实所谓的数组指的就是⼀组相关类型的变量集合,并且这些变量可以按照统⼀的⽅式进⾏操作。数组本⾝属于引⽤数据类型,那么既然是引⽤数据类型,这⾥⾯实际⼜会牵扯到内存分配,⽽数组的定义语法有如下两类。
数组动态初始化:
声明并开辟数组:
数据类型 [] 数组名称 = new 数据类型[长度];
数据类型 [] 数组名称 = new 数据类型[长度];
分布进⾏数组空间开辟(实例化)
| Tables | Are |
| ------------- |:-------------?
| 声明数组: | 数组类型 数组名称[] = nu ll; | | | 数组类型 [] 数组名称 =null; | | 开辟数组空间: | 数组名称 =new` 数组类型[长度]; |
那么当数组开辟空间之后,就可以采⽤如下的⽅式的操作:
数组的访问通过索引完成,即:“数组名称[索引]”,但是需要注意的是,数组的索引从0开始,所以索引的范围就是0 ~ 数组长度-1,例如开辟了3个空间的数组,所以可以使⽤的索引是:0,1,2,如果此时访问的时候超过了数组的索引范围,会产
⽣java.lang.ArrayIndexOutOfBoundsException 异常信息;
当我们数组采⽤动态初始化开辟空间后,数组⾥⾯的每⼀个元素都是该数组对应数据类型的默认值;
数组本⾝是⼀个有序的集合操作,所以对于数组的内容操作往往会采⽤循环的模式完成,数组是⼀个有限的数据集合,所以应该使⽤for 循环。
在 Java 中提供有⼀种动态取得数组长度的⽅式:数组名称.length;
范例: 定义⼀个int型数组
public class ArrayDemo {
public static void main(String args[]){
int data[]=new int[3];/*开辟了⼀个长度为3的数组*/
data[0]=10;// 第⼀个元素
data[1]=20;// 第⼆个元素
data[2]=30;// 第三个元素
for(int x =0; x < data.length; x++){
System.out.println(data[x]);//通过循环控制索引
}
}
}
数组本⾝除了声明并开辟空间之外还有另外⼀种开辟模式。
范例: 采⽤分步的模式开辟数组空间
public class ArrayDemo {
public static void main(String args[]){
int data[]= null;
data =new int[3];/*开辟了⼀个长度为3的数组*/
data[0]=10;// 第⼀个元素
data[1]=20;// 第⼆个元素
data[2]=30;// 第三个元素
for(int x =0; x < data.length; x++){
System.out.println(data[x]);//通过循环控制索引
}
}
}
但是千万要记住,数组属于引⽤数据类型,所以在数组使⽤之前⼀定要开辟控件(实例化),如果使⽤了没有开辟空间的数组,则⼀定会出现 NullPointerException 异常信息:
public class ArrayDemo {
public static void main(String args[]){
int data[]= null;
System.out.println(data[x]);
}
}
这⼀原则和之前讲解的对象是完全相同的。
数组在开发之中⼀定会使⽤,但是像上⾯的操作很少。在以后的实际开发之中,会更多的使⽤数组概念,⽽直接使⽤,99%情况下都只是做⼀个 for 循环输出。
数组引⽤传递
既然数组属于引⽤数据类型,那么也⼀定可以发⽣引⽤传递。在这之前⾸先来研究⼀下数组的空间开辟。
范例: 观察⼀道程序
public class ArrayDemo {
public static void main(String args[]) {
int data[] = null;
data = new int[3]; //开辟⼀个长度为3的数组定义数组初始化
data[0] = 10;
data[1] = 20;
data[2] = 30;
}
}
那么既然说到了引⽤数据类型了,就⼀定可以发⽣引⽤传递,⽽现在的引⽤传递的本质也⼀定是:同⼀块堆内存空间可以被不同的栈内存所指向。
范例: 定义⼀个程序
public class ArrayDemo {
public static void main(String args[]){
int data[]= null;
data =new int[3];//开辟⼀个长度为3的数组
int temp[]= null;//声明对象
data[0]=10;
data[1]=20;
data[2]=30;
temp = data;//int temp[] = data;
temp[0]=99;
for(int i =0; i < temp.length; i++){
System.out.println(data[i]);
}
}
}
引⽤传递分析都是⼀个套路。同⼀块堆内存被不同的栈内存所指向。
数组静态初始化
在之前所进⾏的数组定义都有⼀个明显特点:数组先开辟内存空间,⽽后再使⽤索引进⾏内容的设置,实际上这种做法都叫做动态初始化,⽽如果希望数组在定义的时候可以同时出现设置内容,那么就可以采⽤静态初始化完成。
数组的静态初始化⼀共分为以下两种类型:
Tables Are
简化格式:数据类型 数组名称 = {值, 值,…}
完整格式:数据类型 数组名称 = new 数据类型[] {值, 值,…}
范例: 采⽤静态初始化定义数组
public class ArrayDemo {
public static void main(String args[]){
int data[]={1,2,4,545,11,32,13131,4444};
for(int i =0; i < data.length; i++){
System.out.println(data[i]);
}
}
}
在开发之中,对于静态数组的初始化强烈建议使⽤完整语法模式,这样可以轻松地使⽤匿名数组这⼀概念。
public class ArrayDemo {
public static void main(String args[]){
System.out.println(new int[]{1,2,4,545,11,32,13131,4444}.length);
}
}
以后使⽤静态⽅式定义数组的时候⼀定要写上完整格式。
数组最⼤的缺陷:长度固定。
⼆维数组
在之前所使⽤的数组发现只需要⼀个索引就可以进⾏访问,那么这样的数组实际上⾮常像⼀个数据⾏的概念。
索引012345678
内容122344569044549991010
现在痛过⼀个索引就可以取得唯⼀的⼀个记录。所以这样的数组可以简单理解为⼀维数组,⽽⼆维数组本质上指的是⾏列集合,也如果要确定某⼀个数据需要⾏索引和列索引来进⾏定位。
索引012345678
0122344569044549991010
1234156945499910
如果要想确定⼀个数据则数据使⽤的结构是“数组名称[⾏索引][列索引]”,所以这样的结构就是⼀个表的结构。
那么对⼆维数组的定义有两种声明形式:
数组的动态初始化:数据类型 对象数组[][] = new 数据类型[⾏个数][列个数];
数组的静态初始化:数据类型 对象数组[][] = new 数据类型[⾏个数][列个数]{{值, 值,…}, {值, 值,…},…};
数组的数组就是⼆维数组。
范例: 定义⼀个⼆维数组
public class ArrayDemo {
public static void main(String args[]){
//此时的数组并不是⼀个等列数组
int data[][]=new int[][]{
{1,2,3},{4,5},{6,7,8,9}};
//如果在进⾏输出的时候⼀定要使⽤双重循环,
//外部的循环控制输出的⾏数,⽽内部的循环控制输出列数
for(int i =0; i < data.length; i++){
for(int j =0; j < data[i].length; j++){
System.out.print("data["+ i +"]["+ j +"]="+ data[i][j]+"、");
}
System.out.println();
}
}
}
由于输出⿇烦,所以可以忽略了,在进⾏开发之中,出现⼆位数组的⼏率并不⾼。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。