java----数据结构与算法----数组+java.util.Arrays
概述:本文讲述java中与数组相关的基本语法
以及JDK中和数组操作有关的JavaAPI
和数组操作有关的JavaAPI:
-
- java.util.Arrays
/** * @author chen * @date 20170305 * @description 本程序讲述用于数组操作的javaAPI * java.util.Arrays * 1)概述: * 1.1)Arrays类中有若干可用于数组操作的成员函数,如: * 排序(sort):将数组中的全部或者部分元素按照升序排序, * 可以对byte/char/short/int/long/float/double这7种基本数据类型的数组进行升序排序 * 可以对Object[]类型的数组进行升序排序 * 可以对模板类型的数组进行升序排序,并且可以通过参数指定比较器类型(即指定Comparator) * 二分查找(binarySearch):使用二分法在数组中查找指定元素 * 在调用查找函数之前一定要先调用相应的sort()函数对数组进行排序,否则调用查找函数得到的结果就有可能是错误的 * 可以在byte/char/short/int/long/float/double这7种基本数据类型的数组中查找指定元素 * 可以在Object[]类型的数组查找指定元素 * 可以在模板类型的数组中查找指定元素,并且可以通过参数指定比较器类型(即指定Comparator) * 比较(equal):比较两个数组中元素是否完全一致(相同下标处的元素的数值要一致) * 可以比较8种基本数据类型数组 * 可以比较Object类型数组 * 填充(fill):往数组中填写元素,使得数组中全部或者部分元素都是fill()函数参数值 * 可以操作8种基本数据类型数组 * 可以操作Object类型数组 * 克隆(copy):从数组中copy出一部分元素,变成一个新的数组并作为返回值被返回 * 复制一部分或者全部元素组成新的数组 * 可以操作8种基本数据类型的数组 * 也可以操作模板数组 * 还可以在复制的同时,将数组元素由原来的数据类型变成新的数据类型 * 转变成List<>集合 * 可以将数组元素变成集合元素,整个数组变成一个List集合 * 计算数组对应的hashCode码: * 可以将整个数组看作一个整体,计算出这个数组所对应的一个hashCode码 * 如果两个数组内容依照顺序完全相同,那么两个数组对应的hashCode码一定相同 * 如果数组和一个List集合的元素依照次序完全相同,那么Arrays.hashCode(数组名)==集合名称List#hashCode() * 将数组转变成String对象 * 将数组中所有元素组合在一起,成为一个String对象 * 1.2)This class also contains a static factory that allows arrays to be viewed as lists. * * 2)Arrays类中的构造函数 * 只有一个无参构造函数 * 且唯一的构造函数还是private的,所以不能在外部调用 * private Arrays(){}//注意:private * 3)Arrays类中的成员函数 * 3.1)static成员函数 * 排序:【1】public static void sort(int[] a) * 功能: 将a:int[]按照升序排列 * 所用算法: Dual-Pivot Quicksort双支点快速排序 * 时间复杂度:O(N*logN) * 【2】public static void sort(int[] a, int fromIndex, int toIndex) * 功能: 将参数数组a:int[]中的a[fromIndex]~a[toIndex-1]这些个元素按照升序排列 * If {@code fromIndex == toIndex},the range to be sorted is empty. * 所用算法: Dual-Pivot Quicksort双支点快速排序 * 时间复杂度:O(N*logN) * 【3】下面的函数和上面的函数除了参数数组的数据类型不同之外,其他地方都相同,都是将数组的部分或者全部成员按照升序排序 * public static void sort(long[] a) * public static void sort(long[] a, int fromIndex, int toIndex) * public static void sort(short[] a) * public static void sort(short[] a, int fromIndex, int toIndex) * public static void sort(char[] a) * public static void sort(char[] a, int fromIndex, int toIndex) * public static void sort(byte[] a) * public static void sort(byte[] a, int fromIndex, int toIndex) * public static void sort(float[] a) * public static void sort(float[] a, int fromIndex, int toIndex) * 注意:对于float型数值,认为{@code -0.0f}小于 {@code 0.0f} * and {@code Float.NaN}比其他任何float型数值都大(也即认为Float.NaN是最大的float型数值) * and 所有{@code Float.NaN} values are considered equal. * public static void sort(double[] a) * public static void sort(double[] a, int fromIndex, int toIndex) * 注意:对于double型数值,认为 {@code -0.0d}小于{@code 0.0d} * and {@code Double.NaN} is considered greater than any other value * and all {@code Double.NaN} values are considered equal. * 【4】 public static void sort(Object[] a) * public static void sort(Object[] a, int fromIndex, int toIndex) * 注意:这个函数可以将参数a:Object[]数组按照升序排序,但是,这个函数对于a:Object[]有一些特殊要求 * 首先,a:Object[] 数组中的每一个元素都应该实现 the {@link Comparable} interface. * 其次, all elements in the array must be <i>mutually comparable</i> * (that is, {@code e1.compareTo(e2)} must not throw a * {@code ClassCastException} for any elements {@code e1} and {@code e2} * in the array). * 譬如,将String类型数据和Integer型数值进行比较,就会抛出ClassCastException * 本函数中使用的排序算法:归并排序 * 时间复杂度:当初始数组中元素是完全随机排列的时候,该函数时间复杂度为O(N*logN) * 当初始数组中元素 部分有序 的时候,该函数的时间复杂度远远小于O(N*logN) * 本函数的适用场景:特别适用于合并两个已经有序的数组,并对合并后的数组重新排序,这种场景下该函数将会有较好的性能 * 【5】 public static <T> void sort(T[] a, Comparator<? super T> c) * public static <T> void sort(T[] a, int fromIndex, int toIndex,Comparator<? super T> c) * 备注:该函数可以指定比较器,使用参数中所指定的比较器来比较数组中的任意两个元素,并且根据比较结果对数组元素进行排序 * 要想使用该函数,必须保证all elements in the array must be <i>mutually comparable</i> * (that is, {@code e1.compareTo(e2)} must not throw a * {@code ClassCastException} for any elements {@code e1} and {@code e2} * in the array). * 譬如,将String类型数据和Integer型数值进行比较,就会抛出ClassCastException * 本函数中使用的排序算法:归并排序 * 时间复杂度:当初始数组中元素是完全随机排列的时候,该函数时间复杂度为O(N*logN) * 当初始数组中元素 部分有序 的时候,该函数的时间复杂度远远小于O(N*logN) * 本函数的适用场景:特别适用于合并两个已经有序的数组,并对合并后的数组重新排序,这种场景下该函数将会有较好的性能 * 查找:【1】public static int binarySearch(long[] a, long key) * 功能:对有序数组a:long[]进行二分查找,查找指定元素ley:long,并返回指定元素在数组中的下标 * 在调用查找函数之前一定要先调用相应的sort()函数对数组进行排序,保证作为search()函数的数组是一个有序数组 * (也即一定要保证a:long[]是有序数组,否则它不能作为binarySearch()函数的参数) * 如果a:long[]不是有序的,那么调用查找函数binarySearch()得到的结果就有可能是错误的 * If the array contains multiple elements with the specified value, there is * no guarantee which one will be found. * 返回值:参见java.util.Ararays程序注解 * 【2】public static int binarySearch(long[] a, int fromIndex, int toIndex,long key) * 功能:这个函数和上面的函数功能类似,只不过这个函数只是在a[fromIndex]~a[toIndex-1]之间查找 * 一定要保证参数a:long[]是一个有序数组 * 【3】下面的函数和上述两个函数功能一致,只不过参数数组的数据类型不一样而已 * public static int binarySearch(int[] a, int key) * public static int binarySearch(int[] a, int fromIndex, int toIndex,int key) * public static int binarySearch(short[] a, short key) * public static int binarySearch(short[] a, int fromIndex, int toIndex,short key) * public static int binarySearch(char[] a, char key) * public static int binarySearch(char[] a, int fromIndex, int toIndex,char key) * public static int binarySearch(byte[] a, byte key) * public static int binarySearch(byte[] a, int fromIndex, int toIndex,byte key) * public static int binarySearch(double[] a, double key) * 备注:This method considers all NaN values to be equivalent and equal. * public static int binarySearch(double[] a, int fromIndex, int toIndex,double key) * 备注:This method considers all NaN values to be equivalent and equal. * public static int binarySearch(float[] a, float key) * 备注:This method considers all NaN values to be equivalent and equal. * public static int binarySearch(float[] a, int fromIndex, int toIndex,float key) * 备注:This method considers all NaN values to be equivalent and equal. * 【4】 public static int binarySearch(Object[] a, Object key) * public static int binarySearch(Object[] a, int fromIndex, int toIndex,Object key) * 【5】public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c) * public static <T> int binarySearch(T[] a, int fromIndex, int toIndex, * T key, Comparator<? super T> c) * 比较(equals):【1】 public static boolean equals(long[] a, long[] a2) * 功能:如果 two arrays contain the same elements in the same order.则返回值为true * 【2】 public static boolean equals(int[] a, int[] a2) * public static boolean equals(short[] a, short a2[]) * public static boolean equals(char[] a, char[] a2) * public static boolean equals(byte[] a, byte[] a2) * public static boolean equals(boolean[] a, boolean[] a2) * public static boolean equals(double[] a, double[] a2) * 备注:this method considers<tt>NaN</tt> equals to itself, * and 0.0d unequal to -0.0d. * public static boolean equals(float[] a, float[] a2) * 备注:this method considers<tt>NaN</tt> equals to itself, * and 0.0f unequal to -0.0f. * 【3】 public static boolean equals(Object[] a, Object[] a2) * 备注: Two objects <tt>e1</tt> and <tt>e2</tt> are considered <i>equal</i> * if <tt>(e1==null ? e2==null : e1.equals(e2))</tt>. * 【4】public static boolean deepEquals(Object[] a1, Object[] a2) * 备注:这个函数专门用于嵌套型数组的比较 * 填充(fill):【1】public static void fill(long[] a, long val) * 功能:往a:long[]中填充元素,使得数组a中的数值全都为val:long * 【2】public static void fill(long[] a, int fromIndex, int toIndex, long val) * 和上述函数功能类似,只不过这个函数只是使a[fromIndex]~a[toIndex-1]变成val:long * 【3】public static void fill(int[] a, int val) * public static void fill(int[] a, int fromIndex, int toIndex, int val) * public static void fill(short[] a, short val) * public static void fill(short[] a, int fromIndex, int toIndex, short val) * public static void fill(char[] a, char val) * public static void fill(char[] a, int fromIndex, int toIndex, char val) * public static void fill(byte[] a, byte val) * public static void fill(byte[] a, int fromIndex, int toIndex, byte val) * public static void fill(boolean[] a, boolean val) * public static void fill(boolean[] a, int fromIndex, int toIndex,boolean val) * public static void fill(double[] a, double val) * public static void fill(double[] a, int fromIndex, int toIndex,double val) * public static void fill(float[] a, float val) * public static void fill(float[] a, int fromIndex, int toIndex, float val) * 【4】public static void fill(Object[] a, Object val) * public static void fill(Object[] a, int fromIndex, int toIndex, Object val) * clone(复制):【1】public static <T> T[] copyOf(T[] original, int newLength) * 功能:从original:T[]中复制newLength个元素,变成一个新的数组被作为函数返回值返回 * 当newLength>original.length时,在新的数组后面补充null * 当newLength>original.length时,只截取original数组的一部分作为新的数组被返回 * 【2】public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) * 备注:和上面的函数功能类似,只是这个函数还可以指定新数组的类型 * 也就是说这个函数不只复制了original:U[]数组,还将数组元素由U型转变成了newType类型 * 【3】public static byte[] copyOf(byte[] original, int newLength) * 功能:从original:byte[]中复制newLength:int个元素组成新的数组并作为返回值返回 * 当newLength>original.length时,在新的数组后面补充0 * 当newLength>original.length时,只截取original数组的一部分作为新的数组被返回 * 【4】public static short[] copyOf(short[] original, int newLength) * 备注:补0(if necessary) * public static int[] copyOf(int[] original, int newLength) * 备注:补0(if necessary) * public static long[] copyOf(long[] original, int newLength) * 备注:补0L(if necessary) * public static char[] copyOf(char[] original, int newLength) * 备注:补'\\u000'(if necessary) * public static float[] copyOf(float[] original, int newLength) * 备注:补0f(if necessary) * public static double[] copyOf(double[] original, int newLength) * 备注:补0f(if necessary) * public static boolean[] copyOf(boolean[] original, int newLength) * 备注:补false(if necessary) * 【5】public static <T> T[] copyOfRange(T[] original, int from, int to) * 功能:copy源数组的一部分到新的数组中 * 将original[from]~original[to-1]依次放入新数组中(当to>original.length时,使用null代替) * 新数组的长度=to-from * @param from:int 0<=from<=original.length * @param to:int from<=to 并且 to可以大于original.length * 【6】public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) * 备注:这个函数和【5】中的函数功能类似,只不过这个函数还会对数组元素进行类型转换,会由原来的类型转变成newType类型 * 【7】public static byte[] copyOfRange(byte[] original, int from, int to) * public static short[] copyOfRange(short[] original, int from, int to) * public static int[] copyOfRange(int[] original, int from, int to) * public static long[] copyOfRange(long[] original, int from, int to) * public static char[] copyOfRange(char[] original, int from, int to) * public static float[] copyOfRange(float[] original, int from, int to) * public static double[] copyOfRange(double[] original, int from, int to) * public static boolean[] copyOfRange(boolean[] original, int from, int to) * 转变成List集合:【1】public static <T> List<T> asList(T... a) * hashCode: 【1】public static int hashCode(long a[]) * 功能:Returns a hash code based on the contents of the specified array. * 1)如果两个long型数组long a[],long b[]完全相同(即相同下标处值相同),也即Arrays.equals(a,b) * 那么Arrays.hashCode(a)==Arrays.hashCode(b) * 2)如果一个List集合中拥有的集合元素和long[] a数组中的元素相同,并且有相同的顺序 * 那么Arrays.hashCode(a)==List#hashCode()函数所得的值 * 【2】public static int hashCode(int a[]) * public static int hashCode(short a[]) * public static int hashCode(char a[]) * public static int hashCode(byte a[]) * public static int hashCode(boolean a[]) * public static int hashCode(float a[]) * public static int hashCode(double a[]) * 【3】public static int hashCode(Object a[]) * 【4】public static int deepHashCode(Object a[]) * 转变成String对象:【1】public static String toString(long[] a) * public static String toString(int[] a) * public static String toString(short[] a) * public static String toString(char[] a) * public static String toString(byte[] a) * public static String toString(float[] a) * public static String toString(double[] a) * 【2】public static String toString(Object[] a) * 【3】public static String deepToString(Object[] a) * * 3.2)实例成员函数 * */ package array; import java.util.Arrays; import java.util.Comparator; import java.util.List; public class JavaAPI_Arrays { public static void main(String[] args){ } }
- java.util.Arrays
学习的过程中总会得到一些心得体会,认真地将它们记录下来并分享给每一个愿意花费时间去阅读它们的人,然后意外地收获某个读者的评论,从而激发出新的感想,是一件十分令人欢快的事。如果你也在研习这方面的知识,欢迎加入到我们的队伍中来,和我们一起进步吧(^_^)
posted on 2017-03-06 15:43 LXRM-JavaWeb、ML 阅读(298) 评论(0) 编辑 收藏 举报