集合框架3-Arrays 类
Arrays 和 Collections是分别操作数组和集合的两个工具类。今天就来对 Arrays 中的内容作个总结。
一、Arrays 类概述
Arrays 类位于 java.util包中。Arrays 继承 Object
java.lang.Object
↳ java.util.Arrays
Arrays 类中的静态方法可以对数组进行排序、查询、搜索等等操作。
二、Arrays 类中方法
1. Arrays.asList()
方法描述
该方法返回一个 ArrayList , 其返回的 ArrayList 从下面的代码可以看出不是我们平常 new 出来的动态可扩展的 ArrayList。可以看这篇 ArrayList
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return a.clone();
}
@Override
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
int size = size();
if (a.length < size)
return Arrays.copyOf(this.a, size,
(Class<? extends T[]>) a.getClass());
System.arraycopy(this.a, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
@Override
public E get(int index) {
return a[index];
}
@Override
public E set(int index, E element) {
E oldValue = a[index];
a[index] = element;
return oldValue;
}
@Override
public int indexOf(Object o) {
E[] a = this.a;
if (o == null) {
for (int i = 0; i < a.length; i++)
if (a[i] == null)
return i;
} else {
for (int i = 0; i < a.length; i++)
if (o.equals(a[i]))
return i;
}
return -1;
}
@Override
public boolean contains(Object o) {
return indexOf(o) != -1;
}
@Override
public Spliterator<E> spliterator() {
return Spliterators.spliterator(a, Spliterator.ORDERED);
}
@Override
public void forEach(Consumer<? super E> action) {
Objects.requireNonNull(action);
for (E e : a) {
action.accept(e);
}
}
@Override
public void replaceAll(UnaryOperator<E> operator) {
Objects.requireNonNull(operator);
E[] a = this.a;
for (int i = 0; i < a.length; i++) {
a[i] = operator.apply(a[i]);
}
}
@Override
public void sort(Comparator<? super E> c) {
Arrays.sort(a, c);
}
}
来个例子
public static void main(String[] args) {
//创建一个数组
int[] a = {1,2,3};
//new 一个 ArrayList
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);//[1, 2, 3]
System.out.println(a); //[I@1540e19d
System.out.println(Arrays.toString(a));//[1, 2, 3]
/*如果将基本数据类型的数组作为参数传入,该方法会把整个数组当成一个元素*/
System.out.println(Arrays.asList(a));//[[I@1540e19d]
System.out.println(Arrays.asList(1,2,3));//[1, 2, 3]
}
2. Arrays.sort(originalArray)
方法描述
对数组所有元素进行升序排序,没有返回值。
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
Arrays.sort(a);
System.out.println(Arrays.toString(a));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
3. Arrays.sort(originalArray, fromIndex, endIndex)
方法描述
对数组特定序列进行升序排序,从 [fromIndex, endIndex]区域的数组元素进行排序
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
Arrays.sort(a,0,5);
System.out.println(Arrays.toString(a));//[1, 2, 3, 4, 9, 5, 6, 7, 8]
4. Arrays.sort(T[] a, Comparator<super T> c )
方法描述
利用自定义的比较器,来对数组元素进行排序
来个例子
// Java program to demonstrate working of Comparator
// interface
import java.util.*;
import java.lang.*;
import java.io.*;
// A class to represent a student.
class Student {
int rollno;
String name, address;
// Constructor
public Student(int rollno, String name,
String address)
{
this.rollno = rollno;
this.name = name;
this.address = address;
}
// Used to print student details in main()
public String toString()
{
return this.rollno + " "
+ this.name + " "
+ this.address;
}
}
//自定义的比较器,对两个对象的 rollno 属性进行比较
class Sortbyroll implements Comparator<Student> {
// Used for sorting in ascending order of
// roll number
public int compare(Student a, Student b)
{
return a.rollno - b.rollno;
}
}
// Driver class
class Main {
public static void main(String[] args)
{
Student[] arr = { new Student(1, "bbbb", "london"),
new Student(3, "aaaa", "nyc"),
new Student(2, "cccc", "jaipur") };
System.out.println("Unsorted-未排序前");
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
Arrays.sort(arr, new Sortbyroll());
System.out.println("\nSorted by rollno-排序后");
for (int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
}
/** 输出结果:
*Unsorted-未排序前
*1 bbbb london
*3 aaaa nyc
*2 cccc jaipur
*
*Sorted by rollno-排序后
*1 bbbb london
*2 cccc jaipur
*3 aaaa nyc
*
**/
5. Arrays.sort(T[] a, int fromIndex, int toIndex, Comparator<super T> c)
方法描述
利用自定义的比较器,来对数组中指定范围元素进行排序
来个例子
把4中代码换成
Arrays.sort(arr, 1, 2, new Sortbyroll());//对第一、二个元素进行比较
/** 输出结果:
*Unsorted-未排序前
*1 bbbb london
*3 aaaa nyc
*2 cccc jaipur
*
*Sorted by rollno-排序后
*1 bbbb london
*3 aaaa nyc
*2 cccc jaipur
*
**/
6. Arrays.parallelSort(originalArray)
方法描述
对数组元素进行升序排序,当数据规模较大时,性能更好(并行排序)。
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
Arrays.parallelSort(a);
System.out.println(Arrays.toString(a));//[1, 2, 3, 4, 9, 5, 6, 7, 8]
7.Arrays.fill(originalArray, fillValue) 和 Arrays.fill(originalArray, intfromIndex, int toIndex, fillValue)
方法描述
用 fillValue 值来填充数组。前一个函数填充所有,后面的函数填充指定范围。
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
Arrays.fill(a,1);//[1, 1, 1, 1, 1, 1, 1, 1, 1]
Arrays.fill(a,1,3,1);//[1, 1, 1, 9, 4, 5, 6, 7, 8]
8.Arrays.equals(array1, array2) 和 Arrays.deepEquals(array1, array2)
方法描述
判断两个数组是否相等, 返回布尔值
equals()主要针对基本数据和Object 一维数组,其比较规则如下:
if (a==a2)
return true;
if (a==null || a2==null)
return false;
int length = a.length;
if (a2.length != length)
return false;
for (int i=0; i<length; i++) {
Object o1 = a[i];
Object o2 = a2[i];
if (!(o1==null ? o2==null : o1.equals(o2)))
return false;
}
return true;
deepEquals()主要是多维数组的比较,其比较规则为:
if (a1 == a2)
return true;
if (a1 == null || a2==null)
return false;
int length = a1.length;
if (a2.length != length)
return false;
for (int i = 0; i < length; i++) {
Object e1 = a1[i];
Object e2 = a2[i];
if (e1 == e2)
continue;
if (e1 == null)
return false;
// Figure out whether the two elements are equal
boolean eq = deepEquals0(e1, e2);
if (!eq)
return false;
}
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
int[] b = {1,2};
int[][] c = {{1,2},{1,3}};
int[][] d = {{1,2},{1,3}};
Arrays.equals(a,b);//false
Arrays.equals(c,d);//true
9.Arrays.hashCode(originalArray) 和 Arrays.deepHashCode(originalArray)
方法描述
返回该数组的哈希值
前面一个函数是返回一维数组,后面是多维数组
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
int[][] c = {{1,2},{1,3}};
System.out.println(Arrays.hashCode(a));//887857437
System.out.println(Arrays.deepHashCode(c));//31776
10.Arrays.binarySearch(originalArray, key) 和Arrays.binarySearch(originalArray,fromIndex,toIndex,key,Comparator)
方法描述
方法一:在数组中对某值进行二分查找(注意要先对数组排序!),如果存在返回其下标,否则返回 -(数组极值下标 +1)。
方法二:方法中的参数限定数组的范围,Comparator 是自定义的比较器
来个例子
int[] a = {1,2,3,4,5,9,6,7,8};
Arrays.sort(a);
System.out.println(Arrays.binarySearch(a,1));//0
System.out.println(Arrays.binarySearch(a,0));//-1
System.out.println(Arrays.binarySearch(a,10));//-10
11.Arrays.copyOf(originalArray, newLength) 和 Arrays.copyOfRange(originalArray,fromIndex,endIndex)
方法描述
方法一:拷贝数组,newLength 是拷贝的长度,如果超过原数组的长度,则用 null 进行填充。并返回一个新数组。
方法二:拷贝数组,fromIndex 和 endIndex 是数组的范围下标。并返回一个新数组。
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
System.out.println(Arrays.toString(Arrays.copyOf(a,3)));//[1,2,3]
System.out.println(Arrays.toString(Arrays.copyOfRange(a,0,3)));//[1,2,3]
13.Arrays.toString(originalArray) 和 Arrays.deepToString(originalArray)
方法描述
返回数组元素的字符串形式,方法一是一维数组,方法二是多维数组。
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
System.out.println(Arrays.toString(a));//[1,2,3,9,4,5,6,7,8]
int[][] c = {{1,2},{3}};
System.out.println(Arrays.deepToString(c));//[[1, 2], [3]]
14.Arrays.setAll(originalArray,functionalGenerator)和 Arrays.parallelSetAll(originalArray, functionalGenerator)
方法描述
方法一:将数组中的所有元素,串行的使用方法提供的生成器函数来计算每个元素(一元操作)
方法二:将数组中的所有元素,串行的使用方法提供的生成器来计算每个元素(一元操作)适用于大规模数据
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
Arrays.setAll(a, i -> a[i] * 2);
System.out.println(Arrays.toString(a));//[2,4,6,18,8,10,12,14,16]
Arrays.parallelSetAll(a, i -> a[i] * 2);
System.out.println(Arrays.toString(a));//[2,4,6,18,8,10,12,14,16]
15. Arrays.parallelPrefix(originalArray, BinaryOperator op) 和 Arrays.parallelPrefix(originalArray, int fromIndex, int toIndex, BinaryOperator op)
方法描述
方法一:将数组中所有元素,并行使用生成器函数来计算每个元素(二元操作)
方法二:将数组中部分序列元素,并行使用生成器函数来计算每个元素(二元操作)
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
Arrays.parallelPrefix(a, (x,y) -> x*y);//依次累乘
System.out.println(Arrays.toString(a));//[1, 2, 6, 54, 216, 1080, 6480, 45360, 362880]
Arrays.parallelPrefix(a, 0, 3, (x,y) -> x*y);//依次累乘
System.out.println(Arrays.toString(a));//[1, 2, 6, 9, 4, 5, 6, 7, 8]
16.Arrays.spliterator(originalArray) 和 Arrays.spliterator(originalArray,fromIndex,endIndex)
方法描述
返回数组的分片迭代器,用于并行的遍历数组
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
Spliterator<Integer> s = Arrays.spliterator(a);
s.forEachRemaining(System.out::println);
/**
*
*1
*2
*3
*9
*4
*5
*6
*7
*8
**/
17.Arrays.stream(originalArray)
方法描述
返回数组的流,可以对数组使用 Stream 相关的方法。
来个例子
int[] a = {1,2,3,9,4,5,6,7,8};
List<Integer> list = Arrays.stream(a).collect(toList());
System.out.println(list);//[1,2,3,9,4,5,6,7,]
三、参考资料
Java Collections - Arrays.spliterator() Example
集合框架3-Arrays 类的更多相关文章
- Java:集合框架的工具类
集合框架的工具类 Arrays:里面都是静态方法,直接用来对各种集合进行操作的公有方法. Collections:里面都是静态方法,直接用来对各种集合进行操作的公有方法. 包括: 1.asList将数 ...
- Java集合框架(常用类) JCF
Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...
- Java最重要的21个技术点和知识点之JAVA集合框架、异常类、IO
(三)Java最重要的21个技术点和知识点之JAVA集合框架.异常类.IO 写这篇文章的目的是想总结一下自己这么多年JAVA培训的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享 ...
- Java集合框架:Arrays工具类
java.util.Arrays类能方便地操作数组,它提供的方法都是静态的.整个Arrays工具类的实现有3000+行.可是归纳总结一下可知它有下面功能(9个): 1. asList 定义: @Saf ...
- 【JAVA集合框架之工具类】
一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...
- java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类
本文关键词: java集合框架 框架设计理念 容器 继承层级结构 继承图 集合框架中的抽象类 主要的实现类 实现类特性 集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...
- java基础之集合框架--使用ArrayList类动态 存储数据
一.ArrayList是List接口下的一个实现类,实现了长度可变的.连续的数组:拥有数组的特性. 遵循了LIst的规则:不唯一的.有序的. 如果没有增加泛型的话,集合中可以添加任何类型的数据. 使用 ...
- 集合框架-工具类-Arrays方法介绍
1 package cn.itcast.p3.toolclass.arrays.demo; 2 3 import java.util.Arrays; 4 5 public class ArraysDe ...
- 【集合框架】JDK1.8源码分析之Collections && Arrays(十)
一.前言 整个集合框架的常用类我们已经分析完成了,但是还有两个工具类我们还没有进行分析.可以说,这两个工具类对于我们操作集合时相当有用,下面进行分析. 二.Collections源码分析 2.1 类的 ...
- Java 集合框架工具类
Collections Arrays Collections 集合框架的工具类, 里面的方法都是静态的, 可以直接使用类名调用 常用方法 1. sort(List<T> list); // ...
随机推荐
- Oracle12c至少开启的服务
如图,至少开启这两个服务才能运行
- LinkedHashMap 与 LRUcache
LRU 缓存介绍 我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系了,要再次联系那位朋友的时候,我们又不得不求 ...
- linux ifconfig不可用
Q: A: 源出问题,修改源:进入源:源地址 /etc/apt/ sudo vi sources.list,将下列内容替换sources.list中的内容,并保存 deb http://mirrors ...
- Pytorch Torchvision Transform
Torchvision.Transforms Transforms包含常用图像转换操作.可以使用Compose将它们链接在一起. 此外,还有torchvision.transforms.functio ...
- 大数据学习(08)—— Hive简介
前面的Hadoop学习是非常体系化的,有主线有细节.到了Hive这里,知识点非常零散,感觉没有什么主线能把它串起来.从官方网站上就能看出这点差异. 什么是Hive Hive是一个基于Hadoop的企业 ...
- 8.7考试总结(NOIP模拟)[Smooth·Six·Walker]
前言 踩了挺多以前没踩过的坑... T1 一开始是打了一个 60pts 的 DFS ,在与暴力拍了几组数据保证正确性之后, 突然想到 BFS 可能会更快一些,然后就又码了一个 BFS,又和 DFS 拍 ...
- linux命令打基础
目录 一.shell概述 二.linux命令分类 三.linux命令行 3.1 格式 3.2 编辑Linux命令行 四.Linux基础命令 4.1 pwd:查看当前的工作目录 4.2 cd:切换工作目 ...
- 靶机DC-2 rbash绕过+git提权
这个靶机和DC-1一样,一共5个flag.全部拿到通关. root@kali:/home/kali# nmap -sP 192.168.1.* 先扫一下靶机的IP地址,拿到靶机的地址为192.168. ...
- 字节跳动上传了一份“面试官版Android面试小册”,不讲一句废话,全是精华
前言 金三银四马上就到了,很多粉丝朋友私信希望我出一篇面试专题或者分享面试相关的笔记来学习,这不今天就给大家安排上了?(都是干货,错过就是亏.) 下面的面试笔记都是精心整理好免费分享给大家的,希望新朋 ...
- Configure Hosts with Puppet
According to "Pro Puppet" 2nd edition, Chapter 2, "Creating a Module to Manage SSH&qu ...