1、toString 返回指定数组内容的字符串表示形式。

demo:

由demo可窥见Arrays.toString的所做的工作就是将数组元素转换为字符串(以逗号分割数组元素,包裹在方括号中)。

源码:

 public static String toString(int[] a) {
// 数组为null,则返回null
if (a == null)
return "null";
int iMax = a.length - ;
// 空数组,则返回"[]"
if (iMax == -)
return "[]"; // 创建StringBuilder对象,用于存放结果
StringBuilder b = new StringBuilder();
// 返回结果以左中括号([)开头
b.append('[');
// 遍历数组
for (int i = ; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();// 中括号结束
b.append(", "); // 逗号分割
}
}

2、

demo:

源码:

 public static String deepToString(Object[] a) {
if (a == null)
return "null"; int bufLen = 20 * a.length;
// java数组用int类型数据作索引,理论最大长度Integer.MAX_VALUE。
// 如果数组足够大,则 20 * a.length 可能会溢出
if (a.length != 0 && bufLen <= 0)
bufLen = Integer.MAX_VALUE; // 若溢出,就取 Integer.MAX_VALUE
//创建StringBuilder用来存放结果
StringBuilder buf = new StringBuilder(bufLen);
deepToString(a, buf, new HashSet<>());
return buf.toString();
} private static void deepToString(Object[] a, StringBuilder buf,
Set<Object[]> dejaVu) {
if (a == null) {
buf.append("null");
return;
}
int iMax = a.length - 1;
if (iMax == -1) {
buf.append("[]");
return;
} dejaVu.add(a);
buf.append('[');
// 遍历数组
for (int i = 0; ; i++) { // 取数组元素
Object element = a[i];
if (element == null) {
buf.append("null");
} else { // 数组元素不为 null
// 获取数组元素的类型类
Class<?> eClass = element.getClass(); if (eClass.isArray()) { // 数组的元素仍然是数组
// 8种基本数据类型,直接调用Arrays.toString处理
if (eClass == byte[].class)
buf.append(toString((byte[]) element));
else if (eClass == short[].class)
buf.append(toString((short[]) element));
else if (eClass == int[].class)
buf.append(toString((int[]) element));
else if (eClass == long[].class)
buf.append(toString((long[]) element));
else if (eClass == char[].class)
buf.append(toString((char[]) element));
else if (eClass == float[].class)
buf.append(toString((float[]) element));
else if (eClass == double[].class)
buf.append(toString((double[]) element));
else if (eClass == boolean[].class)
buf.append(toString((boolean[]) element));
else { // element is an array of object references
// 循环引用,制防止死循环
if (dejaVu.contains(element))
buf.append("[...]");
else // 非基本数据类型(基本数据类型的包装类,或其他对象),则继续递归处理
deepToString((Object[])element, buf, dejaVu);
}
} else { // element is non-null and not an array
// 数组元素不是null且不是一个数组,则直接调用元素的toString方法
// 如果是包装类,则调用其类中的toString;
// 如果是其他对象,则调用对象重写过的的toString,否则调用Object.toString
buf.append(element.toString());
}
}
if (i == iMax)
break;
buf.append(", ");
}
buf.append(']');
dejaVu.remove(a);
}

3、copyOf 从原数组复制指定长度到新数组。

demo:

源码:

public static int[] copyOf(int[] original, int newLength) {
// newLength长度的新数组
int[] copy = new int[newLength];
// 复制原数组到新数组
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}

java.lang.System.arraycopy() 方法复制指定的源数组的数组,在指定的位置开始,到目标数组的指定位置。如下:

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
  Object src : 原数组
int srcPos : 从元数据的起始位置开始
  Object dest : 目标数组
  int destPos : 目标数组的开始起始位置
  int length : 要copy的数组的长度

4、

---恢复内容结束---

java Arrays源码浅出的更多相关文章

  1. java String源码浅出

    1.public char charAt(int index) 返回指定索引处的 char 值. 源码: =====================String.class============== ...

  2. Java Arrays 源码 笔记

    Arrays.java是Java中用来操作数组的类.使用这个工具类可以减少平常很多的工作量.了解其实现,可以避免一些错误的用法. 它提供的操作包括: 排序 sort 查找 binarySearch() ...

  3. Java集合源码分析(四)Vector<E>

    Vector<E>简介 Vector也是基于数组实现的,是一个动态数组,其容量能自动增长. Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是 ...

  4. 程序兵法:Java String 源码的排序算法(一)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 <程序兵法:Java Str ...

  5. java集合源码分析(三):ArrayList

    概述 在前文:java集合源码分析(二):List与AbstractList 和 java集合源码分析(一):Collection 与 AbstractCollection 中,我们大致了解了从 Co ...

  6. Java集合源码分析(三)LinkedList

    LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...

  7. Java集合源码分析(二)ArrayList

    ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...

  8. Java集合源码学习(一)集合框架概览

    >>集合框架 Java集合框架包含了大部分Java开发中用到的数据结构,主要包括List列表.Set集合.Map映射.迭代器(Iterator.Enumeration).工具类(Array ...

  9. 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码

    转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment ( ...

随机推荐

  1. git && github 相关

    权限问题(error: The requested URL returned error: 403 Forbidden while accessing):1. 将自己机器的ssh public key ...

  2. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_1 今日课程内容介绍

  3. 7.k8s.调度器scheduler 亲和性、污点

    #k8s. 调度器scheduler 亲和性.污点 默认调度过程:预选 Predicates (过滤节点) --> 优选 Priorities(优先级排序) --> 优先级最高节点 实际使 ...

  4. Linux安装MySql5.7及配置(yum安装)

    Linux安装MySql5.7及配置(yum安装) [root@xld ~]# rpm -q centos-release centos-release-7-7.1908.0.el7.centos.x ...

  5. 科普:PV,UV,VV,IP

    1.PV PV即Page View,即页面浏览量或点击量,用户每一次对网站中的每个网页访问均被记录一次.用户对同一页面的多次访问,访问量累计. 2.UV UV即Unique Visitor,是指通过互 ...

  6. 《React+Redux前端开发实战》笔记1:不涉及React项目构建的Hello World案例

    本小节实现一个不涉及项目构建的Hello World. [React的第一个Hello World网页] 源码地址:https://jsfiddle.net/allan91/2h1sf0ky/8/ & ...

  7. swagger 访问格式

    boot工程格式如下 http://10.166.10.169:8085/swagger-ui.html 非boot工程加个自己项目名 http://10.166.10.169:8085/xxx/sw ...

  8. vue-devtools安装以后,勾选了“允许访问文件网址”之后还是无法使用

    勾选了“允许访问文件网址”,还是无法使用: Vue.js is detected on this page. Devtools inspection is not available because ...

  9. 七、Zabbix-模板,应用集,监控项,触发器

    本篇内容,将模板,应用集,监控项,触发器放在一起,因为我们建立使用的监控项和触发器,大多数都是对多台机器使用的,很少有一个监控项对应一个主机的情况. 一.模板 1.什么是模板? 个人理解,模板就是模板 ...

  10. 洛谷 P1631 序列合并(优先队列)

    传送门 解题思路 首先读入a.b数组后,sort一遍(从小到大),然后把a[1]+b[1],a[2]+b[1],a[3]+b[1]……a[n]+b[1]全部加入一个优先队列q(小根堆). 然后从一到n ...