数组
数组的定义
数组是相同数据类型的元素的集合
在Java中的数组是引用类型中的对象,可以存储基本数据类型也可也存储引用类型的数据类型,取决于声明数组时所定义的数据类型
数组内部可以划分多个空间,数组对象指定空间数量(数组长度),一旦数组长度确定就无法更改了,这些空间在在内存中是连续的
数组的声明方式
第一种:数据类型 [ ] 名称;例:int [ ] a; 第二种:数据类型 名称 [ ];例: int a [ ];
一般建议采用第一种声明方式,因为第二种声明方式容易与变量混淆,例如在两个数组的时候 int b,a[ ];此时的b为变量而不是int型的数组
int []c,d ;//此时c,d都为数组
int a, b[];//此时a为变量,b为数组
int []q=new int[5];//定义一个整数型的数组
System.out.println(q);//数组属于对象,若直接输出对象名则会默认返回对象在内存中对应哈希表内的地址
System.out.println(Arrays.toString(q));//利用Arrays.toString方法可以将数组中的元素输出
//整数型数组未赋值则元素默认值为0
char []w=new char[5];//定义一个字符型数组
System.out.println(Arrays.toString(w));//字符型数组元素默认值为空格
float []e=new float[5];//定义一个浮点型数组,double型相同
System.out.println(Arrays.toString(e));//浮点型数组元素默认值为0.0
String []r=new String[5];//定义一个引用类型的数组
System.out.println(Arrays.toString(r));//引用类型数组元素默认值为null
boolean []k=new boolean[3];//定义一个布尔类型的数组
System.out.println(Arrays.toString(k));//布尔类型数组元素默认值为flase
由于数组是一个对象,所以如果直接输出数组名,此时不会直接返回数组中的元素,而是会返回数组对象在内存中对应的哈希表中的存储的地址
数组的创建方式
1.数据类型 [] 名称=new 数据类型[长度];//使用该方式创建长度不能为空 2.数据类型 [] 名称=new 数据类型[]{元素,元素,.....,元素}//该方式创建无需填写数组长度,可以直接定义数组元素 3.数据类型 [] 名称={元素,元素,.....,元素}//方式2的简化
int []t=new int[5];//方式1,创建一个长度为5元素为默认值得数组
int []y=new int[]{0,1,2,3,4};//方式2
System.out.println(Arrays.toString(y));
int []u={0,1,2,3,4};//方式3
System.out.println(Arrays.toString(u));
数组元素的访问
访问方式: 数组名称 [ ];
数组在创建时,内存就会为为数组所创建的各个空间进行编号,这个编号被称为索引
索引的特点:从0开始的int型整数数据;最大值是数组长度减去1
由于是int类型的数据故索引的最大值为int类数据的最大值,且由此可以得知,理论上数组的最大长度也是int类数据的最大值,但是这也受限于内存的大小,如果内存大小不够大则无法分配这么大的数组空间
int []a =new int[5];
System.out.println(a.length);//利用数组对象的属性length可以获取数值的长度
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
a[4]='b';//自动转换数据类型
//a[5]=5;//数组定义长度为5,故索引为4的元素已经是数组最后一个元素了,
// 但是由于数组对象还未真正创建,在编译器中不会报错,但在运行时会发生错误
/*
运行时发生错误 异常类型
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5(报错原因)
at day1.Demo2.main(Demo2.java:22)(报错位置)
*/
System.out.println(Arrays.toString(a));//使用Arrays.toString方法输出数组
数组的遍历
在对数组的操作过程中,很多操作需要对数组进行遍历,例如找数组中的最大值,对数组进行排序,查询有无指定的元素
数组遍历的两种方式:
1.for循环
2.增强for循环
增强for循环:每次循环一次都会从数组中取出一个元素赋值个一个定义好的变量,然后再进入循环体,重复以上操作直到循环结束
语法格式:for(int i :a){循环体} i: 声明的变量,需要与数组元素的类型一致
a: 需要遍历的数组
/*
for循环遍历
*/
int[]a=new int[]{1,2,3,4,5};
for (int i = 0; i < a.length; i++) {//i从0开始对应的数组的索引
System.out.println(a[i]);
}
/*
增强for循环
每进入一次循环从数组中取出一个元素赋给变量t,再进入循环体,重复以上操作
语法:for(int t :a){}
t:声明一个变量需要与数组的类型一致
a:需要遍历的数组
*/
int[]b=new int[]{1,2,3,4,5};
for(int j:b){
System.out.println(j);
}
/*
找出数组中最大值
*/
int max=Integer.MIN_VALUE;
for (int i = 0; i < b.length; i++) {
max=(b[i]>max)?b[i]:max;
}
System.out.println(max);
使用场景:
需要特定索引找出指定的元素时的时候使用for循环
若不需要索引,而是只需要对元素进行判断用增强for循环
二维数组
二维数组是数组的数组,即数组的每个元素都是一个一维数组
二维数组的声明方式:int [ ] [ ] a; int a [ ] [ ];与一维数组一样建议使用第一种声明方式
二维数组的创建:
1. int [ ] [ ] a=new int [二维数组长度] [一维数组长度];
2. int [ ] [ ] a=new int [ ] [ ]{{{……},{……},……,{……}};
3. int [ ] [ ] a={{{……},{……},……,{……}};
以第一种方式创建二维数组时若是只声明了二维数组的长度而未声明一维数组的长度,则只创建了二维数组而未定义一维数组,
例int [ ] [ ] a =new int[3] [ ]; 该方法只创建了一个长度为3的二维数组,二维数组内的元素为{null,null,null}
此时可以利用a[i]=new int[ ]{……};来定义二维数组中的一维数组
/*
二维数组的声明
数据类型 [] [] 名称;
数据类型 名称 [] [];
*/
int[] []a;
int b[] [];
/*
二维数组的创建
*/
int[][]c=new int[3][3];
int[][]d=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
int[][]e={{1,2,3},{4,5,6},{7,8,9}};
//只创建二维数组,一维数组未定义,此时数组为{null,null,null}即一维数组都为null,可以单独定义一维数组
int[][]g=new int[3][];
g[0]= new int[]{1,2,3,4};//此时定义一维数组只能用第一种方式创建
g[1]= new int[]{5, 6};
g[2]= new int[]{7,8,9};
//定义完之后数组变为{{1,2,3,4},{5,6},{7,8,9}}
二维数组的遍历
若直接利用Arrays.toString()方法输出二维数组,也无法直接输出二维数组中一维数组的元素集合 需要利用for循环才能遍历二维数组的所有元素
/*
二维数组的声明
数据类型 [] [] 名称;
数据类型 名称 [] [];
*/
int[] []a;
int b[] [];
/*
二维数组的创建
*/
int[][]c=new int[3][3];
int[][]d=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
int[][]e={{1,2,3},{4,5,6},{7,8,9}};
//只创建二维数组,一维数组未定义,此时数组为{null,null,null}即一维数组都为null,可以单独定义一维数组
int[][]g=new int[3][];
g[0]= new int[]{1,2,3,4};//此时定义一维数组只能用第一种方式创建
g[1]= new int[]{5, 6};
g[2]= new int[]{7,8,9};
//定义完之后数组变为{{1,2,3,4},{5,6},{7,8,9}}