java.util.Arrays类能方便地操作数组,它提供的方法都是静态的。整个Arrays工具类的实现有3000+行。可是归纳总结一下可知它有下面功能(9个):


1. asList

定义:

  1. @SafeVarargs
  2. public static <T> List<T> asList(T... a) {
  3. return new ArrayList<>(a);
  4. }

功能:将一个数组(变长參数的语法糖实现就是数组)转变成一个List(确切的来说是ArrayList)。注意这个List是定长的。企图加入或者删除数据都会报错(java.lang.UnsupportedOperationException).

譬如案例1-1:

  1. List<Integer> list = Arrays.asList(3,4,2,1,5,7,6);
  2. System.out.println(list);

输出结果:[3, 4, 2, 1, 5, 7, 6]

可是,对于基础类型(比方byte,int,float等)千万不要想着这么实现(案例1-2,勿效仿):

  1. int a[] = new int[]{1,2,5,4,6,8,7,9};
  2. List list = Arrays.asList(a);

由于List list = Arrays.asList(a);会变成List

  1. for(int[] arr:list)
  2. {
  3. for(int i:arr)
  4. {
  5. System.out.println(i);
  6. }
  7. }

这样操作就显得很的烦琐。由于预想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]):

  1. int a[] = new int[]{1,9,5,4,6,4,7,1};
  2. Arrays.sort(a);
  3. System.out.println(Arrays.toString(a));

案例2-2(String类型(Object)。实现了Comparable接口,输出:[s1, s2, s3, s4]):

  1. String str[] = {"s2","s4","s1","s3"};
  2. Arrays.sort(str);
  3. System.out.println(Arrays.toString(str));

案例2-3 (自己定义类型,实现了Comparable接口。输出:[jj:17, zzh:18, qq:19]):

  1. Person1 persons[] = new Person1[]{
  2. new Person1("zzh",18),new Person1("jj",17),new Person1("qq",19)
  3. };
  4. Arrays.sort(persons);
  5. System.out.println(Arrays.toString(persons));

案例2-4(泛型,假设类型没有实现Comparable接口,能够通过Comparator实现排序):

  1. Person2 persons2[] = new Person2[]{
  2. new Person2("zzh",18),new Person2("jj",17),new Person2("qq",19)
  3. };
  4. Arrays.sort(persons2,new Comparator<Person2>(){
  5. @Override
  6. public int compare(Person2 o1, Person2 o2)
  7. {
  8. if(o1 == null || o2 == null)
  9. return 0;
  10. return o1.getAge()-o2.getAge();
  11. }
  12. });
  13. 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:

  1. String str[] = {"s2","s4","s1","s3"};
  2. Arrays.sort(str);
  3. System.out.println(Arrays.toString(str));
  4. int ans = Arrays.binarySearch(str, "s1");
  5. System.out.println(ans);

输出:

  1. [s1, s2, s3, s4]
  2. 0

4. copyOf

数组拷贝。底层採用System.arrayCopy(native方法)实现。

案例4-1:

  1. String str[] = {"s2","s4","s1","s3"};
  2. String str2[] = Arrays.copyOf(str, str.length);
  3. 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:

  1. String str[] = {"s2","s4","s1","s3"};
  2. String str2[] = Arrays.copyOfRange(str,1,3);
  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:

  1. String str1[] = {"s2","s4","s1","s3",null};
  2. String str2[] = Arrays.copyOf(str1, str1.length);
  3. System.out.println(Arrays.equals(str1, str2));

输出:true

deepEquals:主要针对一个数组中的元素还是数组的情况。相似deepToString, deepHashCode例如以下:

案例6-1:

  1. int a1[] = new int[]{1,2,3};
  2. int a2[] = new int[]{1,3,3};
  3. int a3[] = new int[]{4,3,2,1};
  4. int a4[] = new int[]{1,2,3};
  5. int a5[] = new int[]{1,3,3};
  6. int a6[] = new int[]{4,3,2,1};
  7. int[] a [] = new int[][]{a1,a2,a3};
  8. int[] b [] = new int[][]{a4,a5,a6};
  9. System.out.println(Arrays.equals(a, b));
  10. System.out.println(Arrays.deepEquals(a, b));

输出结果:

  1. false
  2. true

7. fill

给数组赋值。填充数组之用。

案例7-1:

  1. String str[] = {"s2","s4","s1","s3",null};
  2. System.out.println(Arrays.toString(str));
  3. Arrays.fill(str, "s5");
  4. System.out.println(Arrays.toString(str));

