java array包_java:数组操作工具类 java.util.Arrays包 主要方法详解

Arrays类位于Java.util包下,是一个对数组操作的工具类,现将Arrays类中的方法做一个总结(JDK版本:1.6.0_34)。Arrays类中的方法可以分为八类:

sort(对数组排序)

binarySearch(二分法查找数组中的元素)

equals(比较两个数组是否相等)

fill(对数组中的指定位置填充相同的内容)

copyOf(数组拷贝)

asList(将数组转换为一个固定的List对象)

hashCode(计算数组的哈希值)

toString(以特定格式输出数组)

(1)简单例子示范

1.array转化为List ,利用java.util.Arrays中的asList方法

Integer []arr = {1,2,3};

System.out.println(arr);

List list = Arrays.asList(arr);

System.out.println(list);

输出结果:

[Ljava.lang.Integer;@659e0bfd

[1, 2, 3]

2.array的排序问题,利用java.util.Arrays中的sort方法排序

Integer a[]={1,5,3,8,4};

Arrays.sort(a);//实现了对数组从小到大的排序

List aList = Arrays.asList(a);

System.out.println(Arrays.asList(aList));

3.数组元素的定位查找,返回数组的下标

使用java.util.Arrays中的binarySearch方法搜索该值的下标

int find;

int b[]={1,5,3,8,4};

find=Arrays.binarySearch(b , 8);

System.out.println(find);

输出:3

4.打印数组array的数值

int c[]={1,5,3,8,4};

String aString =Arrays.toString(c);//String 前的a和括号中的a均表示数组名称

System.out.println(aString);//String 前的a表示数组名称

输出:[1, 5, 3, 8, 4]

5.查看数组中是否包含特定的值,使用java.util.Arrays的array的转化为List的方法,然后使用list中的contains方法

int a[]={1,5,3,8,4}; boolean b=Arrays.asList(a).contains(1); System.out.println(b);//注意:b的值只可能是true或false

输出:true

(2)方法的通用写法示范

说明:以下的代码均为摘抄的java.util.Arrays类中的源码,注释为本人所加。

sort

//对数组a进行排序

public static void sort(long[] a) {

sort1(a, 0, a.length);

}

//对数组a中的从fromIndex(包含)至toIndex(不包含)的值进行排序

public static void sort(long[] a, int fromIndex, int toIndex) {

rangeCheck(a.length, fromIndex, toIndex);

sort1(a, fromIndex, toIndex-fromIndex);

}

/**

对基本类型数组的排序有以上两种方法,这里只摘出了long类型的。sort1方法篇幅原因没有摘出来,在sort1方法中使用的是经过调优的快速排序算法(tuned quicksort)。

**/

..........

..........

..........

//对对象类型进行排序

public static void sort(Object[] a) {

Object[] aux = (Object[])a.clone();

mergeSort(aux, a, 0, a.length, 0);

}

//对对象a中的从fromIndex(包含)至toIndex(不包含)的值进行排序

public static void sort(Object[] a, int fromIndex, int toIndex) {

rangeCheck(a.length, fromIndex, toIndex);

Object[] aux = copyOfRange(a, fromIndex, toIndex);

mergeSort(aux, a, fromIndex, toIndex, -fromIndex);

}

/**

对对象类型数组的排序有以上两种方法,在mergeSort方法中使用的是经过修改的归并排序算法(modified mergesort)。

**/

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

binarySearch

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

return binarySearch0(a, 0, a.length, key);

}

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

long key) {

rangeCheck(a.length, fromIndex, toIndex);

return binarySearch0(a, fromIndex, toIndex, key);

}

/**

对数组中元素的查找有以上两种方法,在binarySearch0方法中使用的是二分查找法。并且对基本类型和对象类型的数组查找是同样的操作。

**/

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

equals

//比较基本类型数组是否相等

