一.数组的应用
1.1保存数据
我们创建的数组可以用来储存数据(数据在堆上放着),等需要时我们在从中取出来。
代码示例:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int []array1={25,63,89};
System.out.println(Arrays.toString(array1));
}
}
运行结果:
1.2作为实参传递给函数
代码示例:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int [] array1= {25,69,87};
func(array1);
}
public static void func(int[]arr){
arr[1]=89;
System.out.println(Arrays.toString(arr));
}
}
调试过程:
运行结果:
原因分析:
1.3作为函数的返回值
代码示例:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int []result=get();
System.out.println(Arrays.toString(result));
}
public static int[]get(){
int[]arr={1,5,8};
return arr;
}
}
调试过程:
运行结果:
二.在数组方面java内置工具方法
2.1比较数组内容(一维数组)
2.1.1基本类型数组的比较
使用Arrays.equals( )方法进行比较
代码示例1(两数组内容相同):
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int []array1={1,5,9,8,7};
int []array2={1,5,9,8,7};
boolean isEqual=Arrays.equals(array1,array2);
}
}
调试过程:
代码示例2(两数组内容不同):
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int []array1={1,5,9,8,7};
int []array2={1,5,9,8};
boolean isEqual=Arrays.equals(array1,array2);
}
}
调试过程:
2.1.2对象数组的比较
代码示例1(数组内容不相同):
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
String []array1={"数组","内容"};
String []array2={"内容","数组"};
boolean isEqual=Arrays.equals(array1,array2);
}
}
调试过程:
代码示例1(数组内容相同):
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
String []array1={"A","B"};
String []array2={"A","B"};
boolean isEqual=Arrays.equals(array1,array2);
}
}
调试过程:
2.2比较多维数组内容
代码示例:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int [][]array1={{2,6},{6,8}};
int [][]array2={{2,9},{8,4}};
boolean isEqual=Arrays.deepEquals(array1,array2);
}
}
调试过程:
2.3数组排序
2.3.1快速排序数组
使用Arrays.sort( )对数组原地排序
对Arrays.sort( )的正确使用:
调试过程:
运行结果:
2.3.2冒泡排序
代码示例:
public class Test {
public static void main(String[] args) {
int[] array = {58,59,95,32,56};
bubbleSort(array);
}
public static void bubbleSort(int []arr){
for (int i = 0; i < arr.length-1 ; i++) {
for (int j = 0; j < arr.length-1-i ; j++) {
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
}
调试过程:
2.3.3数组逆序:
要给两个下标分别指向第一个元素和最后一个元素,当符合循环条件时将两元素互换位置,然后让前一个下标自增,后一个下标自减,知道不符合循环条件为止。
代码示例:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] array = {58, 59, 95, 32, 56};
reverse(array);
System.out.println(Arrays.toString(array));
}
public static void reverse(int []arr){
int left=0;
int right= arr.length-1;
while(left<right){
int temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
left++;
right--;
}
}
}
调试过程:
运行结果:
2.4数组拷贝
快速拷贝数组:
2.4.1使用Arrays.copyOf(array,array.length)进行拷贝。其中array是源数组,array.length是源数组的长度(拷贝整个数组)
代码示例1:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[]array={2,5,9,6,3};
int []newarray=Arrays.copyOf(array,array.length);
System.out.println(Arrays.toString(newarray));
}
}
调试过程:
运行结果:
2.使用System.arraycopy(src,srcPos,des,desPos,length)进行拷贝。其中src为源数组,srcPos为源数组起始位置(索引),des为目标数组,desPos为目标数组起始位置(索引),length为要复制的元素个数。
代码示例2:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[]array={2,5,9,6,3};
int [] newarray=new int[3]; //目标数组需要提前创建
System.arraycopy(array,2,newarray,0,3);
System.out.println(Arrays.toString(newarray));
}
}
调试过程:
运行结果:
3.使用Arrays.copyOfRange(src,from,to )进行拷贝。其中src为源数组,from为起始索引(包含),to为结束索引(不包含)。
代码示例3:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[]array={2,5,9,6,3};
int []newarray=Arrays.copyOfRange(array,1,3);
System.out.println(Arrays.toString(newarray));
}
}
调试过程:
运行结果:
2.5查找数组中指定的元素
2.5.1顺序查找
在for循环遍历数组过程中,找到与指定的元素相匹配的array[i],返回其下标值i,如果没有找到,返回数组里没有的下标值,一般返回-1,作为没有找到的标志。
代码示例:
public class Test {
public static void main(String[] args) {
int[] array = {1, 5, 9, 7, 3};
System.out.println(find(array, 3));
}
private static int find(int[] array, int date) {
for (int i = 0; i < array.length; i++) {
if (array[i] == date) {
return i;
}
}
return -1;
}
}
调试过程:运行结果:
缺点:需要逐个去找,直到找到与指定元素相匹配的array[i]为止,将其下标值返回,打印。
2.5.2.1二分查找(针对有序数组)
有序数组:即升序数组,降序数组
例如:int []array={1,2,3,4,5};有序数组
int []array={5,4,3,2,1};降序数组
代码示例:
public class Test {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(binarySearch(array, 8));
}
private static int binarySearch(int[] arr, int toFind) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (toFind < arr[mid]) {
right = mid - 1;
} else if (toFind > arr[mid]) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
}
调试过程:
运行结果:
2.5.2.2调用库方法Arrays.binarySearch()进行二分查找快速排序
代码示例:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] array = {1,2,3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.binarySearch(array,8));
}
}
运行结果: