分享

类Arrays常用方法速记

 昵称15242507 2014-08-29

 Arrays类包含用来操作数组的各种方法,还包含一个允许将数组作为列表来查看的静态工厂。逐一查阅,不便记忆。通过比较,本人发现只需要记住1/3就可以了,特归纳了一下,共享于大家。

计算机术语:

a) 自然顺序:如果是基本类型(即原生数据),那就是自然顺序,由小到大。如果是对象,那就是比较哈希值,由小到大。
b) 全序(total order)偏序只对部分元素成立关系R,全序对集合中任意两个元素都有关系R。

例如:集合的包含关系就是半序,也就是偏序,因为两个集合可以互不包含;而实数中的大小关系是全序,两个实数必有一个大于等于另一个;又如:复

数中的大小就是半序,虚数不能比较大小。

c) NaN,是Not a Number的缩写。java 用它处理计算中出现的错误情况,比如0.0除以0.0或求负数的平方根。

注意事项:
在使用IDE环境编写工程时,要注意环境设置。比如:下面介绍的Arrays.copyOfRange()方法与JDK版本、JRE版本都有关联,如果使用MyEclipse而没有设

置JRE的路径,它就会使用版本的JRE。1.6版本才支持的方法如果你用到了1.5版本的JRE环境下,会不会报错?你知道的。

d)泛型:在public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)声明中的<T>就是泛型(已经专门整理了两篇学习笔记,请在mfkwine博客上查找)。

一、java.util.Arrays

1、equals

比较两个非同一数组是否相等,而数组本身的equals判断另一个数组是否它本身。

声明:public static boolean equals(type[]a,type[]a2)

参数:a -将测试其相等性的一个数组。a2 -将测试其相等性的另一个数组。参数的类型可以是原生数据类型和引用类型的任意一种类型。

返回:如果两个相等,则返回true。

描述:如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对应相等,则认为这两个数组是相等的。
此外,如果两个数组引用都为null,则认为它们是相等的。e1==null ? e2=null: e1.equals(e2),则认为e1和e2两个对象相等。

注:equals()比较的在堆内存里存放的值, “==”则不确定,详情请参阅本人的另篇博文“比较陷阱”。

2、deepEquals

声明:public static boolean deepEquals(Object[] a1, Object[] a2)

描述:如果两个数组引用均为null,或者它们引用了包含相同元素数量的数组,并且两数组中的所有相应元素对都是深层相等的,则认为这两个数组引用是深层相等的。换言之,第一层引用元素都对应相等,即深层相等。

下列情况,两个null元素e1和e2可能是深层相等的。
a) e1 和 e2 都是对象引用类型的数组,并且 Arrays.deepEquals(e1, e2) 将返回 true。
b) e1 和 e2 都是相同基本类型的数组,并且 Arrays.equals(e1, e2) 的适当重载将返回 true。
c) e1 == e2
d) e1.equals(e2) 将返回 true

参数:
a1 - 将测试其相等性的一个数组
a2 - 将测试其相等性的另一个数组

返回:若两个指定数组彼此深层相等,返回true;否则返回false。

注意事项:
a)此方法支持任意深度的null元素。

b)如果指定数组中的任意一个数组直接或间接通过一个或多个数组级别,包含数组本身作为其元素,则此方法的结果是不明确的,即使用此方法的数组中的引用元素不能包含它本身。

3、fill -分配值给指定数组元素

//作用于数组的所有元素
public static void fill(type[] a, type val)

//作用于数组指定范围内的元素
public static void fill(type[] a, int fromIndex, int toIndex, type val)

描述:将指定的类型值分配给元素。若指定了类型数组的元素范围(fromIdex到toIndex(不包括)),则对值分配给指定范围内的每个元素,否则分配给数组的所有元素。若fromIndex==toIndex,则填充范围为空。

