MENU

Java-16 Arrays类方法

August 29, 2023 • Read: 63 • Java阅读设置

数组
以下内容并不全面,仅包含根据目前所学内容能够完全掌握的内容

Arrays工具类

java.util.Arrays是包含各种操作数组的方法的类,该类也包含一个能够将数组arrays看成列表lists的静态工厂static factory

该类中的方法,如果指定的数组引用为空,都会抛出一个NullPointerException的异常,除非有特别说明。

异常情况并不是指语法错误,可以理解为逻辑错误,比如不能除0。
针对方法,异常情况出现在传入的参数不符合逻辑时。
由于数组是引用数据类型,因此其值可以是null,而对于数组类方法,其要求传入的数组作为参数,因此当传入的数组为null时,数组类方法都会抛出NullPointerException的异常。
2023-08-29T14:19:07.png

Methods

1 binarySearch
该方法的功能是实现在一个数组中进行二分查找以查找目标元素。

该方法存在两种形式:

  • 1)二分查找的范围为整个数组;
  • 2)二分查找的范围为整个数组中的某部分。

两种形式对应两种参数要求:

  • 1)数组[]a和目标元素key
  • 2)数组[]a,查找范围formIndex, toIndex和目标元素key,其中查找范围包含fromIndex的元素,而不包含toIndex的元素,即[fromIndex, toIndex)

参数其他要求:

  • 二分查找的要求是有序,因此该方法的传入数组或传入数组的某部分要求有序。
    如果传入的数组无序,则返回的结果是不确定的。因为该方法始终按照二分查找的算法进行查找,无序的二分查找结果就是不确定的。
  • 数组的元素数据类型与目标元素数据类型一致,适用该方法的数据类型包括:byteshortcharintlongfloatdouble,简单来说,基本数据类型中除了boolean型都适用。
  • 查找范围就是两个索引值,因此为int型数据。

二分查找的结果有两种情况,因此该方法存在两种返回值:

  • 数组中存在目标元素,此时会返回数组中目标元素的索引值,因此返回值为int型。
    数组中若存在多个目标元素,返回哪个目标元素的索引值不确定。因为,二分查找对相同值的元素的查找顺序依赖于数组长度。
  • 数组中若不存在目标元素,此时会返回一个负数,该数定义为(-(insertion point) - 1),其中insertion point表示目标元素插入到该数组中的正确位置得索引,即该数组中比目标元素大的第一个元素的索引(一个元素在有序数组中的正确位置就是左边都是比它小或等的数,右边都是比它大的数),若该数组中全都比该元素小或等,此时为该数组的长度。因此返回值为int型。

总之,返回值不为负数则表示数组中存在目标元素。

该方法的抛出异常情况:

  • 对于对整个数组进行二分查找的方法,不存在其他抛出异常情况,除了以下数组相关方法的普遍异常情况:

    • NullPointerException:当传入的数组为null时,抛出该异常。
  • 对于对数组某部分进行二分查找的方法,除了上面的数组相关方法的普遍异常情况,还存在两种异常情况,分别对应抛出的两类异常:

    • IllegalArgumentException:当fromIndex > toIndex时,抛出该异常。
    • ArrayIndexOutOfBoundsException:当fromIndex < 0toIndex > length时,抛出该异常。

按照数据类型的不同,binarySearch方法如下:

  • byte

    • public static int binarySearch(byte[] a, byte key)
      2023-08-29T07:37:23.png
    • public static int binarySearch(byte[] a, int fromIndex, int toIndex, byte key)
      2023-08-29T07:43:44.png
  • char

    • public static int binarySearch(char[] a, char key)
      2023-08-29T08:01:59.png
    • public static int binarySearch(char[] a, int fromIndex, int toIndex, char key)
  • short

    • public static int binarySearch(short[] a, short key)
    • public static int binarySearch(short[] a, int fromIndex, int toIndex, short key)
  • long

    • public static int binarySearch(long[] a, long key)
    • public static int binarySearch(long[] a, int fromIndex, int toIndex, long key)
  • float

    • public static int binarySearch(float[] a, float key)
    • public static int binarySearch(float[] a, int fromIndex, int toIndex, float key)
  • double

    • public static int binarySearch(double[] a, double key)
    • public static int binarySearch(double[] a, int fromIndex, int toIndex, double key)

2 copyOf
该方法的功能是实现对一个数组的复制以生成一个新的数组,新数组的长度决定对数组复制的长度。
具体地,若新数组的长度,假设为newLength,不超过数组长度,则新数组等于对数组从头开始复制到newLength长度的部分。若新数组的长度等于数组长度,则新数组等于对数组的复制。
若新数组的长度超过数组长度,则新数组从头开始到与数组相同长度的元素都与数组相同,长度超过部分的元素为对应元素类型的默认值,即0对应的该类型的值。

该方法不同于赋值,是真正的复制,即new出了新数组。
2023-08-29T14:49:14.png

