一、数组
1.1.什么是数组
数组就是一组数
在内存中的一片连续存储空间中保存的同类型数的集合
1.2.数组的创建
1.2.1.声明数组
//数组元素类型[] 数组名;
//type[] arrname;
int[] nums;
1.2.2.初始化数组
值得注意的是,我们的初始化数组的时候,我们的数组名就是我们前面声明数组的时候的数组名,数组类型也得和我们前面声明数组时相同。
在我们数组的初始化过程中一共干了三件事情:
1.在堆内存中开辟一块空间用来存储这个数组
2.将这个空间按数组元素的个数分割
3.将元素按顺序放入分割好的对应的内存块中
静态方式
方式一:通过new关键字进行初始化
//数组名 = new 数组类型[] {元素1,元素2,......}
nums = new int[] {1,2,3};
方式二:通过{}直接进行数组的初始化
注意这种方式的初始化是必须在声明数组的时候同时进行初始化才可以,而且此方式只有数组拥有
//数组类型[] 数组名 = {元素1,元素2,......}
int[] nums = {1,2,3};
动态方式
所谓的动态方式就是说,我们初始化的时候只需要指定数组的长度,并不指定数组的元素,虽然我们没有给数组添加值,但是我们的java本身会根据类型不同给我们添加对应的默认元素。
byte/short/int/long数组类型 0
double/float数组类型 0.0
char数组类型 空格
Boolean数组类型 false
所用的引用数据类型的数组 null
//数组类型[] 数组名 = new 数组类型[数组长度]
int[] nums = new int[10];
//如果数组已经声明
//数组名 = new 数组类型[数组长度]
arr = new int[10];
此时,我们的[]中的值是我们所指定的数组长度
值得注意的是,我们在动态初始化数组之后还需要给数组对应的位置添加我们想要添加的元素。因为重复代码的原因,我们可以使用for循环、while循环等遍历的方法来添加数据。当然了,我们需要注意元素类型的一致。
1.3.数组的特性
1.3.1.length(长度不可变)
我们每个数组在初始化后就会被确定,此时,这个数组的长度length也就有了意义。我们可以通过.length来得到我们想要查看的数组的长度
注意:
1.一个数组的长度是不可改变的
1.3.2.索引(有序)
索引是从0开始的整数。
每个数组的索引都是在一个区间范围内的值,该区间为(0,该数组长度-1)
当我们进行初始化之后,我们的数组中的每个元素,就会有一个对应的索引,我们可以通过这个索引来调用数组中对应的数组元素。
注意:
1.当我们通过一个超出某一数组元素个数的索引来调用该数组的元素的时候,就会报错,越界
1.3.3.存储数据类型相同
1.3.4.引用数据类型
1.4.数组的遍历
1.4.1.通过for循环
for(int i = 0;i < nums.length; i++) {
System.out.println(nums[i]);
}
1.4.2.通过增强for循环
for(int i : nums) {
System.out.println(i);
}
1.5.数组的优缺点
1.5.1.优点
1.检索速度非常快
1.5.2.缺点
1.对内存要求很高(必须是连续存储),因此当一个数组的长度很长的时候,内存就不是很容易满足
2.当我们删除或添加元素给一个数组的时候,效率会很低,他的本质是在内存空间重新开辟一个空间,长度为修改后的值,并将修改后的值复制到新的内存空间中,然后再把内存地址赋值给变量。
二、二维数组
2.1.什么是二维数组?
数组就是用来存放一系列相同数据的集合,当我们把这里的一个个数据换成一个个数组的时候,就是我们的二维数组。
借用维度的定义,一个个点组成了线,就是一维;一条条线组成的面是二维。
二维数组也可以理解成一个数组就是一条线,就是一个一维;多个数组组成的数组,就是二维。也就是说,外层数组是二维,里层数组是一维。
2.2.二维数组的声明
2.2.1.语法
//数组元素类型[][] 数组名;
//type[][] array_name;
int[][] nums;
2.3.二维数组的初始化
2.3.1.静态初始化
方式一:通过new关键字进行初始化
//数组名 = new 数组类型[][] {{元素1,元素2,...},{元素1,元素2,...},......}
nums = new int[][] {{1,2,3},{4,5},{6}};
方式二:通过{}直接进行数组的初始化
注意这种方式的初始化是必须在声明数组的时候同时进行初始化才可以,而且此方式只有数组拥有
//数组类型[][] 数组名 = {{元素1,元素2,...},{元素1,元素2,...},......}
int[][] nums = {{1,2,3},{4,5},{6}};
2.3.2.动态初始化
所谓的动态方式就是说,我们初始化的的时候先指定数组的长度,并不指定数组的元素,虽然我们没有给数组添加值,但是我们的java本身会根据类型不同给我们添加对应的默认元素。
byte/short/int/long数组类型 0
double/float数组类型 0.0
char数组类型 空格
Boolean数组类型 false
所用的引用数据类型的数组 null
方式一、第一维和第二维的数组都指定长度
//数组类型[][] 数组名 = new 数组类型[外层二维数组的长度][内层的每一个一维数组的长度]
int[][] nums = new int[10][5];
//如果数组已经声明
//数组名 = new 数组类型[外层二维数组的长度][内层的每一个一维数组的长度]
arr = new int[10][5];
方式二、只给第二维指定长度,在之后分别按需给一维数组设置长度
//数组类型[][] 数组名 = new 数组类型[外层二维数组的长度][]
int[][] nums = new int[10][];
//如果数组已经声明
//数组名 = new 数组类型[外层二维数组的长度][]
arr = new int[10][];
//给一维数组设置长度
//数组名[二维索引] = new 数据类型[一维长度];
arr[0] = new int[10];
//或者是静态赋值一维数组
//数组名[二维索引] = new 数据类型[]{值列表...};
arr[0] = new int[] {1,2,3}
此时,我们的[]中的值是我们所指定的数组长度
值得注意的是,我们在动态初始化数组之后还需要给数组对应的位置添加我们想要添加的元素。因为重复代码的原因,我们可以使用for循环、while循环等遍历的方法来添加数据。当然了,我们需要注意元素类型的一致。
2.4.二维数组的使用
数组的使用都是跟随索引进行操作使用的
2.4.1.语法
二维数组名[外层索引][内层索引]
2.4.二维数组的遍历
外层for循环遍历外层的二维数组,内存for循环用来遍历内层的每一个一维小数组
2.4.1.普通for循环嵌套普通for循环
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < nums[i].length; j++) {
System.out.println(nums[i][j]);
}
}
2.4.2.普通for循环嵌套增强for循环
for (int i = 0; i < nums.length; i++) {
for (int j : nums[i]) {
System.out.println(j);
}
}
2.4.3.增强for循环嵌套普通for循环
for (int i : nums) {
for (int j = 0; j < i.length; j++) {
System.out.println(i[j]);
}
}
2.4.4.增强for循环嵌套增强for循环
for (int i : nums) {
for (int j : i) {
System.out.println(j);
}
}
三、Arrays静态工厂
通过Oracle官方找到对应的文档来查看方法的使用,以及方法的功能
3.1.常用方法总结与测试
3.1.1.前提准备
int[] arr1 = {3,1,5,4,2};
int[] arr2 = {3,1,5,4,2};
char[][] arr3 = {{'a','b'},{'c','d','e'}};
char[][] arr4 = {{'a','b'},{'c','d','e'}};
3.1.2.常用方法
一维数组
1.static String toString(int[] a)
返回指定数组内容的字符串表示形式。
System.out.println(Arrays.toString(arr1));
判断数组是否相等
2.static boolean equals(int[] a, int[] a2)
如果两个指定的int数组彼此 相等 ,则返回 true 。
System.out.println(arr1==arr2);
System.out.println(Arrays.equals(arr1,arr2));
多维数组
3.static boolean deepEquals(Object[] a1, Object[] a2)
如果两个指定的数组彼此 深度相等 ,则返回 true 。
System.out.println(Arrays.equals(arr3,arr4));
System.out.println(Arrays.deepEquals(arr3,arr4));
4.static String deepToString(Object[] a)
返回指定数组的“深层内容”的字符串表示形式。
System.out.println(Arrays.toString(arr3));
System.out.println(Arrays.deepToString(arr3));
5.static void fill(boolean[] a, boolean val)
将指定的布尔值分配给指定的布尔数组的每个元素。
boolean[] arr5 = new boolean[10];
System.out.println(Arrays.toString(arr5));
Arrays.fill(arr5,true);
System.out.println(Arrays.toString(arr5));
6.static void fill(boolean[] a, int fromIndex, int toIndex, boolean val)
将指定的布尔值分配给指定的布尔数组的指定范围的每个元素。 结束索引位置不包含
Arrays.fill(arr5,3,6,false);
System.out.println(Arrays.toString(arr5));
升序排列
7.static void sort(int[] a)
将指定的数组按升序排序。
System.out.println(Arrays.toString(arr1));
Arrays.sort(arr1);
8.static void sort(int[] a, int fromIndex, int toIndex)
按升序对数组的指定范围进行排序。
Arrays.sort(arr1,1,4);//注意这里的测试需要注释掉上面的排序代码
System.out.println(Arrays.toString(arr1));
判断数组是否有某个值
9.static int binarySearch(int[] a, int key)
使用二进制搜索算法在指定的int数组中搜索指定的值。如果不存在返回(-插入点-1) ---> 默认数组升序排序为前提
Arrays.sort(arr2);
System.out.println(Arrays.toString(arr2));
System.out.println( Arrays.binarySearch(arr2,6));; //-插入点-1
数组拷贝
10.static int[] copyOf(int[] original, int newLength)
使用零复制指定的数组,截断或填充(如有必要),以使副本具有指定的长度。
original 原数组
newLength 新数组的长度
1.当newLength == original.length 原数组长度
拷贝
int[] newArr = Arrays.copyOf(arr1,5);
System.out.println(Arrays.toString(newArr));
System.out.println(arr1==newArr);
2.当newLength < original.length 原数组长度
截取 : 从原数组中所有为0的位置开始,拷贝newLength个到新数组中
System.out.println(Arrays.toString(Arrays.copyOf(arr1,3)));
3.当newLength > original.length 原数组长度
填充 : 原数组中的数据原封不动拷贝到新数组中,剩余空间默认值填充
System.out.println(Arrays.toString(Arrays.copyOf(arr1,10)));
11.static int[] copyOfRange(int[] original, int from, int to)
将指定数组的指定范围复制到新数组中。 结束索引一般不包含
System.out.println(Arrays.toString(Arrays.copyOfRange(arr1,1,3)));
注意:
copyOf与copyOfRange实现拷贝,新数组都是方法内部创建的,不是用户手动创建
解决:
当我们的目的地数组需要用户手动指定,可以使用下面这个方法
12.static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。
int[] arr6 = new int[8];
System.arraycopy(arr1,1,arr6,4,3);
System.out.println(Arrays.toString(arr6));