黑马程序员——JAVA基础---操作数组

时间:2021-02-07 00:37:54

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一 复制数组

 Java在System类中提供了一个特殊的方法arraycopy(),用于实现数组之间的复制操作。

复制数组。
创建CopyArray类,在main()方法中输入以下程序关键代码:

int i;
int arr1[] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; // 源数组
int arr2[] = new int[10]; // 复制数组
System.arraycopy(arr1, 0, arr2, 0, arr1.length); // 将arr1数组复制到arr2数组
System.out.println("复制后arr2中的元素为:");
for (i = 0; i < arr2.length; i++)
System.out.print(arr2[i] + ","); // 打印arr2数组
System.out.println();

代码说明如下:
其实数组在Java中可以被看做一个对象,数组的引用和数组的实例也是分开的,所以如果希望复制整个数组的数据时,就不能简单地使用指定语句,因为这样访问的还是同一个数组。不过,虽然数组有点类似对象,但是数组毕竟不是继承自java.lang.Object类的对象,所以就没有clone()这个用来复制对象实例的方法。

本实例的运行结果如图所示。
黑马程序员——JAVA基础---操作数组

图 实例运行结果
可以自己利用循环来进行数组的复制,例如,现有arrayA、arrayB两个数组,要将arrayA数组中的数据复制到arrayB数组中:
for (i=0;i

二 排序数组

Arrays类中的sort()方法用于对数组进行排序,该方法的参数为任意基本类型的数组,也可以对任意对象数组进行排序,语法如下:

Arrays.sort(a);
参数说明:
a:排序数组名称。
排序数组
1)创建SortArray类,在main()方法中输入以下程序关键代码:

String[] s = new String[]{"abc", "ABC", "EDF", "234"};
Arrays.sort(s); //将数组s排序
System.out.println(Arrays.asList(s)); //打印数组s

代码说明如下:
上述代码中定义了一个字符型数组,其中包括4个元素,有大写字母、小写字母和数字,使用sord()方法对这个数组进行排序,参数为数组s,排序后打印数组s,此时可以使用for循环语句对数组进行打印,Arrays类库也为用户提供了更为方便的打印形式,使用asList()方法即可,参数为需要打印的数组名称。

2)在Eclipse中运行上述代码,结果如图所示。
黑马程序员——JAVA基础---操作数组

图 排序数组
Java中的String排序算法是根据字典编排顺序排序的,所以数字排在字母前面,大写字母排在小写字母前面。如果想忽略大小写字母,将单词放在一起排序,可以修改上述代码,如例7.9。

下面是一个忽略字符串大小写排序的例子。
1)创建SortArray2类,在main()方法中输入以下程序关键代码。

String[] sa=new String[]{"b","C","a","234"};
Arrays.sort(sa, new SingleCompare()); //忽略大小写给数组sa排序
System.out.println(Arrays.asList(sa)); //打印数组sa

2)在SortArray2类中创建类SingleCompare,程序代码如下:

public class SingleCompare implements Comparator{
public int compare(Object o1,Object o2){//重写compare方法
String s1=(String)o1;
String s2=(String)o2;
return s1.toLowerCase().compareTo(s2.toLowerCase());
//将字符串s1、s2大写转化为小写后进行比较
}
}

代码说明如下:
在上述代码中实现了Comparator接口,该接口强行对某些对象进行整体排序,可以将Comparator传递给sort()方法,从而允许在排序上实现精确控制。Comparator有两个方法,分别为compare()方法和equals()方法,可以重写compare()方法实现自己需要的比较,如上述代码中比较两个字符串的大小写情况,在这里使用了String类中的toLowerCase()方法,此方法将字符串中的大写字母转换为小写字母,将字符串从大写字母转换为小写字母后,再进行比较,然后将比较结果传递给sort()方法进行排序。

3)打印结果,如图所示。
黑马程序员——JAVA基础---操作数组

图 不区分字母大小写,排序数组
注意:
compare()方法返回负数、零、或正整数,分别对应于第一个参数小于、等于或大于第2个参数。

三 比较数组

Arrays类提供了equals()方法,用来比较整个数组,数组相等的条件是数组元素的个数必须相等,并且对应的位置元素也相等,这时候可以通过对每个元素使用equals()方法做比较来判断,语法如下:

Arrays.equals(arrayA,arrayB);
参数说明:
arrayA:待比较的数组名称。
arrayB:待比较的数组名称。
比较数组。
1)创建ComparingArrays类,在main()方法中输入以下程序关键代码:


int[]a1={1,2,3,4,5,6,7,8,9,0};
int[]a2=new int[9];
System.out.println(Arrays.equals(a1, a2));//打印数组a1与a2的比较结果
int[]a3={1,2,3,4,5,6,7,8,9,0};
System.out.println(Arrays.equals(a1, a3));//打印数组a1与a3的比较结果
int[]a4={1,2,3,4,5,6,7,8,9,5};
System.out.println(Arrays.equals(a1, a4));//打印数组a1与a4的比较结果