参数:
a -要填充的数组。
val -要存储在数组元素中的值
type -数据类型,可以是任意类型(包括原生数据类型和对象数据类型)。
fromIndex - 要使用指定值填充的第一个元素的索引(包括)。
toIndex - 要使用指定值填充的最后一个元素的索引(不包括)。

4、sort -排序

//作用于数组的所有元素
public static void sort(type[] a)

//作用于数组指定范围内的元素
public static void sort(type[] a, int fromIndex, int toIndex)

描述:
将指定的类型(除boolean以外的任意原生数据类型)数组所有元素(或指定范围内的元素)按数字升序进行排序。
object型数组,根据元素的自然顺序,对指定对象数组进行升序排序。
(fromIndex==toIndex,则排序范围为空)

参数:
a -要排序的数组。
fromIndex -要排序的第一个元素的索引(包括)
toIndex -要排序的最后一个元素(不包括)
type -数据类型可以是除boolean类型以外的所有原生数据和object型数据。

注:

1)double、float类型数组,使用Double.comparTo(java.lang.Double)强制使用全序排序,该排序认为-0.0<0.0并且NaN>任何其他浮点值,而所有的NaN值都等效且相等。而<关系式因为无法实现全序排序没有被采用。

2)对于object进行sort,需注意事项:

  a) object类型数组中所有元素都必须实现Comparable接口,是可相互比较的。也就是说,数组中的任何e1和e2元素而言,e1.compareTo(e2)不得抛出ClassCastException。

  b) 对于object型数组,此排序不会对相等的元素重新排序,以保证数组的稳定性。

  c)对于object型数组,该排序算法采用的是改进过的合并排序算法(若低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。


//使用指定比较器排序

方法声明:
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)

描述:根据指定比较器产生的顺序对指定对象数组(可指定范围)进行排序。数组中(或数组指定范围内的)所有元素都必须是通过指定比较器可相互比较的。也就是说,对于是数组中(可指定范围)的任何e1和e2元素而言,c.compare(e1,e2)不得抛出ClassCastException。

参数:
a -要排序的数组。
c -确定数组顺序的比较器。null值表示使用元素的自然顺序。
fromIndex - 要排序的第一个元素的索引(包括)。
toIndex - 要排序的最后一个元素的索引(不包括)。

注意事项:

1)此排序不会对相等的元素重新排序,以保证数组的稳定性。

2)该排序算法采用的是改进过的合并排序算法(若低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。

5、binarySearch -使用二进制搜索算法搜索指定数组

声明:

public static int binarySearch(type[] a, type key)

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

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)

描述:
使用二进制搜索算法搜索指定的type型数组,以获得指定的值。

参数:
a - 要搜索的数组。
key - 要搜索的值。
fromIndex - 要排序的第一个元素的索引(包括)。
toIndex - 要排序的最后一个元素的索引(不包括)。
type -byte、double、float、object、long、int、short、char、
c - 用来对数组进行排序的比较器。null 值指示应该使用元素的自然顺序。

返回:
如果搜索成功,返回Key的索引;否则返回(插入点-1)。插入点被定义为将Key插入数组的那一点,即如果数组里的所有元素小于指定的key,返回大于key或者数组长度(a.length)的第一个元素。注意:这保证了当且仅当key被找到时,返回值将>=0。

注意事项:

1、此方法调用前必须先对数组进行排序(使用sort()方法)。否则,结果不确定。

2、如果数组包含多个带有指定值的元素,则无法保证打到的是哪一个。

3、type为double、float时,此方法认为NaN值都是等效且相等的。

抛出:

ClassCastException -若搜索的key不能与数组的元素进行比较
IllegalArgumentException - 若 fromIndex > toIndex
ArrayIndexOutOfBoundsException - 若fromIndex < 0 或者 toIndex > a.length

6、toString()

声明:public static String toString(type[] a)

描述:

返回指定数组内容的字符串表示形式。

基本数组,字符串表示形式由数组的元素列表组成,括在[],相邻元素用“, ”(逗号加空格)分隔。这些元素通过String.valueof(type)转换为字符串。

