java 数组 源码_java Arrays源码浅出

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

demo:

26dbba56a1268cf262529d794c7e85a9.png

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

源码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public static String toString(int[] a) {2 //数组为null,则返回null

3 if (a == null)4 return "null";5 int iMax = a.length - 1;6 //空数组,则返回"[]"

7 if (iMax == -1)8 return "[]";9

10 //创建StringBuilder对象,用于存放结果

11 StringBuilder b = newStringBuilder();12 //返回结果以左中括号([)开头

13 b.append('[');14 //遍历数组

15 for (int i = 0; ; i++) {16 b.append(a[i]);17 if (i ==iMax)18 return b.append(']').toString();//中括号结束

19 b.append(","); //逗号分割

20 }21 }

View Code

2、

demo:

a72198c3bdf9ae0ab5421765cf34ab37.png

源码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public staticString deepToString(Object[] a) {2 if (a == null)3 return "null";4

5 int bufLen = 20 *a.length;6 //java数组用int类型数据作索引,理论最大长度Integer.MAX_VALUE。7 //如果数组足够大,则 20 * a.length 可能会溢出

8 if (a.length != 0 && bufLen <= 0)9 bufLen = Integer.MAX_VALUE; //若溢出,就取 Integer.MAX_VALUE10 //创建StringBuilder用来存放结果

11 StringBuilder buf = newStringBuilder(bufLen);12 deepToString(a, buf, new HashSet<>());13 returnbuf.toString();14 }15

16 private static voiddeepToString(Object[] a, StringBuilder buf,17 SetdejaVu) {18 if (a == null) {19 buf.append("null");20 return;21 }22 int iMax = a.length - 1;23 if (iMax == -1) {24 buf.append("[]");25 return;26 }27

28 dejaVu.add(a);29 buf.append('[');30 //遍历数组

31 for (int i = 0; ; i++) {32

33 //取数组元素

34 Object element =a[i];35 if (element == null) {36 buf.append("null");37 } else { //数组元素不为 null38 //获取数组元素的类型类

39 Class> eClass =element.getClass();40

41 if (eClass.isArray()) { //数组的元素仍然是数组42 //8种基本数据类型,直接调用Arrays.toString处理

43 if (eClass == byte[].class)44 buf.append(toString((byte[]) element));45 else if (eClass == short[].class)46 buf.append(toString((short[]) element));47 else if (eClass == int[].class)48 buf.append(toString((int[]) element));49 else if (eClass == long[].class)50 buf.append(toString((long[]) element));51 else if (eClass == char[].class)52 buf.append(toString((char[]) element));53 else if (eClass == float[].class)54 buf.append(toString((float[]) element));55 else if (eClass == double[].class)56 buf.append(toString((double[]) element));57 else if (eClass == boolean[].class)58 buf.append(toString((boolean[]) element));59 else { //element is an array of object references60 //循环引用,制防止死循环

61 if(dejaVu.contains(element))62 buf.append("[...]");63 else //非基本数据类型(基本数据类型的包装类,或其他对象),则继续递归处理

64 deepToString((Object[])element, buf, dejaVu);65 }66 } else { //element is non-null and not an array67 //数组元素不是null且不是一个数组,则直接调用元素的toString方法68 //如果是包装类,则调用其类中的toString;69 //如果是其他对象,则调用对象重写过的的toString,否则调用Object.toString

70 buf.append(element.toString());71 }72 }73 if (i ==iMax)74 break;75 buf.append(", ");76 }77 buf.append(']');78 dejaVu.remove(a);79 }

View Code

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

demo:

1063f91db0ec1a5db9a44c18ed464aec.png

源码:

public static int[] copyOf(int[] original, intnewLength) {//newLength长度的新数组

int[] copy = new int[newLength];//复制原数组到新数组

System.arraycopy(original, 0, copy, 0,

Math.min(original.length, newLength));returncopy;

}

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的数组的长度

4a6a7cd57e7860d4dad3d49f5cf4ca53.png

4、

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值