该方法的参数:

  • 数组[]original
  • 长度newLength

参数的其他要求:

  • 数组的元素类型有多种,适用于该方法的数据类型包括:byteshortcharintlongfloatdoubleboolean,简单来说,所有的基本数据类型都适用。
  • 长度实际上是指复制生成的新数组的长度,因此为int型数据。

该方法的返回值:
该方法就是返回通过复制数组而生成的新数组,但根据新数组的长度不同,产生两种情况:

  • newLength <= original.length:此时新数组为对original数组从头开始以newLength长度进行复制的结果。
  • newLength > original.length:此时新数组从头开始到与original数组相同长度部分与original数组一致,长度超过部分以对应元素类型的默认值,即0对应的该类型的值,填充。

总之,返回值为与原数组相同元素类型的一个新数组。

该方法的抛出异常情况:

  • NullPointerException:当传入的original数组为null时,抛出该异常。
  • NegativeArraySizeException:当传入的新数组的长度newLength为负数时,抛出该异常。

按照数据类型不同,copyOf方法如下:

  • bytepublic static byte[] copyOf(byte[] original, int newLength)
  • shortpublic static short[] copyOf(short[] original, int newLength)
  • charpublic static char[] copyOf(short[] original, int newLength)
  • intpublic static int[] copyOf(short[] original, int newLength)
  • longpublic static long[] copyOf(short[] original, int newLength)
  • floatpublic static float[] copyOf(short[] original, int newLength)
  • doublepublic static double[] copyOf(short[] original, int newLength)
  • booleanpublic static boolean[] copyOf(boolean[] original, int newLength)

3 copyOfRange
该方法的功能与copyOf类似,不同之处在于copyOf是必须从头开始复制到指定的长度,超过原数组的部分用默认值填充,而copyOfRange是能够指定从哪开始复制from到哪结束to,即生成的新数组长度为to-from,超过原数组部分仍用默认值填充。

该方法的参数:

  • 数组[]original
  • 复制开始索引from
  • 复制结束索引to

参数其他说明:

  • 数组的元素类型有多种,与copyOf方法相同,所有的基本数据类型都适用该方法。
  • fromto不仅代表了复制范围,也指定了新数组的长度,复制元素包括from位置的元素,而不包括to所在的元素,即新数组长度为to - from。这两个参数都为int型。

该方法的返回值:

  • copyOf方法,该方法返回有复制生成的新数组,新数组的元素类型与原数组一致。

该方法的抛出异常情况:

  • NullPointerException:当传入的original数组为null时,抛出该异常。
  • ArrayIndexOutOfBoundsException:当from < 0from > original.length时,抛出该异常。
  • IllegalArgumentException:当from > to时,抛出该异常。

2023-08-30T03:10:27.png

4 equals
该方法的功能是判断两个数组是否相等,两个数组当且仅当具有相同顺序的相同元素时,才视为相等。

注意,对于floatdouble型的元素,存在以下特殊情况:

  • 值为+0.0-0.0
    虽然+0.0 == -0.0的值为true,但在该方法中,+0.0并不等于-0.0
    +0.0-0.0的含义并不相同,正数/+0.0值为正无穷,而正数/-0.0值为负无穷。
    可以将equals方法的相同标准视为含义完全相同。
  • 值为NaN
    NaN表示Not a Number,只会出现在浮点型中,虽然其他数值类型也有得到非数的情况比如0/0,但会直接报错,而不会得到NaN这样一个结果。
    虽然NaN == NaN的值为false,但在该方法中,NaN等于NaN
    可以理解为,含义相同。

实际上,上述情况是因为equals方法遵从floatdouble型对应的类FloatDoubleequals方法,该方法针对浮点型的这两种情况与==的判断结果是不同的。
2023-08-30T08:15:14.png

该方法的参数:

  • 数组[]a
  • 数组[]a2

参数的其他说明:

  • 数组的元素类型有多种,所有基本数据类型都适用该方法,对象数据类型也适用该方法(之后学习到了再补充)。
    传入的两个数组的元素数据类型一致。
  • 由于数组属于引用数据类型,因此数组的值可以是null,在该方法中数组可以是null

该方法的返回值:

  • 该方法返回判断结果对应的boolean型数据。

该方法的抛出异常情况:
该方法不会抛出异常。

根据基本数据类型,equals方法如下:
2023-08-30T08:25:36.png

2023-08-30T08:25:55.png

5 deepEquals
针对对象数据类型,之后学习后再补充。

6 fill
该方法的功能是给数组赋予指定的元素值。

该方法存在两种形式:

  • 1)给整个数组每个元素赋予指定的元素值。
  • 2)给数组某个指定范围内的元素赋予指定的元素值。

两种形式对应两种参数要求:

  • 1)数组[]a和元素值val
  • 2)数组[]a,指定范围fromIndex, toIndex和元素值val,其中赋值元素包含fromIndex的元素,而不包含toIndex的元素,即[fromIndex, toIndex)

