数组
1、概述
1.1 定义
数组是一组数据的集合,数组中的每个数组被称为元素。
例如:下面这串代码可以直接用数组来表示
int a1 = 1;
int a2 = 2;
int a3 = 3;
int a4 = 4;
 
数组表示:
int[] arr = {1,2,3,4);  //用数组来保存了这四个数据。
 
在java中,数组也可以看成是个对象,数组中的元素可以为任意类型(基本类型或者引用类型),但同一个数组里只能存放类型相同的元素。
其实main方法中的参数是一个String类型的数组
public static void main(String [] args){...}
 
1.2 数组类型
任意类型+[ ]就组成了数组的类型

1.3 数组变量
声明数组变量的两种方式:
int [] a; //推荐使用
int a[]; 
 
数组类型的变量也是引用类型变量,简称引用,是可以指向对象的
1.4 数组对象
使用new关键字来创建数组对象,中括号中的数字表示数组的长度,如下
int[] a = new int[4];
String[] == new String[2];
char[] c = new char[1];
 
数组对象在内存中的显示
数组对象在内存中是一片连续的存储空间,在这片连续的存储空间中可以存放多个类型相同的数据。堆内存中会开辟一片空间来存储数组对象,如图:
 
1.5 数组长度
1、数组长度是指在一个数组对象中最多可以存放多少个同一类型的数据
 2、数组长度必须在创建数组对象的时候就明确指定
 3、数组长度一旦确定就无法改变,长度可以为0,但不能为负数
可以通过length属性来获取数组长度,如下
int[] a = new int[4];
System.out.println(a.length); //4
 
1.6 数组下标
1、数组下标是区间为[0,arr.length-1],表示如果数组长度为length,则数组下标最小值为0,最大值为length-1,数组下标默认从0开始,到数组长度-1为止。
2、当超过数组长度的时候会发生数组角标越界异常
数组赋值或取值
//创建数组对象
int[] a = new int[4];
//赋值
a[0] = 337;
a[1] = 340;
a[2] = 358;
a[3] = 352;
//取值
Syso(a[0]);
int num = a[0]+a[1]+a[2]+a[3];
Syso(num);
 
数组通过循环赋值或取值
//创建数组对象
int[] a = new int[4];
//赋值
for(int i = 0; i<a.length; i++){
	a[i] = 1+i;
}
//取值
for(int i = 0; i<a.length; i++){
	Syso(a[i]);
}
 
1.7 各类型数组的默认初始值
一个数组对象在创建时,需要指定数组长度,表示数组最多存放的元素个数,并且在数组对象创建完成之后,数组每一个元素位置上就会有相应的默认值,默认值个数组类型有关。
2、数组创建方式
(1)创建数组对象与赋值分开进行
int[] arr = new int[5];
arr[0] = 1;
arr[1] = 3;
arr[2] = 5;
arr[4] = 7;
arr[5] = 9;
 
(2)创建数组对象同时赋值
int[] arr = new int[]{1,3,5,7,9};
 
(3)创建数组的简单形式
int[] arr = {1,3,5,7,9};
 
(4)先显示声明数组类型变量,然后创建对象,并赋值
int[] arr;
arr = new int[]{1,3,5,7,9};
 
下面一些方式是错误的
 错误方式一:声明数组长度的同时赋值
int[] a = new int[3]{1,3,5};
 
错误方式二:
int[] a;
a = {1,2,3};
 
3、数组拷贝
数组对象的长度确定之后就不能修改了,但可以通过赋值数组的内容变通实现改变数组长度,在java.lang.System类中提供了一个名为arraycopy的方法可以实现复制数组中元素的功能。
public static void arraycopy(Object src,
							 int srcPos,
							 Object dest,
							 int destPos,
							 int length)
//参数1:需要被复制的目标数组
//参数2:从目标数组的哪一个位置开始复制
//参数3:需要把数据复制到另一个新的数组对象
//参数4:新数组中数据开始复制的位置
//参数5:复制的目标数组的长度
 
