数组与定义
数组是用来存储一组相同类型数据的数据结构,数组在初始化完毕后,Java会为数组在内存中分配一段连续的内存空间。
在数组开辟空间之后,数组的大小就会被固定,长度不会再发生改变,即使数组没有被存入任何数据,数组依旧会占有开辟空间大小的空间。
数组的声明与使用
数组的声明
数组的声明使用总共分为四个步骤
一、数组的声明 包括:数组名,数据类型,[]
二、为数组分配空间 必要,否则会出现错误
三、数组各元素的赋值 注意:数组的各元素必须与声明的数据类型完全相同
四、数组的使用
数组的声明与分配空间是可以在一起进行的,如:
//合在一起
int [] arr1 = new int [3];
int arr2 [] = new int [5];
//分开写
int [] arr3;
arr3 = new int [3];
但是根据某公司的java文档规范,[]必须要跟在数据类型后面。。。
如果在为数组分配空间时没有分配空间,数组不一定会出现逻辑错误,但是在编译时会出现编译错误
不管是哪一种声明方式,在进行了声明数组,并且分配空间之后,数组即使没有被赋值也拥有初始值,初始值根据声明数组的数据类型有所不同
数组元素类型 | 默认初始值 |
---|---|
byte、short、int、long | 0 |
float、double | 0.0 |
char | '\u0000' |
boolean | false |
引用数据类型 | null |
当数组被赋值的元素比较少,而且方便赋值的话,有时会把赋值操作和定义数组操作一起完成,被称之为数组初始化。语法格式如下:
数据类型[]数组名 = {值1,值2,值3......}
或者
数据类型[]数组名 = new 数据类型[]{值1,值2,值3......}
注意1:后一种定义方式,在new 数据类型的[]中一定不要加入数字,否则会被认为不是一条语句。
注意2:如果采用这样的数组初始化的方式声明数组,一定不要将上述代码拆成两段,这样依旧会提示错误:不能在这里赋值。
//错误示范
int[] arr1 = new arr[3];
arr1= {1,2,3};
数组的使用
在使用数组时,我们使用数组的下标来准确的定位到数组中的每个元素 数组名[下标值]。
数组的下标从0开始,0是数组的第一个元素,1是数组第二个元素。
[数组长度]可以通过 数组.length 属性来获取数组的长度。
arr1[0] = 1;
数组的遍历
有了数组的下标和数组的长度,我们就可以让数组和for循环结合,使数组进行动态存储和快速遍历的应用。
使用Scanner和for循环输入数组:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入数组长度:");
int num = sc.nextInt();
int[] arr1 = new int[num];
for (int i = 0;i<arr1.length;i++){
System.out.print("请输入数组元素:");
arr1[i]= sc.nextInt();
}
}
此时我们可以使用for循环来遍历数组,也可以使用增强for循环来输出数组。
//遍历输出数组
for (int i = 0;i< arr1.length;i++){
System.out.print(arr1[i]+" ");
}
//增强for
for (int i:arr1){
System.out.print(i+" ");
}
输出结果为:
数组添加
数组的添加要求遍历数组,使用if来找出想要添加的位置,从末尾开始依次向后移动一个下标,最后再把要加入的元素添加进去。
注意在一开始移动末尾元素时要考虑数组越界问题。
数组修改
数组修改则简单的多,只需要遍历数组,找出需要修改的值,将修改的元素赋值给原先元素即可。
注意要考虑数组内可能不存在索要查找的元素。
数组删除
数组删除要求遍历数组,找到需要删除的元素,将要删除元素的后一个下表的元素赋值给当前元素,并且之后的元素依次(从前向后)向前移动一个下标即可,将最后一位设置为空。
注意: arr1.length返回的值是数组的长度 是数组的 最后一个下标+1,注意在for循环中不要出现越界问题。
二维数组
语法结构
数据类型 数组名[][]
或者数据类型[][]数组名
如:
int [][]score;
score = new int[5][50]
或者
int [][] scores = new int [5][50]
二维数组本质上还是一维数组,数组的每一个元素内存放的元素都为一维数组。
二维数组的使用
初始化二维数组:
int[][]scores = new int [][]{{1,2,3,4,5},{1,2,3},{1}};
或者
int scores[][] = {{1,2,3,4,5},{1,2,3},{1}}
二维数组的遍历与累加
int [][]array = new int [][]{{1,2},{1,2,3},{1,2}};
int sum;
for(int i = o;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
total += array[i][j];
}
}
Arrays类的使用
arrays类是jdk提供给,用于操作数组的工具类,可以提供排序,复制,比较,填充,查询等功能
常用方法如下:
equals(arr1,arr2) | boolean | 比较数组是否相等 |
sort(array) | void | 对数组进行升序排列 |
toString(array) | String | 将数组转换为字符串 |
fill(array,val) | void | 把数组的所有元素都复值为val |
copyOf(array,length) | 与array类型一致 | 把数组复制成一个长为length的新数组 |
binarySearch(array,val) | int | 查询元素值val在数组的下标 |
int [] arr1= {1,2,3};
int [] arr2={1,2,3};
int []arr3 = {4,2,1};
System.out.println(Arrays.equals(arr1,arr2)); //true
System.out.println(Arrays.equals(arr1,arr3)); //false
Arrays.sort(arr3); //{1,2,4}
System.out.println(Arrays.toString(arr1));//[1,2,3]
Arrays.fill(arr2,10);//{10,10,10}
int [] arr4 = Arrays.copyOf(arr2,2);//{10,10}
int [] arr5 = Arrays.copyOf(arr2,5);//{10,10,10,0,0}
//使用binarySearch()之前必须进行sort排序
System.out.println(Arrays.binarySearch(arr3,4));//2 注意:这里的下标指排序之后的下标