代码说明如下:
上述代码中定义了3个数组,第一个数组直接给出了数组的值,声明和初始化放在了一起,从笔者给出的数值可以看出,数组a1的长度为10,而定义的第2个数组的长度为9,所以使用Arrays.equals()方法进行比较后,结果为false。再次定义一个与a1相同的数组a3,比较后结果为true。这时笔者再次定义一个数组a4,数组a4与数组a1元素个数相同,元素内容不同,比较数组a1与a4结果为false。

2)在Eclipse中运行上述代码,运行结果如图所示。
黑马程序员——JAVA基础---操作数组

图 比较数组结果

四 搜索数组

搜索数组是指从数组中查询指定位置的元素,或者是查询某元素在指定数组中的位置,搜索数组中的元素需要使用binarySearch()这个方法,此方法也为Arrays类的方法。在使用binarySearch()方法之前,有一点要非常注意,就是被查找的数组必须是已经排序好的。如果找到了需要查询的结果,binarySearch()方法返回值为需要查找的内容在数组中的位置,如果没有查找到要找的数据,那么会返回一个“负数”,至于这个负数的值会是多少,就看这棵二叉树下一个插入位置的索引值是多少了。

语法如下:
int i=binarySearch(a,”abc”);
参数说明:
a:搜索数组的名称。
abc:需要在数组中查找的内容。
搜索数组,将某路车的各个站点集合组成一个数组,在这个数组中,通过binarySearch()方法查询“东盛路”应该是该线路的第几站。
1)创建SearchArray类,在main()方法中输入以下程序关键代码:

//定义表示公交线路的数组 
String[] arrStr = { "长白路", "四通路", "东盛路", "吉林路", "长春大街", "延吉路" };
int location = Arrays.binarySearch(arrStr, "东盛路"); //搜索“东盛路”为第一站地
System.out.println("查找东盛路的位置是" + location + ",arrStr[" + location + "]="
+ arrStr[location]); //输出查询结果

代码说明如下:
该段代码首先创建了String类型数组,保存线路中各站点的集合,之后通过binarySearch()方法搜索数组中“东盛路”所占的位置。

2)在Eclipse中运行上述代码,运行结果如图所示。
黑马程序员——JAVA基础---操作数组

图 搜索数组

五 填充数组

Arrays类库中为用户提供填充数组的方法为fill()方法,虽然可以填充数组,但此方法的功能有限,只能使用同一个数值进行填充,使用此方法可以在指定位置进行数值填充。

Arrays类引用fill()方法实现数组填充,例如:
int array[]=new int[10];
Arrays.fill(array,11);
参数说明:
array:将被填充数组的名称。
上述代码实现将数值11填充到数组a中。
填充数组。
1)创建FillingArrays类,在main()方法中输入以下程序关键代码:

int array[] = new int[6];            //定义长度为6的数组
System.out.println("输出数组中的元素:");
for (int i = 0; i < 6; i++) {
Arrays.fill(array, i); //用循环元素中的值进行数组填充
//将填充后的结果输出
System.out.print("array2[" + i + "]=" + array[i] + " ");
}

代码说明如下:
上段代码中首先定义int类型数组,设定数组的长度为6。再定义一个长度为6的循环,通过fill()方法对数组进行填充,再将填充后的结果输出。

2)在Eclipse中运行程序,如图所示。

黑马程序员——JAVA基础---操作数组

图 实例的运行结果
注意:
在向数组中填充数据时应该注意,虽然定义数组的长度为6,但数组的下标是从0开始的,所以数组的最大下标值应该是5,此时若为下标为6的数组元素赋值,则会跑出数组下标越界异常。

六 传递数组

数组名称实际上就是一个引用,所以传递数组实质上就是传递引用。当方法传递引用时,只需要在方法参数中指定引用的名称即可。

将数组传递给方法,应该使用不加方括号的数组名,例如:

int array[] = new int[24];  // 声明一个数组
modify(array); // modify方法调用

参数说明:
array:要传递的数组名称。
上述代码是在方法调用时的写法,如果是定义一个方法,参数为数组,则语法如下:
void modifyArray(int b[]){}
参数说明:
b:参数。
这表示modifyArray()方法正准备接收一个整型数组,名称为b。
传递数组。
1)创建PassArray类,在main()方法中输入以下程序关键代码:

int array[]={1,2,3,4,5};
for(int i=0;i<array.length;i++){
System.out.println("没有传值之前的数组为:"+array[i]);
//打印没有调用modifyArray()方法的数组值
}
modifyArray(array); //调用方法
for(int i=0;i<array.length;i++){
System.out.println("传递之后数组的数组为:"+array[i]);
//打印调用modifyArray()方法后的数值
}


2)在PassArray类中定义一个modifyArray()方法,它的参数为数组,程序代码如下:
public static void modifyArray (int array[]){
for(int i=0;i<array.length;i++){
array[i]*=2; //将数组array中的每个元素都乘以2
}
}

代码说明如下:
首先创建一个方法modifyArray(),参数为int型数组,在该方法内使用for循环语句将传递过来的数组中每一个数乘以2。
在主函数中定义一个数组,打印没有改变之前的数组的值。
调用modifyArray()方法,由于modifyArray()方法为static的,所以在主函数中可以直接调用。
改变数组值后,打印数组。
3)在Eclipse中运行结果如图所示。
黑马程序员——JAVA基础---操作数组
图 向方法传递数组