Java数组、动态数组、二维数组的应用
一、认识数组
1、容器的概念
用于存储数据的一块内存称为容器,生活中有很多容器,例如水杯,衣柜,以及存放“东西”
存放在容器中的数据,称为“元素”
2、为什么会存在数组呢?
假如现在存储全班同学的成绩,全班40人,按照定义变量的思维,需要定义40个double类型的数据变量,每次从40个变量中找一个变量,操作很麻烦,java中可以定义以和数据类存放40个人的成绩,使用数据类型存储
数组定义:它是相同数据类型的有序集合
3、数据特点
-
数组的长度固定(数据的长度一旦声明,就不能改变)
-
数组中存储的元素数据类型必须相同
-
数组的元素 通过下标访问,且下标默认从0开始
-
数组类型属于引用数据类型,数组的元素类型 既可以是基本数据类型也可以是引用数据类型
4、数组的创建方式
方式一
数组存储的数据类型 [] 数组名 = new 数组存储的数据类型 [长度]
详解:
数组存储的数据类型:创建数组容器中可以存储说明数据类型(基本数据类型、引用数据类型)
[]:表示数组
数组名:给数组起名字,遵循标识符规则
new:创建数组的关键字
[长度]:数组的长度,这个长度定义后不可改变 可表示为array.length
例如
int [] arr = new int[3];
new出来的空间在堆内存中,数组是引用数据类型,存在内存地址
内存解析:在堆内存中开票一段连续的3个长度的int类型的内存空间,并由arr变量指向这块内存地址(换句话说rr输出就是这个内存的地址)
方式二
数据类型 [] 数组名 = new 数据类型 []{元素1,元素2,元素3.。。。。 }
这里的数组长度就是元素的个数自动分配大小
int[] arr = new int[]{99 .97 .95};
或者
int arr [] = new int[]{90,95,96,94}
方式三
数据类型 [] 数组名 = {元素1,元素2,元素3.。。}
注意:这里的元素类型必须满足数组的元素数据类型
char [] arr = {'a','b','c'}
或者
char arr [] = {'a','b','c'}
5、数组的访问
数组的访问通过索引访问
索引(下标):每一次数组的元素都有一个编号,这个编号从0开始,这个编号称为数组的索引,通过数组名[索引]访问到数组的元素
例如:访问数组的第二个元素:数组名[1];
数组的长度:数组的长度声明以固定,访问数组的长度:数组名.length
数组的最大索引 = 数组长度 - 1
数组元素的赋值:通过索引可以给元素赋值 数组名[索引] = 值 将数据赋值给指定索引的元素
二、动态数组
1、数组的定义
用于存储相同数据类型的一组连续的存储空间
2、 数组的特点
数组的长度一旦定义,则不可改变
访问数组元素需要通过下标(索引)访问,下标从零开始
数组是引用数据内存,内存分布在堆内存中,数组的变量存储在内存地址
3、动态数组
由于数组的长度定义后不能改变,所谓“动态数组”是可以增加数据长度,所以java实现动态数组是改变数组变量指向不同的内存地址,本质并没有将数组的长度改变
动态数组的本质:将内存空间的改变,以及指向数组内存地址的改变
操作1:数组添加新元素,可添加在最后面,也可以添加到指定位置
/**
* 添加元素,(添加到末尾)
*/
public static int[] addEle(int []array ,int num){
//初始数组 添加的元素
// int array [] = {10,9,3,2,1};
//1、创建临时数组的长度
int [] tempArray = new int[array.length+1];
//2\将目标数组的元素 copy到 临时数组的内存中
for (int i=0;i<array.length;i++){
tempArray[i]=array[i];
}
//3、将添加的元素放入临时数组中
tempArray[tempArray.length-1]=num;
//4、将目标数组的地址 指向 临时数组的地址
array=tempArray; //由于tempArray 是局部变量 方法执行完内存自动回收
// 如果不返回 没有地址指向tempArray的内存
// 如果返回并接受 说明这块内存地址仍然使用
return array;
}
/**
* 将元素num 添加到指定index的位置
* @param args
*/
public static int [] addEle(int [] arr,int num,int index){
//1、创建临时数组的大小
int [] tempArray = new int[arr.length+1]
//2、便利arr
for(int i=0;i<=arr.length;i++){
//如果i<index
if (i<index){
tempArray[i]=arr[i];
}else if (i==index){
tempArray[i]=num;
}else{
//i>index
tempArray[i]=arr[i-1];
}
}
//赋值
arr=tempArray;
return arr;
}
public static void main(String[] args) {
//扩容数组
// int [] array = {5,4,3};
// //动态扩容一个
// array=addEle(array,2);
// for (int i=0;i<array.length;i++){
// System.out.println(array[i]);
// }
// System.out.println(array.length);
//插入到指定下标
int[]arrary={10,9,3,2,1};
arrary = addEle(arrary,5,5);
System.out.println(Arrays.toString(arrary)); // 直接输出数组的每一个元素
}
操作2:可删除元素 删除指定下标元素
/**
* 删除指定下标的数组元素,删除后面的向前缩进一个
*/
public static int [] Ele(int arr[],int index){
//1、创建一个新的临时数组
int tempArray [] =new int[arr.length-1];
for (int i=0;i<arr.length-1;i++){
if (i<index){
tempArray[i]=arr[i];
}else {
tempArray[i]=arr[i+1];
}
//i=3 temparray[3]=arr[4];
//i=4 temparray[4]=arr[4+5];
}
//赋值
arr=tempArray;
return arr;
}
public static void main(String[] args) {
int array []={10,5,4,7,8,6};
array=Ele(array,3);
System.out.println(Arrays.toString(array));
}
三、二维数组
1、二维数组定义
在一维数组中定义每一个元素也是一个数组元素,这样的数组称为“二维数组”多维数组就是在一维数组上再次定义二维数组或 三位数组 等。
一维数组定义
int [] array = { 1, 2 , 3}
二维数组定义
//定义三个长度的二维数组,其数组的每一个元素是一个一维数组
int [][] arrays = {{} ,{} ,{}} ;
或者
int [][] arrays = new int [3][2]; // 左边的【】中表示二维数组的长度 ,其中2可以省略,3 不能省略
// 注意: 等号左边有几个【】 就表示几维
// 1、定义二维数组
int [][] array;
// 定义时给二维数组赋值 3个长度的二维数组 里面的一维数组的长度不一定相等
int [][] array2 = {{1,2,3},{4,5},{7,8}};
// 定义时只指定大小 不给定初始值
int [][] array3 = new int[3][]; // 等价 {{},{},{}}
// array3[0][0]=1; // 赋值时 空指针异常 ,因为里面的一维数组是空的
//定义一个3个长度的二维数组,里面的元素长度是2
int array4 [][] = new int[3][2];
//给元素赋值
array4[0][0] =1;
// 输出二维数组中的所有元素
for(int i=0;i<array4.length;i++){
// System.out.println(array4[i]);
for(int j=0;j<array4[i].length;j++){
System.out.println(array4[i][j]);
}
}
2、二维数组的应用
1、定义5*5的矩阵,计算最大值最小值
2、五子棋游戏