昨天学完了面向对象的进阶内容,不过对面向对象还是没有什么感觉啊,不敢那么多了,继续往后学!今天我们学习一下数组。
一. 一维数组
数组这个概念就不陌生了,就不做实例来引进概念了。
数组是相同类型数据的有序集合。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。
数组的几大特点:
- 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
- 其元素必须是相同类型,不允许出现混合类型。
- 数组类型可以是任何数据类型,包括基本类型和引用类型。
- 数组变量属引用类型,数组就是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组对象本身是在堆中存储的。
接下来就来看看一维数组是如何声明的。一维数组的声明形式有两种:
数据类型[] 数组名; //比方说我们一直在写的:String[] args
数据类型 数组名[];
一般推荐使用上面的那种声明方式,Java要有Java的亚子。
注意事项:
- 声明的时候就只是声明(在栈帧的局部变量表中有一个新变量),并没有实例化任何对象(堆是没有开辟新内存的),只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。
- 声明一个数组的时候并没有数组真正被创建。
- 构造一个数组,必须指定长度。
好了,既然声明的时候没有实例化对象,那么将数组实例化对象(初始化)的方法有哪些呢?
- 静态初始化
除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。举例:
int[] arr = { 1, 2, 3 };// 静态初始化基本类型数组;
Man[] mans = { new Man(1, 1), new Man(2, 2) };// 静态初始化引用类型数组;
注意:在静态初始化中,你写了多少个值或创建了多少对象,那么这个个数将成为数组的长度,并且不再改变!
- 动态初始化
数组定义与为数组元素分配空间并赋值的操作分开进行。举例:
int[] arr = new int[2];//动态初始化数组,先分配空间;
arr[0]=1;//给数组元素赋值;
arr[1]=2;//给数组元素赋值;
动态初始化还可以通过循环赋值的方式实现。如果给的数组长度大于你赋值的长度,那么剩下的元素将会以默认值存储,来看看默认初始化吧。
- 数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。举例:
int[] arr = new int[2]; // 默认值:0,0
boolean[] b = new boolean[2]; // 默认值:false,false
String[] s = new String[2]; // 默认值:null, null
这里的默认值规则和成员变量默认值规则一致!
注意:元素是引用类型的话,默认初始化值为null,当你需要访问元素的属性的时候,必须先对其进行初始化,否则因为是null,会报出空指针异常的错误。
数组的遍历(以代码形式学了):
package cn.zjb.test;
/**
* 测试数组的运用
* @author 张坚波
*
*/
public class TestArrays extends Object{
public static void main(String[] args) {
int[] arr=new int[5]; //默认初始化
//默认值
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]); //和C语言的printf()一样,不换行的
System.out.print('\n');
//动态初始化
for(int i=0;i<arr.length;i++)
arr[i]=i;
//初始化以后的值
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]);
System.out.print('\n');
/*
* 增强for循环for-each是JDK1.5新增加的功能,专门用于读取数组或集合中所有的元素,即对数组进行遍历。
*具体格式: for(数组的数据类型 临时变量 : 数组名){...}
*/
for(int temp : arr)
System.out.print(temp);
System.out.print('\n');
}
}
注意:
- Java数组中length,一般来说都容易把它看成是数组的一个属性。但是我们却找不到相应的源码或者说明。其实,数组中length并不是一个属性,更不是一个方法。在一个数组对象上调用length,会被Java编译器编译成一条arraylength指令(Java binary code)。也就是说这不是具体Java代码实现的,是编译器底层通过调取指令来获取长度。不过在当前阶段,不必过于纠结,我们都知道定义数组必须要给这个数组一个长度,那么我们就把length当成是自己定义的长度!
- 增强for循环for-each 只能用来访问数组的值,不能进行数据的修改或者其他改变原数组的操作!因为在循环过程中不涉及有关索引(下标)的操作,只是增加了一个临时变量来存对应元素值。
数组的拷贝(arraycopy方法的使用):
System类里也包含了一个 static void arraycopy(object src,int srcpos,object dest, int destpos,int length) 方法,该方法可以将src数组里的元素值赋给dest数组的元素,其中srcpos指定从src数组的第几个元素开始赋值,destpos指定赋值到dest数组的某个位置开始,length参数指定将src数组的多少个元素赋给dest数组的元素。(src–source, dest–destination, pos-- position)
我们只需要System.arraycopy 就可以使用了,举个例子:
package cn.zjb.test;
/**
* 测试System类 写好的 arraycopy方法
* @author 60507
*
*/
public class TestArrayCopy {
public static void main(String[] args) {
int[] arr1= {1,2,3,4};
int[] arr2=new int[5];
//一个数组拷贝到另一个数组
System.arraycopy(arr1, 0, arr2, 0, arr1.length); //将arr1的三个元素拷贝到arr2中,从索引0开始
for(int temp : arr2)
System.out.print(temp);
System.out.print('\n');
//删除一个数组的某个值,假设删去3
System.arraycopy(arr1, 3, arr1, 2, 1);
arr1[3]=0; //赋值
for(int temp : arr1)
System.out.print(temp);
System.out.print('\n');
delArrDatas(arr1,1,3);
for(int temp : arr1)
System.out.print(temp);
System.out.print('\n');
}
//删去数组中两任意位置之间的值
static int[] delArrDatas(int[] a,int start,int end) {
System.arraycopy(a, end+1, a, start, a.length-1-end);
int i=1;
do {
a[a.length-i]=0;
i++;
}while(i<=end-start+1);
return a;
}
}
二. 多维数组
多维数组可以看成以数组为元素的数组。可以有二维、三维、甚至更多维数组。
我们以二维数组做例子,其他维度的实质是一样的:
二维数组可以看成是一维数组,而这些元素类型又是一维数组。这一点和C语言有点不太一样,C语言的二维数组可以看作是矩阵的形式,但是Java的二维数组不一定是矩阵,它的灵活性会更强。
二维数组的声明及初始化:
// Java中多维数组的声明和初始化应按从低维到高维的顺序进行
int[][] a1 = new int[3][]; //元素为3个一维数组
a1[0] = new int[2];
a1[1] = new int[4];
a1[2] = new int[3];
// int a1[][]=new int[][4];//非法
//静态初始化
int[][] a = { { 1, 2, 3 }, { 3, 4 }, { 3, 5, 6, 7 } };
//动态初始化
int[][] a3 = new int[3][];
// a3[0] = {1,2,5}; //错误,没有声明类型就初始化
a3[0] = new int[] { 1, 2 };
a3[1] = new int[] { 2, 2 };
a3[2] = new int[] { 2, 2, 3, 4 };
这是二位数组a的内存图:
获取二维数组的长度:
//获取的二维数组第一维数组的长度。
System.out.println(a.length);
//获取第二维第一个数组长度。
System.out.println(a[0].length);
总结:
今天太懒了。。。
来源:CSDN
作者:咱能给力点吗
链接:https://blog.csdn.net/weixin_44170240/article/details/104194845