Java集合框架:Arrays工具类
来源:互联网 发布:flash网站源码下载 编辑:程序博客网 时间:2024/05/16 10:01
java.util.Arrays类能方便地操作数组,它提供的方法都是静态的。整个Arrays工具类的实现有3000+行,但是归纳总结一下可知它有以下功能(9个):
1. asList
定义:
@SafeVarargs public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
功能:将一个数组(变长参数的语法糖实现就是数组)转变成一个List(确切的来说是ArrayList),注意这个List是定长的,企图添加或者删除数据都会报错(java.lang.UnsupportedOperationException).
譬如案例1-1:
List<Integer> list = Arrays.asList(3,4,2,1,5,7,6); System.out.println(list);
输出结果:[3, 4, 2, 1, 5, 7, 6]
但是,对于基础类型(比如byte,int,float等)千万不要想着这么实现(案例1-2,勿效仿):
int a[] = new int[]{1,2,5,4,6,8,7,9}; List list = Arrays.asList(a);
因为List list = Arrays.asList(a);会变成List
for(int[] arr:list) { for(int i:arr) { System.out.println(i); } }
这样操作就显得非常的烦琐。因为预想List是List<Integer>形式的,没想到是List<int[]>形式的。使用的时候要特别的注意一下。
2. sort
对数组进行排序。适合byte,char,double,float,int,long,short等基本类型,还有Object类型(实现了Comparable接口),如果提供了比较器Comparator也可以适用于泛型。
案例2-1(基础类型,输出:[1, 1, 4, 4, 5, 6, 7, 9]):
int a[] = new int[]{1,9,5,4,6,4,7,1}; Arrays.sort(a); System.out.println(Arrays.toString(a));
案例2-2(String类型(Object),实现了Comparable接口,输出:[s1, s2, s3, s4]):
String str[] = {"s2","s4","s1","s3"}; Arrays.sort(str); System.out.println(Arrays.toString(str));
案例2-3 (自定义类型,实现了Comparable接口,输出:[jj:17, zzh:18, qq:19]):
Person1 persons[] = new Person1[]{ new Person1("zzh",18),new Person1("jj",17),new Person1("qq",19) }; Arrays.sort(persons); System.out.println(Arrays.toString(persons));
案例2-4(泛型,如果类型没有实现Comparable接口,可以通过Comparator实现排序):
Person2 persons2[] = new Person2[]{ new Person2("zzh",18),new Person2("jj",17),new Person2("qq",19) }; Arrays.sort(persons2,new Comparator<Person2>(){ @Override public int compare(Person2 o1, Person2 o2) { if(o1 == null || o2 == null) return 0; return o1.getAge()-o2.getAge(); } }); System.out.println(Arrays.toString(persons2));
输出:[jj:17, zzh:18, qq:19]
关于类Person1和类Person2的详细细节可以参考《Comparable与Comparator浅析》
3. binarySearch
通过二分查找法对已排序(譬如经过Arrays.sort排序,且按照升序进行排序。如果数组没有经过排序,那么检索结果未知)的数组进行查找。适合byte,char,double,float,int,long,short等基本类型,还有Object类型和泛型(参考sort那段)
案例3-1:
String str[] = {"s2","s4","s1","s3"}; Arrays.sort(str); System.out.println(Arrays.toString(str)); int ans = Arrays.binarySearch(str, "s1"); System.out.println(ans);
输出:
[s1, s2, s3, s4]0
4. copyOf
数组拷贝,底层采用System.arrayCopy(native方法)实现。
案例4-1:
String str[] = {"s2","s4","s1","s3"}; String str2[] = Arrays.copyOf(str, str.length); System.out.println(Arrays.toString(str2));
输出:[s2, s4, s1, s3]
5. copyOfRange
数组拷贝,指定一定的范围,譬如(public static T[] copyOfRange(T[] original, int from, int to))。底层采用System.arrayCopy(native方法)实现。
案例5-1:
String str[] = {"s2","s4","s1","s3"}; String str2[] = Arrays.copyOfRange(str,1,3); System.out.println(Arrays.toString(str2));
输出:[s4, s1]
6. equals和deepEquals
equals:判断两个数组的每一个对应的元素是否相等(equals, 对于两个数组的元素o1和o2有o1==null ? o2==null : o1.equals(o2))。
案例6-1:
String str1[] = {"s2","s4","s1","s3",null}; String str2[] = Arrays.copyOf(str1, str1.length); System.out.println(Arrays.equals(str1, str2));
输出:true
deepEquals:主要针对一个数组中的元素还是数组的情况,类似deepToString, deepHashCode如下:
案例6-1:
int a1[] = new int[]{1,2,3}; int a2[] = new int[]{1,3,3}; int a3[] = new int[]{4,3,2,1}; int a4[] = new int[]{1,2,3}; int a5[] = new int[]{1,3,3}; int a6[] = new int[]{4,3,2,1}; int[] a [] = new int[][]{a1,a2,a3}; int[] b [] = new int[][]{a4,a5,a6}; System.out.println(Arrays.equals(a, b)); System.out.println(Arrays.deepEquals(a, b));
输出结果:
falsetrue
7. fill
给数组赋值。填充数组之用。
案例7-1:
String str[] = {"s2","s4","s1","s3",null}; System.out.println(Arrays.toString(str)); Arrays.fill(str, "s5"); System.out.println(Arrays.toString(str));
输出:
[s2, s4, s1, s3, null][s5, s5, s5, s5, s5]
8. toString和deepToString
toString:对于一个数组int a[] = new int[]{1,9,5,4,6,4,7,1};如果按照System.out.println(a);打印企图可以打印出[1,9,5,4,6,4,7,1],实际上只会打印出[I@3e2de41d这种。在打印数组的时候需要写成Arrays.toString(a)的形式。可参考sort的详解。
deepToString:当数组中又包含数组,那么就不能单存的利用Arrays.toString()了,请看例子。
案例8-1:
int a1[] = new int[]{1,2,3}; int a2[] = new int[]{1,3,3}; int a3[] = new int[]{4,3,2,1}; int[] a [] = new int[][]{a1,a2,a3}; System.out.println(Arrays.toString(a)); System.out.println(Arrays.deepToString(a));
输出结果:
[[I@1b6b7f83, [I@2e807f85, [I@76340c9c][[1, 2, 3], [1, 3, 3], [4, 3, 2, 1]]
相信各位应该看到差别了吧。
9. hashCode和deepHashCode
hashCode:计算一个数组的hashCode.对于一个数组Object[], hashCode方法返回的值取决于:数组中每个元素的元素oi.hashCode()的值初级计算result = 31 * result + (oi== null ? 0 : oi.hashCode());
deepHashCode: 对于一个数组Object[], deepHashCode取决于:数组中每个元素oi,如果oi还是一个数组,那么就继续深入的去获取hashCode,这段比较绕,来个例子比较形象。
案例9-1:
int a1[] = new int[]{1,2,3}; int a2[] = new int[]{1,3,3}; int a3[] = new int[]{4,3,2,1}; int[] a [] = new int[][]{a1,a2,a3}; System.out.println(Arrays.hashCode(a)); System.out.println(Arrays.deepHashCode(a));
运行结果:
-168337402331646847
这样可以看到hashCode与deepHashCode的区别。对于数组而言hashCode只调用到它第一层元素,deepHashCode会一直调用直至不能再拆分成数组的元素。
参考资料:
1. 《Comparable与Comparator浅析》
- Java集合框架:Arrays工具类
- java集合框架之集合工具类Arrays类
- 集合框架工具类 Collections ,Arrays
- Java集合框架-4.【集合工具类:Collections、Arrays】【JDK1.5新特性】
- 黑马程序员——Java基础知识——集合框架、集合工具类、Arrays
- 【Java源码分析】集合框架-Collections工具类-Arrays工具类
- Java基础之集合框架--Arrays工具类(专门操作数组的工具类)
- java集合工具类---Collections/Arrays
- java集合(工具类Arrays)
- 集合框架__【Collections工具类】【Arrays工具类】
- 黑马程序员——Java之集合框架工具类Collections、Arrays以及Java新特性
- Java生涯——Java基础---泛型、集合框架工具类:collections和Arrays
- Java基础——集合框架工具类(Collections类和Arrays类)
- 黑马程序员---java----集合框架工具类:collections,Arrays和一些类
- 黑马程序员——Java基础---泛型、集合框架工具类:collections和Arrays
- 黑马程序员 java 基础 毕向东 面向对象 集合框架 工具类 Collections and Arrays
- 黑马程序员——Java基础--集合框架工具类:Collections、Arrays、其他对象
- 黑马程序员——Java基础---泛型、集合框架工具类:collections和Arrays
- HDOJ 1050 moving tables 之线段树解法
- 蓝桥杯之年月日得到周几(年月日问题,包含平瑞年算法)
- 模板的声明和实现为何要放在头文件中?
- 对jquery.validate 的一些感悟
- android中用style简化布局文件
- Java集合框架:Arrays工具类
- android错误总结
- Tomcat迁移到weblogic的几个问题
- android中延时操作三种方式
- FMDB的使用
- Unity 项目中的音效管理器
- storm-0.8.2源码分析1之nimbus启动
- Ubuntu下怎么安装openjdk
- UNICODE,UTF-8,UTF-16