常用方式
例如,写一个方法,接收一个数组对象,把这个数组对象的长度扩大到原来的2倍并返回。
public int[] test(int[] a){
	int[] b = new int[a.length*2];
	System.arraycopy(a,0,b,0,a.length);
	return b;
	}
 
5、数组常用工具类Arrays
java.util.Arrays类,是JAVASE API中提供给我们使用的一个工具类,这个类的作用就是在代码中辅助我们对数组对象进行操作的。里面有很多静态方法可以直接调用,主要的功能就是对数组对象进行操作,例如排序、查询、复制、填充数据等等。
 常用方法有:
 (1)**toString()**方法
 把一个数组变为对应的String形式
(2)**copyOf()**方法
 把一个数组进行复制(该方法中也是采用了arraycopy方法来实现的功能)
(3)**copyOfRange()**方法
 也是复制数组的方法,但是可以指定从哪一个下标位置开始复制(该方法中也是采用了arraycopy方法来实现的功能)
(4)**sort()**方法
 可以对数组进行排序
(5)**binarySearch()**方法
 在数组中,查找指定的值,返回这个指定的值在数组中的下标,但是查找之前需要在数组中先进行排序,可以使用sort方法先进行排序
(6)**equals()**方法
 可以比较俩个数组是否相等,但是要求俩个数组中的值一一相等并且顺序也要一致才行,所以在比较之前,最好是用sort方法对俩个数组先进行排序
 相等的要求是:
 第一个要求,俩个数组的元素个数相同
 第二个要求,俩个数组的每个下标对应的数据相同
(7)**fill()**方法
 使用一个特定的值,把数组中的空间全都赋成这个值
(8)**asList()**方法
 把一组数据,封装到一个List集合中,并且把list集合对象返回
2、二维数组
2.1 定义
可以这么理解:学生们在教室上课,老师除了可以通过学生的名字点名提问外,还可以通过教室的座位号安排来提问,假设小明坐在四行四列,那么就可以说成是座位号(4,4)的同学。
二维数组是由一维数组构成的,也就是说一维数组再加一堆中括号就成了二维数组,如下:
例如:
//三个一维数组
int[] a1 = {1,2,3};
int[] a2 = {2,3,4};
int[] a3 = {3,4,5};
//二维数组中,存放三个一维数组对象
int[][] arr = {
    a1,    
    a2,    
    a3
};
//等价于上面的代码
int[][] arr = {   
	{1,2,3},   
	{2,3,4},   
	{3,4,5}
};
 
2.2 声明创建和赋值
2.2.1 声明创建数组
//第一个中括号中的4,代表这个二维数组对象里面,最多可以存放4个一维数组
//第二个中括号中的3,代表这个二维数组中,每个存放的一维数组对象,都可以存放存放3个int数据
int[][] a = new int[4][3];
//上面这句代码等价于以下代码
int[][] a = new int[4][];
a[0] = new int[3];
a[1] = new int[3];
a[2] = new int[3];
a[3] = new int[3];
//上面这句代码又等价于以下代码:int类型默认值为0
int[][] a = {
       {0,0,0},       
       {0,0,0},       
       {0,0,0},       
       {0,0,0}
};
//也可以这样来表示:把二维数组看作一栋大厦的话,假设共4层楼,每层楼的房间数可以不同
//就是说可以不固定每行有多少个数据(房间),但必须有具体的行数(层楼)
//如下
a[0] = new int[3];
a[1] = new int[5];
a[2] = new int[2];
a[3] = new int[4];
//有如下
int[][] a = {
   {1,2,3},   
   {1,2,3,4,5},   
   {1,2},   
   {1,2,3,4}
};
 
2.2.2 赋值
a[0][0] = 10; 
a[1][0] = 20; 
a[1][1] = 20; 









