Java数组07 Arrays类讲解
Arrays类
-
数组的工具类java,util.Arrays
-
由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
-
查看JDK帮助文档
-
Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而“不用”使用对象来调用(注意:是“不用”而不是“不能”)
-
具有以下常用功能:
- 给数组赋值:通过fill方法。
- 对数组排序:通过sort方法,按升序。
- 比较数组:通过equals方法比较数组中元素值是否相等。
- 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。
toString方法(返回指定数组的内容的字符串表示形式)
-
-
-
public static String toString(int[] a)返回指定数组的内容的字符串表示形式。 字符串表示由数组元素的列表组成,括在方括号(
"[]")中。 相邻的元素由字符", "分隔(逗号后跟一个空格)。 元素被转换为字符串由String.valueOf(int)。返回"null"如果a是null。-
参数
a- 要返回其字符串表示形式的数组 -
结果
一个字符串表示
a -
从以下版本开始:
1.5
-
-
-
sort方法(对数组排序)
-
全排序
-
-
-
public static void sort(int[] a)按照数字顺序排列指定的数组。
实施注意事项:排序算法是由Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch提供的双轴快速排序。 该算法在许多数据集上提供O(n log(n))性能,导致其他快速排序降级为二次性能,并且通常比传统(单轴)Quicksort实现更快。
-
参数
a- 要排序的数组
-
-
-
-
-
指定范围排序
-
-
-
public static void sort(int[] a, int fromIndex, int toIndex)按升序排列数组的指定范围。要排序的范围从索引
fromIndex(包括)扩展到索引toIndex,排他。如果fromIndex == toIndex,要排序的范围是空的。实施注意事项:排序算法是由Vladimir Yaroslavskiy,Jon Bentley和Joshua Bloch提供的双轴快速排序。 该算法在许多数据集上提供O(n log(n))性能,导致其他快速排序降级为二次性能,并且通常比传统(单轴)Quicksort实现更快。
-
参数
a- 要排序的数组fromIndex- 要排序的第一个元素(fromIndex)的索引toIndex- 最后一个要排序的元素的索引 -
异常
IllegalArgumentException- 如果是fromIndex > toIndexArrayIndexOutOfBoundsException- 如果fromIndex < 0或toIndex > a.length
-
-
-
-
fill方法(填充数组,对数组赋值)
int[] a= {3,1,4,2,9090,4524135,456,12,3,84};
- 全赋值
public static void fill(int[] a,int val)将指定的int值分配给指定的int数组的每个元素。
参数
a - 要填充的数组
val - 要存储在数组的所有元素中的值
例:
Arrays.fill(a,0);
System.out.println(Arrays.toString(a));//[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] //可以看到数组所有元素都赋值为0.
-
指定范围赋值
public static void fill(int[] a,int fromIndex,int toIndex,int val)
将指定的int值分配给指定的int数组的指定范围的每个元素。 要填充的范围从索引fromIndex扩展到索引toIndex ,排他。 (如果fromIndex==toIndex ,要填充的范围是空的。)
参数
a - 要填充的数组
fromIndex - 要用指定值填充的第一个元素(包括)的索引
toIndex - 要用指定值填充的最后一个元素(排除)的索引
val - 要存储在数组的所有元素中的值
异常
IllegalArgumentException - 如果是 fromIndex > toIndex
ArrayIndexOutOfBoundsException - 如果 fromIndex < 0或 toIndex > a.length例:
//fromIndex:从下标2,toIndex:到下标5之前,val:都填充0;
//填充范围是:2~4
Arrays.fill(a,2,5,0);
System.out.println(Arrays.toString(a));//[3, 1, 0, 0, 0, 4524135, 456, 12, 3, 84]
equals方法(比较数组是否相等)
-
-
-
public static boolean equals(int[] a, int[] a2)如果两个指定的int数组彼此相等 ,则返回
true。如果两个数组都包含相同数量的元素,则两个数组被认为是相等的,并且两个数组中所有对应的元素对都相等。换句话说,如果两个数组以相同的顺序包含相同的元素,则它们是相等的。另外,如果两个数组引用都是null,则它们被认为是相等的。-
参数
a- 要测试相等的一个数组a2- 要测试的其他数组是否相等 -
结果
true如果两个数组相等false 如果两个数组不相等
-
-
-
binarySearch方法(二分查找)
binarySearch方法的功能:在求x在a数组中的位置(下表号),如果这个值是一个负数,说明x不在a数组里面。
什么是二分查找?
binarySearch:二分查找:对一个已经排好序的数组,查询里面是否包含某个数,可以先查询数组中间的数字,如果
中间的数字大于被查询数,再去查询数组前面一一半,找前面一半的中间值
过程,比如去a数组中查找X是否在里面:
定义一个开始下标start,和结束下标end.
最开始的时候start = 0;end = a.length-1;
确定中间位置middle = (start + end) / 2;
判断中间位置的值与x的大小,如果中间位置的值大于x,将end移动到middle的前一个位置
如果中间位置的值小于x,将start移动到middle的后一个位置
然后再求此时的中间位置,middle = (start + end) / 2;开始循环
如果不停的移动时候发现结束位置end比开始位置start小,结束循环
例:查询x在a中的位置
//查询x在a中的位置
int[] a = {1,4,8,12,34,56,78,100};
//以下就为binarySearch方法的功能模仿代码
int x = 8;
int start = 0;
int end = a.length-1;
int wz= -1;//x在数组中的位置,默认-1表示不在里面;
while(end>=start){//这里就是当end==start这最后一个循环时,如果a[middle]还大于或小于x,就会退出循环,wz只能是-1;
int middle = (start + end )/2;
if (a[middle]>x){
end = middle-1;
}else if (a[middle]<x){
start = middle+1;
}else if (a[middle]==x){
wz = middle;
break;
}
}
System.out.println("x在数组中的位置为:"+wz);
- 全查找
-
-
-
public static int binarySearch(int[] a, int key)使用二叉搜索算法搜索指定的int数组的指定值。 在进行此调用之前,必须对数组进行排序(如
sort(int[\])方法)。 如果没有排序,结果是未定义的。 如果数组包含具有指定值的多个元素,则不能保证将找到哪个元素。-
参数
a- 要搜索的数组key- 要搜索的值 -
结果
搜索键的索引,如果它包含在数组中; 否则,
(-(*insertion point*) - 1)。 如果阵列中的所有元素都小于指定键的第一元件比所述键时,或a.length的索引: 插入点被定义为将键插入到阵列的点。 请注意,这确保当且仅当找到该键时返回值将为> = 0。
-
-
-
- 指定范围查找
-
-
-
public static int binarySearch(int[] a, int fromIndex, int toIndex, int key)使用二叉搜索算法搜索指定值的指定数组的范围。 在进行此呼叫之前,范围必须按照
sort(int[\], int, int)方法进行排序。 如果没有排序,结果是未定义的。 如果范围包含具有指定值的多个元素,则不能保证将找到哪个元素。-
参数
a- 要搜索的数组fromIndex- 要搜索的第一个元素(包括)的索引toIndex- 要搜索的最后一个元素(排他)的索引key- 要搜索的值 -
结果
搜索键的索引,如果它包含在指定范围内的数组中; 否则,
(-(*insertion point*) - 1)。 如果在范围内的所有元素都小于指定的键在比所述键时,或toIndex的范围中的第一个元素的索引: 插入点被定义为将键插入到阵列的点。 请注意,这确保当且仅当找到该键时返回值将为> = 0。 -
异常
IllegalArgumentException- 如果是fromIndex > toIndexArrayIndexOutOfBoundsException- 如果fromIndex < 0 or toIndex > a.length -
从以下版本开始:
1.6
-
-
-
==================================================================
狂神说讲解
package com.lijianhua.array;import java.util.Arrays;public class ArrayDemo06 { public static void main(String[] args) { int[] a = {3,1,4,2,9090,4524135,456,12,3,84};// System.out.println(a);//[I@1b6d3586 哈希值// //打印数组元素 Arrays.toString// System.out.println(Arrays.toString(a));//[3, 1, 4, 2, 9090, 4524135, 456, 12, 3, 84]// System.out.println("===============================================================");// printArrays(a);//[3, 1, 4, 2, 9090, 4524135, 456, 12, 3, 84]// Arrays.sort(a);//对数组进行升序排序 升序:即从小到大,从左到右// System.out.println(Arrays.toString(a)); /* public static void fill(int[] a, int val)将指定的int值分配给指定的int数组的每个元素。 参数 a - 要填充的数组 val - 要存储在数组的所有元素中的值 */ Arrays.fill(a,0); System.out.println(Arrays.toString(a));//[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] /* public static void fill(int[] a,int fromIndex,int toIndex,int val) 将指定的int值分配给指定的int数组的指定范围的每个元素。 要填充的范围从索引fromIndex扩展到索引toIndex ,排他。 (如果fromIndex==toIndex ,要填充的范围是空的。) 参数 a - 要填充的数组 fromIndex - 要用指定值填充的第一个元素(包括)的索引 toIndex - 要用指定值填充的最后一个元素(排除)的索引 val - 要存储在数组的所有元素中的值 异常 IllegalArgumentException - 如果是 fromIndex > toIndex ArrayIndexOutOfBoundsException - 如果 fromIndex < 0或 toIndex > a.length */ //例 //fromIndex:从下标2,toIndex:到下标5之前,val:都填充0; //填充范围是:2~4 Arrays.fill(a,2,5,0); System.out.println(Arrays.toString(a));//[3, 1, 0, 0, 0, 4524135, 456, 12, 3, 84] }