Arrays——数组工具类
创建数组
Arrays创建数组的主要方式有以下三种:
copyOf
:复制指定的数组,截取或使用 null 填充copyOfRange
:复制指定范围内的数组到一个新的数组fill
:对数组进行填充
copyOf
复制 length 位的数组
public static void main(String[] args) {
String[] intro = new String[]{"复", "制", "测", "试"};
String[] revised = Arrays.copyOf(intro, 3);
String[] expanded = Arrays.copyOf(intro, 5);
System.out.println(Arrays.toString(revised));
System.out.println(Arrays.toString(expanded));
}
输出结果如下:
[复, 制, 测]
[复, 制, 测, 试, null]
copyOfRange
复制指定区间的数组
示例程序:
String[] intro = new String[] {"Java", "is", "a", "programming", "language"};
String[] abridgement = Arrays.copyOfRange(intro, 0, 3);
String[] abridgementExpanded = Arrays.copyOfRange(intro, 0, 6);
System.out.println(Arrays.toString(abridgement));
System.out.println(Arrays.toString(abridgementExpanded));
输出结果:
[Java, is, a]
[Java, is, a, programming, language, null]
fill
使用指定字符串,填充数组
示例程序:
String[] stutter = new String[4];
Arrays.fill(stutter, "filled");
System.out.println(Arrays.toString(stutter));
输出结果:
[filled, filled, filled, filled]
比较数组
Arrays的比较主要使用的是 equal()
方法
String[] intro = new String[] {"Java", "is", "a", "programming", "language"};
boolean result = Arrays.equals(new String[]{"Java", "is", "a", "programming", "language"}, intro);
System.out.println(result);
boolean result1 = Arrays.equals(new String[]{"Java", "is", "a", "programming", "languages"}, intro);
System.out.println(result1);
数组排序
String[] intro1 = new String[] {"Java", "is", "a", "programming", "language"};
String[] sorted = Arrays.copyOf(intro1, 4);
Arrays.sort(sorted);
System.out.println(Arrays.toString(sorted));
输出结果:
[Java, a, is, programming]
数组检索
使用 BinarySearch
可以对数组进行检索,并且支持模糊和精确搜索
String[] intro1 = new String[]{"Java", "is", "a", "programming", "language"};
String[] sorted = Arrays.copyOf(intro1, 4);
Arrays.sort(sorted);
int exact = Arrays.binarySearch(sorted, "Java");
System.out.println(exact);
int caseInsensitive = Arrays.binarySearch(sorted, "programming", String::compareToIgnoreCase);
System.out.println(caseInsensitive);
数组转流
流的英文单词是 Stream
,类似于IO流这些,将集合作为一个流进行操作,比如: 统计数量、求和、比较大小
String[] intro = new String[] {"I", "am", "a", "student"};
System.out.println(Arrays.stream(intro).count()); // output: 4
System.out.println(Arrays.stream(intro, 1, 2).count()); // 指定开始下标和结束下标 output: 1
打印数组
默认的 System.out.println()
只能打印带有toString()
方法的对象,不然默认打印的是对象的地址值:
[Ljava.lang.String;@3d075dc0
Arrays封装了方法,可以实现快捷打印:
String[] intro = new String[] {"I", "am", "a", "student"};
System.out.println(Arrays.toString(intro)); // [I, am, a, student]
int[] numbers = new int[] {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(numbers)); // [1, 2, 3, 4, 5]
数组转List
String[] intro = new String[] {"I", "am", "a", "student"};
List<String> rets = Arrays.asList(intro);
System.out.println(rets);
setall
Java 8 新增了 setAll()
方法,它提供了一个函数式编程的入口,可以对数组的元素进行填充:
int[] array = new int[10];
Arrays.setAll(array, i -> i*10);
System.out.println(Arrays.toString(array)); // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
i 就相当于是数组的下标,值从 0 开始,到 9 结束,那么 i * 10
就意味着值从 0 * 10 开始,到 9 * 10 结束
parallelPrefix
parallelPrefix()
方法和 setAll()
方法一样,也是 Java 8 之后提供的,提供了一个函数式编程的入口,通过遍历数组中的元素,将当前下标位置上的元素与它之前下标的元素进行操作,然后将操作后的结果覆盖当前下标位置上的元素。
int[] arr = new int[] {1, 2, 3, 4};
Arrays.parallelPrefix(arr, (left, right) -> left + right);
System.out.println(Arrays.toString(arr));
上面代码中有一个 Lambda 表达式((left, right) -> left + right
),是什么意思呢?上面这段代码等同于:
int[] arr = new int[]{1, 2, 3, 4};
Arrays.parallelPrefix(arr, (left, right) -> {
System.out.println(left + "," + right);
return left + right;
});
System.out.println(Arrays.toString(arr));
来看一下输出结果就明白了:
1,2
3,3
6,4
[1, 3, 6, 10]
也就是说, Lambda 表达式执行了三次:
- 第一次是 1 和 2 相加,结果是 3,替换下标为 1 的位置
- 第二次是 3 和 3 相加,结果是 6,也就是第一次的结果和下标为 2 的元素相加的结果
- 第三次是 6 和 4 相加,结果是 10,也就是第二次的结果和下标为 3 的元素相加的结果
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 zxb
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果