public static boolean equals(long[] a, long[] a2) {

if (a==a2)

return true;

if (a==null || a2==null)

return false;

int length = a.length;

if (a2.length != length)

return false;

for (int i=0; i

if (a[i] != a2[i])

return false;

/**

对于double类型,使用的是:

if (Double.doubleToLongBits(a[i])!=Double.doubleToLongBits(a2[i]))

return false;

对于float类型,使用的是:

if (Float.floatToIntBits(a[i])!=Float.floatToIntBits(a2[i]))

return false;

这样做是为了精确比较。

**/

return true;

}

.....

.....

.....

//比较Object类型数组是否相等

public static boolean equals(Object[] a, Object[] a2) {

if (a==a2)

return true;

if (a==null || a2==null)

return false;

int length = a.length;

if (a2.length != length)

return false;

for (int i=0; i

Object o1 = a[i];

Object o2 = a2[i];

if (!(o1==null ? o2==null : o1.equals(o2)))

return false;

}

return true;

}

.....

.....

.....

//深度比较两个数组是否相等

public static boolean deepEquals(Object[] a1, Object[] a2) {

if (a1 == a2)

return true;

if (a1 == null || a2==null)

return false;

int length = a1.length;

if (a2.length != length)

return false;

for (int i = 0; i < length; i++) {

Object e1 = a1[i];

Object e2 = a2[i];

if (e1 == e2)

continue;

if (e1 == null)

return false;

// Figure out whether the two elements are equal

boolean eq;

if (e1 instanceof Object[] && e2 instanceof Object[])

eq = deepEquals ((Object[]) e1, (Object[]) e2);

else if (e1 instanceof byte[] && e2 instanceof byte[])

eq = equals((byte[]) e1, (byte[]) e2);

else if (e1 instanceof short[] && e2 instanceof short[])

eq = equals((short[]) e1, (short[]) e2);

else if (e1 instanceof int[] && e2 instanceof int[])

eq = equals((int[]) e1, (int[]) e2);

else if (e1 instanceof long[] && e2 instanceof long[])

eq = equals((long[]) e1, (long[]) e2);

else if (e1 instanceof char[] && e2 instanceof char[])

eq = equals((char[]) e1, (char[]) e2);

else if (e1 instanceof float[] && e2 instanceof float[])

eq = equals((float[]) e1, (float[]) e2);

else if (e1 instanceof double[] && e2 instanceof double[])

eq = equals((double[]) e1, (double[]) e2);

else if (e1 instanceof boolean[] && e2 instanceof boolean[])

eq = equals((boolean[]) e1, (boolean[]) e2);

else

eq = e1.equals(e2);

if (!eq)

return false;

}

return true;

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

fill

//使用val对a数组进行数据填充

public static void fill(long[] a, long val) {

fill(a, 0, a.length, val);

}

//使用val对a数组从fromIndex(包含)至toIndex(不包含)位置进行数据填充

public static void fill(long[] a, int fromIndex, int toIndex, long val) {

rangeCheck(a.length, fromIndex, toIndex);

for (int i=fromIndex; i

a[i] = val;

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

copyOf

//拷贝从0开始的newLength个

public static byte[] copyOf(byte[] original, int newLength) {

byte[] copy = new byte[newLength];

System.arraycopy(original, 0, copy, 0,

Math.min(original.length, newLength));

return copy;

}

.....

.....

.....

//拷贝从from(包含)位置到to(不包含)的元素

public static byte[] copyOfRange(byte[] original, int from, int to) {

int newLength = to - from;

if (newLength < 0)

throw new IllegalArgumentException(from + " > " + to);

byte[] copy = new byte[newLength];

System.arraycopy(original, from, copy, 0,

Math.min(original.length - from, newLength));

return copy;

}

/**

拷贝方法有以上两种,对于基本类型和对象操作是一样的。而System.arraycopy()方法为浅拷贝,故如果是对象数组的拷贝,只是拷贝了对象的引用,没有重新new每一个对象。

**/

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

asList

没有深究。。。。。。

hashCode

//对基本数据类型的hashcode的计算

public static int hashCode(long a[]) {

if (a == null)

return 0;

int result = 1;

for (long element : a) {

//对于不同的基本数据类型,计算hashcode的具体操作是不一样的

int elementHash = (int)(element ^ (element >>> 32));

result = 31 * result + elementHash;

}

return result;

}

....

....

....

//对于Object类型数组的hashcode的计算

public static int hashCode(Object a[]) {

if (a == null)

return 0;

int result = 1;

for (Object element : a)

result = 31 * result + (element == null ? 0 : element.hashCode());

return result;

}

....

....

....

//对于数组的hashcode值的深度计算

public static int deepHashCode(Object a[]) {

if (a == null)

return 0;

int result = 1;

for (Object element : a) {

int elementHash = 0;

if (element instanceof Object[])

elementHash = deepHashCode((Object[]) element);

else if (element instanceof byte[])

elementHash = hashCode((byte[]) element);

else if (element instanceof short[])

elementHash = hashCode((short[]) element);

else if (element instanceof int[])

elementHash = hashCode((int[]) element);

else if (element instanceof long[])

elementHash = hashCode((long[]) element);

else if (element instanceof char[])

elementHash = hashCode((char[]) element);

else if (element instanceof float[])

elementHash = hashCode((float[]) element);

else if (element instanceof double[])

elementHash = hashCode((double[]) element);

else if (element instanceof boolean[])

elementHash = hashCode((boolean[]) element);

else if (element != null)

elementHash = element.hashCode();

result = 31 * result + elementHash;

}

return result;

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

toString

//基本数据类型转字符串

public static String toString(long[] a) {

if (a == null)

return "null";

int iMax = a.length - 1;

if (iMax == -1)

return "[]";

StringBuilder b = new StringBuilder();

b.append('[');

for (int i = 0; ; i++) {

b.append(a[i]);

if (i == iMax)

return b.append(']').toString();

b.append(", ");

}

}

.....

.....

.....

//Object类型使用valueOf方法转字符串

public static String toString(Object[] a) {

if (a == null)

return "null";

int iMax = a.length - 1;

if (iMax == -1)

return "[]";

StringBuilder b = new StringBuilder();

b.append('[');

for (int i = 0; ; i++) {

b.append(String.valueOf(a[i]));

if (i == iMax)

return b.append(']').toString();

b.append(", ");

}

}

.....

.....

.....

//深度转换字符串

public static String deepToString(Object[] a) {

if (a == null)

return "null";

int bufLen = 20 * a.length;

if (a.length != 0 && bufLen <= 0)

bufLen = Integer.MAX_VALUE;

StringBuilder buf = new StringBuilder(bufLen);

deepToString(a, buf, new HashSet());

return buf.toString();

}

private static void deepToString(Object[] a, StringBuilder buf,

Set dejaVu) {

if (a == null) {

buf.append("null");

return;

}

dejaVu.add(a);

buf.append('[');

for (int i = 0; i < a.length; i++) {

if (i != 0)

buf.append(", ");

Object element = a[i];

if (element == null) {

buf.append("null");

} else {

Class eClass = element.getClass();

if (eClass.isArray()) {

if (eClass == byte[].class)

buf.append(toString((byte[]) element));

else if (eClass == short[].class)

buf.append(toString((short[]) element));

else if (eClass == int[].class)

buf.append(toString((int[]) element));

else if (eClass == long[].class)

buf.append(toString((long[]) element));

else if (eClass == char[].class)

buf.append(toString((char[]) element));

else if (eClass == float[].class)

buf.append(toString((float[]) element));

else if (eClass == double[].class)

buf.append(toString((double[]) element));

else if (eClass == boolean[].class)

buf.append(toString((boolean[]) element));

else { // element is an array of object references

if (dejaVu.contains(element))

buf.append("[...]");

else

deepToString((Object[])element, buf, dejaVu);

}

} else { // element is non-null and not an array

buf.append(element.toString());

}

}

}

buf.append(']');

dejaVu.remove(a);

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值