博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.util.Arrays (JDK 1.7)
阅读量:5337 次
发布时间:2019-06-15

本文共 5643 字,大约阅读时间需要 18 分钟。

1.asList

//返回由指定数组支持的固定大小的列表,返回的列表是可序列化的public static 
List
asList(T... a) { return new ArrayList<>(a); //调用内部类}

 

private static class ArrayList
extends AbstractList
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[] toArray(T[] a) { int size = size(); if (a.length < size) return Arrays.copyOf(this.a, size, (Class
) 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
spliterator() { return Spliterators.spliterator(a, Spliterator.ORDERED); } @Override public void forEach(Consumer
action) { Objects.requireNonNull(action); for (E e : a) { action.accept(e); } } @Override public void replaceAll(UnaryOperator
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
c) { Arrays.sort(a, c); } }

 返回的 ArrayList 数组是一个定长列表,我们只能对其进行查看或者修改,但是不能进行添加或者删除操作  

 通过源码我们发现该类是没有add()或者remove() 这样的方法的,如果对其进行增加或者删除操作,都会调用其父类 AbstractList 对应的方法,而追溯父类的方法最终会抛出 UnsupportedOperationException 异常。如下:

public static void main(String[] args) {		String[] str = { "a", "b", "c" };		List
listStr = Arrays.asList(str); System.out.println(listStr.set(1, "23")); System.out.println(Arrays.asList(str)); System.out.println(listStr.add("d"));//报错 java.lang.UnsupportedOperationException 调用父类的方法 System.out.println(listStr.remove(1));//报错 java.lang.UnsupportedOperationException 调用父类的方法 }

 ②、引用类型的数组和基本类型的数组区别

1 String[] str = {"a","b","c"};2 List listStr = Arrays.asList(str);3 System.out.println(listStr.size());//34 5 int[] i = {1,2,3};6 List listI = Arrays.asList(i);7 System.out.println(listI.size());//1

  上面的结果第一个listStr.size()==3,而第二个 listI.size()==1。这是为什么呢?

  我们看源码,在 Arrays.asList 中,方法声明为  <T> List<T> asList(T... a)。该方法接收一个可变参数,并且这个可变参数类型是作为泛型的参数。我们知道基本数据类型是不能作为泛型的参数的,但是数组是引用类型,所以数组是可以泛型化的,于是 int[] 作为了整个参数类型,而不是 int 作为参数类型。

 Arrays.asList() 方法使用场景

  Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List 。但是,生成的List的长度是固定的;能够进行修改操作(比如,修改某个位置的元素);不能执行影响长度的操作(如add、remove等操作),否则会抛出UnsupportedOperationException异常。

  所以 Arrays.asList 比较适合那些已经有数组数据或者一些元素,而需要快速构建一个List,只用于读取操作,而不进行添加或删除操作的场景。

2.sort

该方法是用于数组排序,在 Arrays 类中有该方法的一系列重载方法,能对7种基本数据类型,包括 byte,char,double,float,int,long,short 等都能进行排序,还有 Object 类型(实现了Comparable接口),以及比较器 Comparator ,参考: 。

3.binarySearch

用二分法查找数组中的某个元素。该方法和 sort 方法一样,适用于各种基本数据类型以及对象。

public static int binarySearch(long[] a, long key) {        return binarySearch0(a, 0, a.length, key);    }
private static int binarySearch0(long[] a, int fromIndex, int toIndex,                                     long key) {        int low = fromIndex;        int high = toIndex - 1;        while (low <= high) {            int mid = (low + high) >>> 1;            long midVal = a[mid];            if (midVal < key)                low = mid + 1;            else if (midVal > key)                high = mid - 1;            else                return mid; // key found        }        return -(low + 1);  // key not found.    }

4.copyOf

拷贝数组元素。底层采用 System.arraycopy() 实现,这是一个native方法。

public static native void arraycopy(Object src,  int  srcPos,                                        Object dest, int destPos,                                        int length);

  src:源数组

  srcPos:源数组要复制的起始位置

  dest:目的数组

  destPos:目的数组放置的起始位置

  length:复制的长度

  注意:src 和 dest都必须是同类型或者可以进行转换类型的数组。

5.toString

toString 用来打印一维数组的元素

public static String toString(long[] a) {        if (a == null)            return "null";        int iMax = a.length - 1;        if (iMax == -1)            return "[]";        StringBuilder b = new StringBuilder();        b.append('[');        for (int i = 0; ; i++) {            b.append(a[i]);            if (i == iMax)                return b.append(']').toString();            b.append(", ");        }    }  

 

参考文档:

 

转载于:https://www.cnblogs.com/xiaofuzi123456/p/11359467.html

你可能感兴趣的文章
[收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招...
查看>>
tinkcmf视频上传大小限制
查看>>
解决“并非来自 Chrome 网上应用店。”
查看>>
《第1章:统计学习方法概论》
查看>>
JS定时器时间日期钟表
查看>>
partial(C# 参考)
查看>>
Supervisor介绍、安装及配置
查看>>
openshift 添加cron定时任务
查看>>
sublime text3在指定浏览器上本地服务器(localhost)运行文件(php)
查看>>
【ABAP系列】SAP ABAP基础-录制BDC的MODE定义解析
查看>>
C++编写DLL的方法
查看>>
自适应布局1
查看>>
docker不稳定 short running containers with -rm failed to destroy
查看>>
poj 3071 Football (概率DP水题)
查看>>
NEFU 506&&ZOJ 3353 Chess Board (四种构造的高斯消元)
查看>>
JS正则表达式验证数字
查看>>
tcmalloc jemalloc 和ptmalloc 对比
查看>>
线性回归当中的矩阵求导问题
查看>>
nnet3的代码分析
查看>>
Android开发视频教学第一季(1-16集)视频源码下载
查看>>