如果a为null,则返回"null"。

object数组,如果数组包含作为元素的其他数组,则通过从Object中继承的Object.toString()方法将它们转换为字符串,这描述了它们的标识,而不是它们的内容。返回值等于Array.aslist(a).toString()的返回值。如果为null返回“null”。

参数:
a - 返回其字符串表示形式的数组
type -数组类型,可以是任意数组类型(如:int、boolean、object)

返回:a的字符串表示形式

7、deepToString

声明:
public static String deepToString(Object[] a)

8、copyOf -数组复制

声明:
public static type[] copyOf(type[] original,int newLength)

public static <T> T[] copyOf(T[] original,int newLength)

public static <T,U> T[] copyOf(U[] original,int newLength,Class<? extends T[]> newType)

描述:
复制指定的数组,并按需要截取或用相应默认值填充。为保证原数组和副本的索引全部有效,两个数组将包含相同的值。在原数组无效的情况下,为保证副本的有效性,副本将包含相应默认值。当且仅当指定长度大于原数组时,这样的索引才存在。

参数:
original - 用来复制的原数组
newLength - 将返回副本的长度
type -byte,short,int,long,float,char,

返回:原数组的副本,通过截取或默认值(类型由数组类型来决定)来得到指定的长度。

抛出:
NegativeArraySizeException - 如果newLength是负数
NullPointerException -如果原数组是null

注意事项:

填充的默认值数据由数组的类型决定,char类型为null('\\u000'),float、long、int、byte、double类型为0(0的类型由数组类型决定),boolean类型为false。

9、copyOfRange -复制指定范围元素到新数组

声明
public static <T> T[] copyOfRange(T[] original,int from,int to)
public static <T,U> T[] copyOfRange(U[] original,int from,int to, Class<? extends T[]> newType)

public static <T> T[] copyOfRange(T[] original,int from,int to)
public static <T,U> T[] copyOfRange(U[] original,int from,int to,Class<? extends T[]> newType)

描述:
复制指定数组的指定范围到新数组。范围的起始索引(from)必须位于0和原数组长度(riginal.length)之间。起始索引(from)的值被放置到副本的起始元素里(除非 from == original.length 或者from ==to)。原数组随后的元素被放置到副本后继的元素中。范围的终止索引(to)必须大于或等于from,

可以大于原数组长度(original.length), 副本元素索引大于或等于(original.length - from)的全部放置为默认值i。 返回数组的长度为to - from.

参数:
original - 用来复制的原数组
from - 用来复制的起始索引,包括。
to - 用来复制的最终索引--不包括 (该索引可以超出数组)
newType - 返回副本的类

返回:
一个新数组,它包含原数组指定范围内的元素,通过截取或者分配默认值获取需要的长度。

抛出:
ArrayIndexOutOfBoundsException - 如果 from < 0 或者 from > original.length
IllegalArgumentException - 如果 from > to
NullPointerException - 如果原数组为null(即没有初始化)

注意事项:

填充的默认值数据由数组的类型决定,char类型为null('\\u000'),float、long、int、byte、double类型为0(0的类型由数组类型决定),boolean类型为false。


小结:

1、Arrays类的方法,除个别方法不支持boolean型数组以外,基本上支持所有的数据类型。

2、deepEquals()方法实际上是Equals()方法的递归算法;deepToString()是toString()的递归。

3、搜索前必须先使用对应的sort方法排序。比如使用第三种方法指定比较器搜索前必须使用sort(T[],Comparator)方法。

4、Java指定范围时一般采用下包含方式,即包括范围的第一个索引,不包括范围的最后一个索引。fill()等方法里的范围fromIndex(首一个索引,包括)

、toIndex(最后一个索引,不包括);copyOfRange()方法里的方法from(首索引,包括),to(尾索引,不包括)

5、fill()、sort()、binarySearch()指定范围时,若fromIndex==toIndex时,范围为空,超出数组长度或fromIndex>toIndex都抛出异常。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多