Java集合框架:Arrays工具类
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]
04. 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));输出结果:
false
true7. 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()的值0基础计算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));执行结果:
-1683374023
31646847这样能够看到hashCode与deepHashCode的区别。
对于数组而言hashCode仅仅调用到它第一层元素。deepHashCode会一直调用直至不能再拆分成数组的元素。
參考资料: 
1. 《Comparable与Comparator浅析》
Java集合框架:Arrays工具类的更多相关文章
- 【JAVA集合框架之工具类】
		一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ... 
- Java:集合框架的工具类
		集合框架的工具类 Arrays:里面都是静态方法,直接用来对各种集合进行操作的公有方法. Collections:里面都是静态方法,直接用来对各种集合进行操作的公有方法. 包括: 1.asList将数 ... 
- Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO
		(三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO 写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ... 
- Java集合框架(常用类) JCF
		Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ... 
- Java:集合,Arrays工具类用法
		1. 描述 Arrays工具类提供了针对数组(Array)的一些操作,比如排序.搜索.将数组(Array)转换列表(List)等等,都为静态(static)方法: binarySearch - 使用二 ... 
- Java常用API——Arrays工具类
		介绍:Arrays工具类提供了一些可以直接操作数组的方法,以下是一些常用方法: int binarySearch(type[] a, type key):要求数组a元素升序排列,使用二分法搜索key的 ... 
- Java 集合框架工具类
		Collections Arrays Collections 集合框架的工具类, 里面的方法都是静态的, 可以直接使用类名调用 常用方法 1. sort(List<T> list); // ... 
- 集合中的工具类Collections和Arrays
		集合框架的工具类: Collections: 方法sort(): List<String> list = new ArrayList<String>(); lis ... 
- Java集合框架(四)
		Collections 集合框架的工具类 着重讲解以下方法: 1.sort(): 1º根据元素的自然顺序对指定列表按升序进行排序,列表中的所有元素都必须实现comparable接口. pu ... 
- Java集合框架体系详细梳理,含面试知识点。
		一.集合类 集合的由来: 面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式. 集合特点: 1,用于存储对象的容器.(容器本身就 ... 
随机推荐
- linux相关技术
			1.查询服务器tcp连接状态及连接数 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 
- WordPress登录框显示/隐藏输入的密码
			直接让用户自行根据需要选择是全部隐藏输入的密码,还是全部显示输入的密码. 在全部显示密码框的内容时,用户输错的可能性就大大降低,这也是微软推荐的一种密码框处理方式.效果如下: 今天,我将给大家介绍,在 ... 
- WPF之DataAnnotations 注解说明
			参考:https://www.cnblogs.com/yaosuc/p/4527886.html 1.基础验证: using System.ComponentModel.DataAnnotations ... 
- nginx反向代理,负载均衡,动静分离,rewrite地址重写介绍
			一.rewrite地址重写 地址转发后客户端浏览器地址栏中的地址显示是不变的,而地址重写后地址栏中的地址会变成正确的地址. 在一次地址转发过程中只会产生一次网络请求,而一次地址重写产生两次请求. 地址 ... 
- 手写数字0-9的识别代码(SVM支持向量机)
			帮一个贴吧的朋友改的一段代码,源代码来自<机器学习实战> 原代码的功能是识别0和9两个数字 经过改动之后可以识别0~9,并且将分类器的产生和测试部分分开来写,免得每次测试数据都要重新生成分 ... 
- GTY's birthday gift【矩阵快速幂】
			题目大意:GTY的朋友ZZF的生日要来了,GTY问他的基友送什么礼物比较好,他的一个基友说送一个可重集吧!于是GTY找到了一个可重集S,GTY能使用神犇魔法k次,每次可以向可重集中加入一个数 a+b ... 
- gcc/g++ 编译时出现:“对’xxxx’未定义的引用,collect2: error: ld returned 1 exit status” 的错误
			出现的问题: 在使用 make 编译实现一个程序时,出现了下面的错误.查看程序源文件所在的目录时发现程序已经完成了编译,并生成了 list_repo.o 的文件,说明是在程序链接生成可执行文件时发生了 ... 
- Oracle常用操作【自己的练习】
			Oracle查询的时候条件要用单引号包裹,不能用双引号;Oracle的in子查询里面的值最多有1000个........ 连接orcl数据库 C:\Windows\system32@orcl as s ... 
- 清除svn检出导致的所有文件的问号
			问题:将svn项目检出到桌面后,桌面的图标都有问号了,怎么消除这一大堆问号? 解决方案:(1)新建一个a.txt文件,把这行代码复制进去for /r . %%a in (.) do @if exist ... 
- 使用nginx时,让web取得原始请求地址
			问题描述 当使用nginx配置proxy_pass参数以后,后端web取得的Request.Uri是proxy_pass中配置的地址,而不是client访问的原始地址 举例说明: 假设nginx配置文 ... 
