数组Array
1、概述
数组是同一类型数据的集合
数组是一个对象
数组包含元素,即数组中存放的数据,这些数据可以是任意类型(基本或引用),但同一数组只能保存同一类型的数据
声明数组并没有创建对象,还是要new创建对象
数组是在别的类型的基础上加[ ]形成的新类型
2、声明数组类型变量
数组类型就是基本数据类型或引用数据类型加[]
例如:
int[] a;
byte[] b;
String[] str;
Student[] stu;
注:数组类型的变量将来要指向对象
3、创建(new)数组对象
1)数组对象的长度
数组的长度是指一个数组对象中可以存放多少个数据(元素)。
每一个数组对象在被创建的时候,就需要指明其长度是多少,并且该长度一旦确定的就不能再做修改。
2)数组对象的创建
使用new关键字
例如:
int[] a=new int[4];//4表示数组长度
byte[] b=new byte[3];
String[] str=new String[2];
Student[] stu=new Student[5];
3)数组对象的长度 length属性
数组对象访问length属性,查看数组长度;对象数组创建后长度就不能改变了
例如:
int[] a=new int[4];
System.out.println(a.length);//输出:4
4、数组对象的初始化和使用
1)数组在堆内存中是一块连续的内存空间,这里存放多个类型相同的数据
2)数组对象每个元素的默认值和声明该数组的原类型的默认值相同
例如:
int[] a=new int[4];
//没有赋值的话a数组打印出来是:[0 0 0 0]
整型数组的默认值是 0
浮点型数组的默认值是 0.0
布尔类型数组的默认值是 false
字符类型数组的默认值是 0
引用类型数组的默认值是 null
3)数组对象元素位置的下标
数组对象再堆区是一块连续的内存空间,我们可以通过连续的下标值找到,找到每一个可以存放元素的位置
注:下标从0开始到数组的length-1
例如:
int[] a=new int[4];
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
System.out.println(a[3]);
输出结果:
0
0
0
0
4)使用下标对数组进行赋值初始化
例如:
String [] str=new String[3];
str[0]="hello1";
str[1]="hello2";
str[2]="hello3";
for(int i=0;i<str.length;i++){
System.out.println(str[i]);
}
输出结果:
hello1
hello2
hello3
5)其他的赋值形式
//编译通过
int[] a1 = new int[]{1,3,5,7,9};
System.out.println(a1.length);//5
//编译通过
int[] a2 = {2,4,6,8};
System.out.println(a2.length);//4
//编译通过
int[] a4;
a4 = new int[]{1,2,3};
System.out.println(a4.length);//3
/*下面俩种情况是错误的创建方式*/
//编译报错
int[] a3 = new int[3]{1,2,3};
//编译报错
int[] a4;
a4 = {1,2,3};
6)数组下标越界
数组的下标为0到数组的length-1;若超过这个值就会报错
例如:
int[] a = new int[4];
a[4] = 10;
运行后结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at com.briup.test.ArrayTest.main(ArrayTest.java:7)
数组下标越界:ArrayIndexOutOfBoundsException
5、数组拷贝
方法1:
java.lang.System类提供了arraycopy方法
System.arraycopy();
这个方法是一个五参的方法:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos,int length)
第一个参数被复制数组
第二个参数从哪里开始复制,
第三个参数需要复制到的新的数组
第四个参数 复制到新数组的哪个位置开始
第五个参数被复制数组的长度
例如:
//写一个方法,接收一个数组对象,把这个数组对象的长度扩大到原来的2倍并返回。
public int[] test(int[] a){
int[] b = new int[a.length*2];
System.arraycopy(a, 0, b, 0, a.length);
return b;
}
方法2:
数组的工具类java.util.Arrays类中的copyOf方法;复制或者截取指定数组并返回
Arrays.copyOf(参数1,参数2)
参数1:被复制的数组
参数2:复制后的数组长度
例如:
//将a数组长度扩大两倍
int[] a = {1,3,5,7};
a = Arrays.copyOf(a, a.length*2);
System.out.println(Arrays.toString(a));
//输出结果:
[1, 3, 5, 7, 0, 0, 0, 0]
6、数组的工具类Arrays类(java.util包下)
注:Arrays中方法都是static修饰的静态方法,是随类加载的,直接用类名调用
例如:Arrays.copyOf()
Arrays类中常用的方法:
toString方法,把数组转换位字符串形式并返回
例如:
int[] a=new int[]{1,2,3};
System.out.println(Arrays.toString(a));
//输出结果:
[1 2 3]
binarySearch方法,在数组中查找指定元素并返回其下标
例如:
int[] a=new int[]{1,2,3};
System.out.println(Arrays.binarySearch(a,2));
//输出结果:
3
copyOf方法,复制或者截取指定数组并返回
注:例子在上面数组拷贝中有
asList方法,可以把数组转换为List集合。
例如:
int[] a=new int[]{1,2,3};
List list=Arrays.asList(a);
sort方法,把数据中的元素进行排序
例如:
int[] a=new int[]{1,4,3,2};
Arrays.sort(a);
System.out.println(Arrays.toString(a));
//输出结果:
[1 2 3 4]
fill方法,用指定值去填充数组对象
例如:
int[] a=new int[]{1,2,3};
Arrays.fill(a,6);
System.out.println(Arrays.toString(a));
//输出结果:
[6 6 6]
7、二维数组
1)概念
int[] a;一维数组、
int[][] b;一个一维数组类型加[],生成二维数组 ;存放该一维数组类型的内存地址值,要一位数组地址值,在该地址值下的一维数组找数据。
二维数组可以用来表示坐标
2). 赋值 new对象
1) int[][] a= new int[2][]; 前面括号[]表示二维数组可以存几个一维数组,后面[]表示一维数组
2) int[][] a=new int[2][3]; 等同于 int[][] a=new int[2][];
a[0]=new int[2];//a[0]存放一个长度为2的一维数组地址值
a[1]=new int[3];//a[1]存放一个长度为3的一维数组地址值
3)int[2]={1,2} 则a[0][0]=1 , a[0][1]=2;
int[][] d=new int[2][]表示:
int[][] d={
{一维数组}
{一维数组}
}