【集合框架】JDK1.8源码分析之Collections && Arrays(十)(2)

简介: 简介:   整个集合框架的常用类我们已经分析完成了,但是还有两个工具类我们还没有进行分析。可以说,这两个工具类对于我们操作集合时相当有用,下面进行分析。

三、Arrays源码分析


  3.1 类的属性  


public class Arrays {
    // 可以进行并行排序的最小数组长度
    private static final int MIN_ARRAY_SORT_GRAN = 1 << 13;
}

3.2 构造函数 

private Arrays() {}

说明:私有构造函数,类外不允许调用。


  3.3 方法分析


  Arrays的全部方法如下

image.png

image.png

image.png

image.png


image.png


 说明:可以看到,Arrays工具类处理的是数组类型。并且每个方法存在多个重载版本。


  3.4 核心方法分析


  由于存在多个重载版本,每个重载版本的逻辑大体一致,故只分析有代表性的版

本。

  1. sort函数


  用于对数组进行排序,两个主要的重载版本,方法签名如下  

public static void sort(int[] a)
public static void sort(int[] a, int fromIndex, int toIndex)

 说明:第一个版本是对整个数组进行排序,第二个版本只对指定部分进行排序。第一个版本代码如下  

public static void sort(int[] a) {
        // 使用快速排序
        DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
    }

说明:使用快速排序进行排序。第二个版本与第一个版本类似,不再累赘。


  2. equals方法


  用于判断两个数组是否相等,若数组元素重写了equals方法,则按照元素的equals方法进行比较。主要的重载版本,方法签名如下  


public static boolean equals(int[] a, int[] a2)
public static boolean equals(Object[] a, Object[] a2)

说明:第一个版本具体代码如下

public static boolean equals(int[] a, int[] a2) {
        if (a==a2)
            return true;
        if (a==null || a2==null) // 任一数组为空,则返回false
            return false;
        int length = a.length;
        if (a2.length != length) // 数组大小不相等,返回false
            return false;
        for (int i=0; i<length; i++) // 遍历比较,元素全部相等则返回true,否则,返回false
            if (a[i] != a2[i])
                return false;
        return true;
    }

 说明:首先,判断是否为同一个数组引用,满足后,再判断是否有数组为空,满足后,再判断两数组长度是否相等,满足后,最后遍历数组进行比较。


  3. copyOf函数


  用于复制数组元素至另一个数组。主要重载版本,签名如下 

public static <T> T[] copyOf(T[] original, int newLength)
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType)

 

 第二个版本,具体代码如下 


public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

4. copyOfRange函数


  指定数组一段元素进行复制(指定了开始位置和结束位置),签名如下  


public static <T> T[] copyOfRange(T[] original, int from, int to)
public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType)
public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

5. hashCode函数


  求得数组的hashCode,主要版本,签名如下 


public static int hashCode(int a[])

 代码如下 

public static int hashCode(int a[]) {
        if (a == null)
            return 0;
        int result = 1;
        for (int element : a)
            result = 31 * result + element;
        return result;
    }

6. asList函数


  用于将不定参数转化为List,方法签名如下  

public static <T> List<T> asList(T... a)

具体代码如下 

public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

7. toString函数


  用于更友好的显示数组信息,签名如下 

public static String toString(int[] a)

注意,并没有覆盖Object类的toString方法,因为方法签名不相同。具体代码如下 

 public static String toString(int[] 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(", ");
        }
    }

 Arrays工具类的主要方法就介绍到这里,平时我们可以多用用里面的方法,达到更熟悉的效果。


四、总结


  Collections与Arrays提供了很多有用的方法,我们平时可以多用用,至此,集合框架的主要源码就分析完了。下面会接着分析并发框架的源码,谢谢各位园友的观看~

目录
相关文章
|
1月前
|
Java 数据处理 API
JDK 21中的序列集合:有序数据处理的新篇章
JDK 21引入了序列集合(Sequenced Collections),这是一种维护元素插入顺序的新型集合。本文介绍了序列集合的概念、特性及其应用场景,如事件日志记录、任务调度和数据处理。通过保持插入顺序和高效的遍历方法,序列集合为开发者提供了更直观和易用的API。
|
2月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
32 1
|
3月前
|
人工智能 Java 测试技术
JDK11下Mock框架进化:从PowerMockito到Mockito Only
本文探讨了从使用PowerMock的测试环境迁移到仅使用Mockito(Mockito Only)策略的必要性和实践方法。
|
4月前
|
Java
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
JDK序列化原理问题之Hessian框架不支持writeObject/readObject方法如何解决
|
6月前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
6月前
|
存储 算法 安全
JDK源码分析-HashMap
JDK源码分析-HashMap
|
6月前
|
XML Java 数据格式
【JAVA日志框架】JUL,JDK原生日志框架详解。
【JAVA日志框架】JUL,JDK原生日志框架详解。
44 0
|
7月前
|
Java
Java jdk1.8 lambda 遍历集合的时候到底需不需判空
Java jdk1.8 lambda 遍历集合的时候到底需不需判空
|
7月前
|
存储 数据库
享元模式、在 JDK-Interger 的应用源码分析
享元模式(案例解析)、在 JDK-Interger 的应用源码分析
|
7月前
|
Java API 数据处理
JDK 21中的序列集合:有序数据的新篇章
本文将深入探讨JDK 21中新增的序列集合(Sequenced Collections)的概念、特性以及其在现代软件开发中的应用。序列集合为有序数据的处理提供了更高效、更直观的方式,使得开发者能够更轻松地管理集合中元素的顺序。本文将通过示例代码展示序列集合的使用,并分析其与传统集合的区别与优势。