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<Integer> 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<Integer> 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)。
**/

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方法中使用的是二分查找法。并且对基本类型和对象类型的数组查找是同样的操作。
**/

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<length; 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<length; 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;
}

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<toIndex; i++)
a[i] = val;
}

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每一个对象。
**/

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;
}

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<Object[]> 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);
}

java:数组操作工具类 java.util.Arrays包 主要方法详解的更多相关文章

  1. Java构造和解析Json数据的两种方法详解二

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...

  2. Java构造和解析Json数据的两种方法详解二——org.json

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...

  3. Java构造和解析Json数据的两种方法详解一——json-lib

    转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...

  4. “全栈2019”Java多线程第八章:放弃执行权yield()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. “全栈2019”Java多线程第六章:中断线程interrupt()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. Java 8函数编程轻松入门(三)默认方法详解(default function)

    default出现的原因 Java 8中对API最大的改变在于集合类,Java在持续演进,但是它一直保持着向后兼容. 在Java 8中为Collection接口增加了stream方法,这意味着所有实现 ...

  8. Ubuntu下制作deb包的方法详解

    1  认识deb包 1.1   认识deb包 deb是Unix系统(其实主要是Linux)下的安装包,基于 tar 包,因此本身会记录文件的权限(读/写/可执行)以及所有者/用户组. 由于 Unix ...

  9. 关于Python安装官方whl包和tar.gz包的方法详解

    Windows环境: 安装whl包:pip install wheel -> pip install **.whl 安装tar.gz包:cd到解压后路径,python setup.py inst ...

随机推荐

  1. css3多列及瀑布流效果

    css3内容分块,多列效果(类似报纸版块排版): .div02{ /*count:内容分为几列,gap:内容与分割线的距离,rule:分割线样式*/ column-count:; column-gap ...

  2. javascript多种方法实现数组去重

    先说说这个实例的要求:写一个方法实现数组的去重.(要求:执行方法,传递一个数组,返回去重后的新数组,原数组不变,实现过程中只能用一层循环,双层嵌套循环也可写,只做参考): 先给初学者解释一下什么叫数组 ...

  3. Big Data Solution in Azure: Azure Data Lake

    https://blogs.technet.microsoft.com/dataplatforminsider/2015/09/28/microsoft-expands-azure-data-lake ...

  4. 刚安装Fedora 23工作站后,你必须要做的24件事

    [51CTO.com快译]Fedora 23工作站版本已发布,此后我们就一直在密切关注它.我们已经为新来读者介绍了一篇安装指南:<Fedora 23工作站版本安装指南> 还有一篇介绍如何从 ...

  5. Python输入函数 raw_input( ) 与 input()

    一. raw_input() 在Python中,获取键盘输入的数据的方法是采用 raw_input 函数,那么这个 raw_input 怎么用呢? 注意: raw_input()的小括号中放入的是,提 ...

  6. 【Tomcat】Invalid character found in the request target

    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC ...

  7. 【HotSpot】jps命令行详解

    jps (JVM Process Status) jdk提供的一个查看当前Java进程的小工具. 命令输入格式:jps [选项 ] [ 主机号 ] [options]选项 : -q:仅输出VM标识符, ...

  8. Windbg查看调用堆栈(k*)

            无论是分析程序崩溃原因,还是解决程序hang问题,我们最常查看的就是程序调用堆栈.学会windbg调用堆栈命令,以及理解堆栈中的各个参数的意义就显得至关重要. 上图就是一个典型的Win ...

  9. Win10快速关机的快捷键

    Win10快速关机的快捷键... ------------------------------- -------------------------------------------- 关机程序的位 ...

  10. JavaScript 学习笔记 - LocalStorage

    前言 本文主要介绍本地存储的基本使用,以及它和 Cookie.SessionStorage 的区别. 简单回顾 Cookie 在 HTML5 之前,本地存储数据一般是通过 Cookie 来完成的.我们 ...