




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
郑州IT培训首选达内,专注IT培训13年,java,UI,php,Android,IOS,软件测试linux,.net,Unity 3d,会计,网络营销等共16大培训课程,美国上市公司,15万大学生共同的选择! QQ:3158895217 java.util.Arrays类详解(源码总结)概述Arrays类位于java.util包下,是一个对数组操作的工具类。今天详细的看了看Arrays类的4千多行源码,现将Arrays类中的方法做一个总结(JDK版本:1.6.0_34)。Arrays类中的方法可以分为八类: sort(对数组排序) binarySearch(二分法查找数组中的元素) equals(比较两个数组是否相等) fill(对数组中的指定位置填充相同的内容) copyOf(数组拷贝) asList(将数组转换为一个固定的List对象) hashCode(计算数组的哈希值) toString(以特定格式输出数组)举例说明说明:以下的代码均为摘抄的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; ilength; i+) if (ai != a2i) return false;/* 对于double类型,使用的是: if (Double.doubleToLongBits(ai)!=Double.doubleToLongBits(a2i) return false; 对于float类型,使用的是: if (Float.floatToIntBits(ai)!=Float.floatToIntBits(a2i) 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; ilength; i+) Object o1 = ai; Object o2 = a2i; 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 = a1i; Object e2 = a2i; 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; itoIndex; i+) ai = val; copyOf/拷贝从0开始的newLength个public static byte copyOf(byte original, int newLength) byte copy = new bytenewLength; 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 + to); byte copy = new bytenewLength; 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(ai); 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(ai); 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 = ai; if (element = null) buf.append(null); else Class eClass = element.getClass(); if (eClass.isArray() if (eClass = byte.class)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学年第一学期幼儿教学工作总结模版
- 创先争优个人学习心得体会模版
- 新生儿单纯疱疹病毒感染的临床护理
- 社保委托代表协议
- 重力教学设计
- 上学期八年级语文教学工作总结模版
- 某精密模具有限公司品质管理系统
- 猫咪输液护理常规
- 部编本大小多少教学设计
- 7S管理培训体系精要
- 人教版二年级下册口算题天天练1000道可打印带答案
- 2022北京东城六年级毕业考英语试题含答案
- 部编版三年级语文下册口语交际:劝告 课件
- 《药物分析与检验技术》课件-异烟肼中游离肼的检查方法
- 手术室的健康教育
- 海水的淡化技术及应用
- 食堂餐饮服务方案
- 中职学校设计说明
- 医保政策下物价培训课件
- 加油站安全风险分级管控和隐患排查治理双重预防机制运行手册
- 攻博计划书模版
评论
0/150
提交评论