数组的基本概念
所有的开发中都可能使用到数组,但并没有特别复杂,更多的是为了防止笔试中出现的问题
数组指的是一组相关变量的集合
在Java中数组属于引用数据类型,牵扯到内存的关系。对于数组的定义有以下两种语法形式:
声明并开辟数组:
数据类型 数组名称[] = new 数据类型[长度];
如:int data[] = new int[3];
声明数组:
数据类型 数组名称[] = null;
如:int data[];
开辟数组:数组名称 = new 数据类型[长度];
如:data = new int[3];
当数组开辟之后,可采用数组[索引]
的形式进行数组的访问,但是需要注意的是,任何长度的数组其范围一定是从“0”开始的。如果操作中超过了数组所允许的索引范围,则程序会出现ArrayIndexOutOfBoundsException
报错
以上是数组的动态初始化,特点:数组开辟空间之后,数组中每个元素的内容都是其对应数据类型的默认值
数组输出
由于数组本身是一种顺序式的结构,且长度固定,所以在进行数组内容输出的时候,往往可以采用for循环的方式完成。因此就牵扯到数组长度的获取,在Java中可以使用数组.length
的属性获取数组的长度
public class MyClass {
public static void main(String[] args){
int data[] = new int[3];//声明并创建数组
//对数组赋值
data[0] = 10;
data[1] = 20;
data[2] = 30;
//利用数据.length与for循环输出数组
for (int i = 0;i < data.length;i++){
System.out.print(data[i]+"、");
}
}
}
数组的引用分析
引用数据类型的分析过程基本相同,所以数组的引用分析其本质也是一样的,与对象的流程是相同的
声明并开辟数组赋值内存关系图
下图的流程与普通对象的流程本质上是没有任何差别的,唯一的区别是普通对象保存的是属性,利用属性名称来操作,而数组保存的是一组内容,用索引来操作
数组的引用内存关系图
引用的本质是同一个堆内存可以被不同的栈内存所指向并修改
数组的静态初始化
动态初始化:只能在开辟数组空间之后才可以进行赋值
-
静态初始化:在数组开辟的同时就可以存在明确的内容,语法如下:
简化型:
数据类型 数组名称[] = {值,值,...};
完全型(推荐使用):数据类型 数组名称[] = new 数据类型[] {值,值,...};
匿名对象的用法:
new 数据类型[]{值,值,...};
二维数组
二维数组实际上与数据表的形式是相同的,由行和列组成,想要确定一个数据需要得知他的行和列的编号
列索引 0 | 列索引 1 | 列索引 2 | |
---|---|---|---|
行索引 0 | 23 | 5611 | 845 |
行索引 1 | 223 | 61 | 8 |
-
静态初始化:
int data[] = new int[]{{值,值,...},{值,值,...},...}
-
动态初始化:
int data[] = new int[行个数][列个数]
data = {{值,值,...},{值,值,...},...}
二维数组的置换:
public class MyClass {
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++){
//将二维数组进行置换
int temp = data[i][j];
data[i][j] = data[j][i];
data[j][i] = temp;
}
}
for (int i = 0; i < data.length; i++){
for (int j = 0; j < data[i].length; j++){
System.out.print(data[i][j]);//输出
}
System.out.println();
}
}
}
一般用于训练逻辑思维
数组相关操作方法
数组拷贝
System.arraycopy(原始数组,原始数组开始点,目标数组,目标数组开始点,拷贝长度);
范例:
- 原始数组①: 1、、、、5、6、7、8、9;
- 原始数组②:10、20、30、40、50、、、、90;
- 希望将数组②的部分内容替换掉数组1的内容:
class ArrCopy{
public static void main(String[] args){
int data1[] = new int[]{1,2,3,4,5,6,7,8,9};
int data2[] = new int[]{10,20,30,40,50,60,70,80,90};
System.arraycopy(data2,5,data1,1,3);
printArr(data1);
}
public static void printArr(int data[]){
for (int i = 0; i < data.length; i++){
System.out.print(data[i]+"、");
}
}
}
运行结果:1、60、70、80、5、6、7、8、9
数组排序
Arrays.sort(原始数组);
范例:
- 原始数组:2、1、6、4、3、9、7、8、5
class ArrSort{
public static void main(String[] args){
int data[] = new int[]{2,1,6,4,3,9,7,8,5};
Arrays.sort(data);
printArr(data);
}
public static void printArr(int data[]){
for (int i = 0; i < data.length; i++){
System.out.print(data[i]);
}
}
}
运行结果:1、2、3、4、5、6、7、8、9
总结
- 数组属于引用数据类型
- 数组属于线性的存储结构,里面的内容可以根据索引线性操作
- 数组里面容易出现面试题!