参数其他说明:

  • 数组的元素数据类型和元素值的数据类型一致。
  • 所有基本数据类型都适用该方法,并且对象数据类型也适用(待补充)。
  • 指定范围为两个索引值,因此为int型数据。

该方法的返回值:

  • 该方法是对已存在的数组中的元素赋予指定的值,因此不存在返回值。

该方法的抛出异常情况(仅针对基本数据类型,其他待补充):

  • NullPointerException:当传入的数组anull时,抛出该异常。
  • IllegalArgumentException:当fromIndex > toIndex时,抛出该异常。
  • ArrayIndexOutOfBoundsException:当fromIndex < 0toIndex > a.length时,抛出该异常。

根据不同数据类型,fill方法如下:
2023-08-30T09:01:00.png
2023-08-30T09:01:25.png

代码测试:
2023-08-30T09:01:47.png

7 hashCode
该方法的功能是基于指定数组的内容,即数组中的元素,生成一个哈希码。
哈希码为int型。
如果两个数组ab,其Arrays.equals(a, b)的值为true,那么这两个数组利用该方法生成的哈希码相同。

另外,如果一个List中包含与该数组元素一致的实例序列,那么该List中的hashCode方法与该方法对该数组返回的哈希码相同。(待补充)

该方法允许传入的数组为null,此时返回的哈希码为0

该方法的参数:

  • 数组[]a

参数的其他说明:

  • 该方法适用于所有基本数据类型,并且适用于对象数据类型(待补充)。

该方法的返回值:

  • 该方法返回基于指定数组内容的哈希码,哈希码为int型。

该方法的抛出异常情况:
该方法不会抛出异常情况。

根据不同的数据类型,hashCode方法如下:
2023-08-30T09:22:01.png

代码测试:
2023-08-30T09:25:46.png

8 deepHashCode
针对对象数据类型,待补充。

9 setAll
涉及函数,待补充。

10 parallelSetAll
涉及函数,待补充。

11 sort
该方法的功能是对数组按照升序进行排序。

该方法采用的排序算法是Dual-Pivot Quicksort,快排的一种,这种快速排序能够在很多使得其他快速排序算法的性能降低到二次方的数据集上仍然达到O(nlog(n))的性能,该快排算法通常比传统快排算法更快。

对于floatdouble型的元素,存在以下两种特殊情况,即存在两种特殊的比较关系:

  • 值为+0.0-0.0,该方法中+0.0 > -0.0
  • 值为NaN,该方法中NaN大于任何值,并且NaNNaN相等。

实际上,上述情况是由于sort方法遵从了floatdouble型对应的类FloatDouble中的compareTo方法。

该方法存在两种形式:

  • 1)排序的范围为整个数组;
  • 2)排序的范围为整个数组中的某个范围。

两种形式对应两种参数:

  • 1)数组[]a
  • 2)数组[]a和排序范围fromIndex, toIndex,其中参与排序的元素包含fromIndex的元素,而不包含toIndex的元素,即[fromIndex, toIndex)

参数的其他说明:

  • 该方法适用于所有能比较的基本数据类型,即除了boolean型都可以,并且适用于对象数据类型等(待补充)。
  • 排序范围就是两个索引值,因此为int型数据。

该方法的返回值:

  • 该方法无返回值,仅对已存在的数组进行排序。

该方法的抛出异常情况(仅针对基本数据类型,其他待补充):

  • NullPointerException:当传入的数组anull时,抛出该异常。
  • IllegalArgumentException:当fromIndex > toIndex时,抛出该异常。
  • ArrayIndexOutOfBoundsException:当fromIndex < 0toIndex > a.length时,抛出该异常。

代码测试:
2023-08-30T10:10:55.png

12 parallelSort
待补充。

13 parallelPrefix
待补充。

14 spliterator
待补充。

15 stream
待补充。

16 toString
该方法的功能是生成数组内容对应的字符串表示,并返回。
该字符串表示由[]和数组内容及,组成。

各种类型的元素对应的字符串型的值实际上通过String.valueOf(dataType data)获取。

该方法的参数:

  • 数组[]a

参数的其他说明:

  • 所有基本数据类型的元素对应的数组都适用于该方法,并且对象数据类型也适用(待补充)。
  • 该方法允许传入的数组为null,此时返回的字符串为"null"

该方法的返回值:

  • 数组内容对应的字符串表示,String型。

该方法的抛出异常情况:

  • 不存在抛出异常情况。

代码测试:
2023-08-30T10:25:42.png

17 deepToString
针对对象数据类型,待补充。

18 asList
public static <T> List<T> asList(T... a):该方法能够将指定的多个元素转换为List,该方法参数是可变参数,换句话说,该方法能够将指定的包含多个对象元素的数组转换为List。该方法是实现数组-->List的方法。
2023-11-22T09:00:31.png
2023-11-22T09:01:38.png

Last Modified: November 22, 2023