qidao123.com技术社区-IT企服评测·应用市场

标题: Arrays工具类教你优雅地管理数组数据 [打印本页]

作者: 麻花痒    时间: 2025-3-17 07:52
标题: Arrays工具类教你优雅地管理数组数据
数组专用工具类指的是 java.util.Arrays 类,基本上常见的数组操作,这个类都提供了静态方法可供直接调用。毕竟数组本身想完成这些操作还是挺麻烦的,有了这层封装,就方便多了。
  1. package java.util;
  2. /**
  3. * @author Josh Bloch
  4. * @author Neal Gafter
  5. * @author John Rose
  6. * @since  1.2
  7. */
  8. public class Arrays {}
复制代码
方法一览

方法名扼要描述asList()返回由指定命组支持的固定大小的列表。sort()将数组排序(升序)parallelSort()将指定的数组按升序排序binarySearch()使用二分搜索法快速查找指定的值(前提是数组必须是有序的)compare()按字典顺序比较两个数组compareUnsigned()按字典顺序比较两个数组,将数字元素处理为无符号copyOf()添补复制数组copyOfRange()将数组的指定范围复制到新数组fill()将指定元素添补给数组每一个元素equals()比较两个数组deepEquals()比较两个数组深度toString()将数组转换为字符串deepToString()将一个多维数组转换为字符串mismatch()查找并返回两个数组之间第一个不匹配的索引,如果未找到则返回-1parallelPrefix()使用提供的函数对数组元素举行操作parallelSetAll()使用提供的生成器函数并行设置指定命组的全部元素以盘算每个元素setAll()使用提供的生成器函数设置指定命组的全部元素以盘算每个元素asList()

  1. List < String > ss = Arrays.asList("hello", "world");
  2. // List<String> ss1 = Arrays.asList("hello", "world",1);   报错,类型必须一致(泛型)
  3. System.out.println(ss); //[hello, world]
  4. //  ss.add("java");  //UnsupportedOperationException  会报错
  5. //  ss.remove(1);   //UnsupportedOperationException  会报错
  6. System.out.println(ss.get(0)); //hello
  7. ss.set(0, "java");
  8. System.out.println(ss); //[java, world]
复制代码
必要注意的是,add方法和remove会报错。
这是由于asList() 返回的是Arrays类的内部类:
  1. public static < T > List < T > asList(T...a) {
  2.     return new ArrayList < > (a);
  3. }
复制代码

这个内部类也继承了 java.util.AbstractList 类,重写了许多方法,比如contains方法、set方法,但是却没有重写add方法,最终是调用了父类的add(int, E)方法,所以在调用add方法时才会抛出java.lang.UnsupportedOperationException异常。
关于这一点,在《阿里巴巴Java开发手册》中,也有提及:使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相干的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。

所以大家在使用Arrays.asList时还是要注意下,避免踩坑。
toString() 和 deepToString()

代码示例:
  1. public void toStringTest() {
  2.     String[] str = {"java", "hello", "javascript"};
  3.     String[][] strs = {{"a", "b"}, {"c"}, {"d", "e"}};
  4.     System.out.println(Arrays.toString(str));
  5.     //[java, hello, javascript]
  6.    
  7.     System.out.println(Arrays.toString(strs));
  8.     //[[Ljava.lang.String;@4563e9ab, [Ljava.lang.String;@11531931, [Ljava.lang.String;@5e025e70]
  9.     //普通的toString()方法只转化一层,内层还是地址值
  10.     System.out.println(Arrays.deepToString(strs));
  11.     //可以深度转换
  12.     //[[a, b], [c], [d, e]]
  13. }
复制代码
方法源码:
  1. public static String toString(Object[] a) {
  2.     // 先判断 null,是的话,直接返回“null”字符串;
  3.     if (a == null)
  4.         return "null";
  5.     //获取数组的长度
  6.     int iMax = a.length - 1;
  7.     //如果数组的长度为 0( 等价于 length - 1 为 -1),返回中括号“[]”,表示数组为空的;
  8.     if (iMax == -1)
  9.         return "[]";
  10.     //如果数组既不是 null,长度也不为 0,就声明 StringBuilder 对象,
  11.     StringBuilder b = new StringBuilder();
  12.     //添加一个数组的开始标记“[”
  13.     b.append('[');
  14.     //遍历数组,把每个元素添加进去
  15.     for (int i = 0; ; i++) {
  16.         b.append(String.valueOf(a[i]));
  17.         //当遇到末尾元素的时候(i == iMax),不再添加逗号和空格“, ”,而是添加数组的闭合标记“]”。
  18.         if (i == iMax)
  19.             return b.append(']').toString();
  20.         b.append(", ");
  21.     }
  22. }
复制代码
sort() 和 parallelSort()

<ul>功能:都是将数组排序(默认升序,支持lambda,泛型),默认的排序算法是 Dual-Pivot Quicksort
参数:
sort(Object[] a[, int fromIndex, int toIndex]) 或者 sort(T[] a[, int fromIndex, int toIndex,] Comparator




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4