输出:

  1. [s2, s4, s1, s3, null]
  2. [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:

  1. int a1[] = new int[]{1,2,3};
  2. int a2[] = new int[]{1,3,3};
  3. int a3[] = new int[]{4,3,2,1};
  4. int[] a [] = new int[][]{a1,a2,a3};
  5. System.out.println(Arrays.toString(a));
  6. System.out.println(Arrays.deepToString(a));

输出结果:

  1. [[I@1b6b7f83, [I@2e807f85, [I@76340c9c]
  2. [[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:

  1. int a1[] = new int[]{1,2,3};
  2. int a2[] = new int[]{1,3,3};
  3. int a3[] = new int[]{4,3,2,1};
  4. int[] a [] = new int[][]{a1,a2,a3};
  5. System.out.println(Arrays.hashCode(a));
  6. System.out.println(Arrays.deepHashCode(a));

执行结果:

  1. -1683374023
  2. 31646847

这样能够看到hashCode与deepHashCode的区别。

对于数组而言hashCode仅仅调用到它第一层元素。deepHashCode会一直调用直至不能再拆分成数组的元素。


參考资料:

1. 《Comparable与Comparator浅析

Java集合框架:Arrays工具类的更多相关文章

  1. 【JAVA集合框架之工具类】

    一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...

  2. Java:集合框架的工具类

    集合框架的工具类 Arrays:里面都是静态方法,直接用来对各种集合进行操作的公有方法. Collections:里面都是静态方法,直接用来对各种集合进行操作的公有方法. 包括: 1.asList将数 ...

  3. Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO

    (三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO  写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...

  4. Java集合框架(常用类) JCF

    Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...

  5. Java:集合,Arrays工具类用法

    1. 描述 Arrays工具类提供了针对数组(Array)的一些操作,比如排序.搜索.将数组(Array)转换列表(List)等等,都为静态(static)方法: binarySearch - 使用二 ...

  6. Java常用API——Arrays工具类

    介绍:Arrays工具类提供了一些可以直接操作数组的方法,以下是一些常用方法: int binarySearch(type[] a, type key):要求数组a元素升序排列,使用二分法搜索key的 ...

  7. Java 集合框架工具类

    Collections Arrays Collections 集合框架的工具类, 里面的方法都是静态的, 可以直接使用类名调用 常用方法 1. sort(List<T> list); // ...

  8. 集合中的工具类Collections和Arrays

    集合框架的工具类: Collections: 方法sort(): List<String> list = new ArrayList<String>();        lis ...

  9. Java集合框架(四)

    Collections    集合框架的工具类    着重讲解以下方法: 1.sort(): 1º根据元素的自然顺序对指定列表按升序进行排序,列表中的所有元素都必须实现comparable接口. pu ...

  10. Java集合框架体系详细梳理,含面试知识点。

    一.集合类 集合的由来: 面向对象语言对事物都是以对象的形式来体现,为了方便对多个对象的操作,就需要将对象进行存储,集合就是存储对象最常用的一种方式. 集合特点: 1,用于存储对象的容器.(容器本身就 ...

随机推荐

  1. vs进行C#编程中常用的几个快捷键

    (1)输入svm然后按Tab键会生成Main函数: (2)Ctrl +k+s 三个键一起按,会调出代码段:选中多行后,然后按以上三个快捷键,输入需要使用的代码段,按下Tab,代码段会自动包括选中代码. ...

  2. 关于网络IP地址的分类

    一.IP地址的分类 众所周知,IP地址都是以点号.分为4段来表示.不同类的IP前几位的表示含义也不尽相同. 1.A类IP [网络地址] 第一位表示网络地址,且第一个字节的第一位必须以0开头.依据此原则 ...

  3. unittest编写Web测试用例

    案例:百度搜索关键词:“unittest” test_baidu.py: from selenium import webdriver from time import sleep import un ...

  4. C/C++复杂类型声明

    曾经碰到过让你迷惑不解.类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明.   我们将从每天都能碰到的较 ...

  5. 关于EGE图形库在CodeBlocks下的配置

    非常感谢[地球]呵呵@的细心帮助,我差点都放弃了! 我这里使用的是Code::Blocks svn 10595 与 TDM-GCC 5.10 首先下载为 GCC 5.0 以上编译好的 EGE 文件,稍 ...

  6. Educational Codeforces Round 31

    A. Book Reading time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  7. 2017 Multi-University Training Contest - Team 2

    Regular polygon Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  8. System.TypeInitializationException

    在连接数据库时,提示System.TypeInitializationException 数据库的连接字符串放在config文件中,而config中有两个文件,起初放在debug.comfig中,启动 ...

  9. 在table第一行前插入一行

    在table的第一行前插入一行. //追加到第一行 var html="<tr><td>xxId</td><td>xxName</td& ...

  10. 刷题总结——保留道路(ssoj)

    题目: 题目背景 161114-练习-DAY1-AHSDFZ T3 题目描述 很久很久以前有一个国家,这个国家有 N 个城市,城市由 1,2,3,…,,N 标号,城市间有 M 条双向道路,每条道路都有 ...