1.asList

  1. //返回由指定数组支持的固定大小的列表,返回的列表是可序列化的
  2. public static <T> List<T> asList(T... a) {
  3. return new ArrayList<>(a); //调用内部类
  4. }
  1. private static class ArrayList<E> extends AbstractList<E>
  2. implements RandomAccess, java.io.Serializable
  3. {
  4. private static final long serialVersionUID = -2764017481108945198L;
  5. private final E[] a;
  6.  
  7. ArrayList(E[] array) {
  8. a = Objects.requireNonNull(array);
  9. }
  10.  
  11. @Override
  12. public int size() {
  13. return a.length;
  14. }
  15.  
  16. @Override
  17. public Object[] toArray() {
  18. return a.clone();
  19. }
  20.  
  21. @Override
  22. @SuppressWarnings("unchecked")
  23. public <T> T[] toArray(T[] a) {
  24. int size = size();
  25. if (a.length < size)
  26. return Arrays.copyOf(this.a, size,
  27. (Class<? extends T[]>) a.getClass());
  28. System.arraycopy(this.a, 0, a, 0, size);
  29. if (a.length > size)
  30. a[size] = null;
  31. return a;
  32. }
  33.  
  34. @Override
  35. public E get(int index) {
  36. return a[index];
  37. }
  38.  
  39. @Override
  40. public E set(int index, E element) {
  41. E oldValue = a[index];
  42. a[index] = element;
  43. return oldValue;
  44. }
  45.  
  46. @Override
  47. public int indexOf(Object o) {
  48. E[] a = this.a;
  49. if (o == null) {
  50. for (int i = 0; i < a.length; i++)
  51. if (a[i] == null)
  52. return i;
  53. } else {
  54. for (int i = 0; i < a.length; i++)
  55. if (o.equals(a[i]))
  56. return i;
  57. }
  58. return -1;
  59. }
  60.  
  61. @Override
  62. public boolean contains(Object o) {
  63. return indexOf(o) != -1;
  64. }
  65.  
  66. @Override
  67. public Spliterator<E> spliterator() {
  68. return Spliterators.spliterator(a, Spliterator.ORDERED);
  69. }
  70.  
  71. @Override
  72. public void forEach(Consumer<? super E> action) {
  73. Objects.requireNonNull(action);
  74. for (E e : a) {
  75. action.accept(e);
  76. }
  77. }
  78.  
  79. @Override
  80. public void replaceAll(UnaryOperator<E> operator) {
  81. Objects.requireNonNull(operator);
  82. E[] a = this.a;
  83. for (int i = 0; i < a.length; i++) {
  84. a[i] = operator.apply(a[i]);
  85. }
  86. }
  87.  
  88. @Override
  89. public void sort(Comparator<? super E> c) {
  90. Arrays.sort(a, c);
  91. }
  92. }

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

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

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

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

  1. 1 String[] str = {"a","b","c"};
  2. 2 List listStr = Arrays.asList(str);
  3. 3 System.out.println(listStr.size());//3
  4. 4
  5. 5 int[] i = {1,2,3};
  6. 6 List listI = Arrays.asList(i);
  7. 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 ,参考:https://www.cnblogs.com/yuxiaofei93/p/5722714.html

3.binarySearch

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

  1. public static int binarySearch(long[] a, long key) {
  2. return binarySearch0(a, 0, a.length, key);
  3. }
  1. private static int binarySearch0(long[] a, int fromIndex, int toIndex,
  2. long key) {
  3. int low = fromIndex;
  4. int high = toIndex - 1;
  5.  
  6. while (low <= high) {
  7. int mid = (low + high) >>> 1;
  8. long midVal = a[mid];
  9.  
  10. if (midVal < key)
  11. low = mid + 1;
  12. else if (midVal > key)
  13. high = mid - 1;
  14. else
  15. return mid; // key found
  16. }
  17. return -(low + 1); // key not found.
  18. }

4.copyOf

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

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

  src:源数组

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

  dest:目的数组

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

  length:复制的长度

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

5.toString

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

  1. public static String toString(long[] a) {
  2. if (a == null)
  3. return "null";
  4. int iMax = a.length - 1;
  5. if (iMax == -1)
  6. return "[]";
  7.  
  8. StringBuilder b = new StringBuilder();
  9. b.append('[');
  10. for (int i = 0; ; i++) {
  11. b.append(a[i]);
  12. if (i == iMax)
  13. return b.append(']').toString();
  14. b.append(", ");
  15. }
  16. }  

参考文档:https://www.cnblogs.com/ysocean/p/8616122.html#_label0

java.util.Arrays (JDK 1.7)的更多相关文章

  1. [转]java动态代理(JDK和cglib)

    转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理 ...

  2. java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)

    一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...

  3. java动态代理(JDK和cglib)

    转:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代 ...

  4. 《转》java动态代理(JDK和cglib)

    该文章转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的 ...

  5. Spring学习(四)—— java动态代理(JDK和cglib)

    JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他 的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托 ...

  6. java动态代理(JDK和cglib)(转载)

    原文地址:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html 高亮部分是我的理解. JAVA的动态代理 代理模式 代理模式是常用的j ...

  7. 浅谈java.util.ConcurrentModificationException(并发修改异常)

    java中的list集合是我们经常使用的集合,而对集合进行增加和删除元素是我们最常用的操作.那么在什么时候对list集合什么样的操作,就会发生java.util.ConcurrentModificat ...

  8. java.util.ConcurrentModificationException(如何避免ConcurrentModificationException)

    java.util.ConcurrentModificationException is a very common exception when working with java collecti ...

  9. Linux下安装和配置java开发环境(jdk/eclipse/tomcat)

    第一步 安装jdk 1.进入usr目录 cd /usr 2.在usr目录下建立java安装目录 mkdir java 3.将jdk-6u24-linux-i586.bin拷贝到java目录下 cp j ...

随机推荐

  1. 代码实现:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.第二个完全数是28, //它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加, //编程找出1000以内的所有完数。

    import java.util.ArrayList; import java.util.List; //一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3. ...

  2. Ubuntu 16.04下安装sublime Text的插件

    Sublime Text是什么: 它是一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比于难于上手的Vim,浮肿沉重 ...

  3. Jenkins持续集成环境部署

    一.下载Jenkins Jenkins下载地址:https://jenkins.io/download/ 这里我们下载的是jenkins.war 二.启动Jenkins 在Linux下启动Jenkin ...

  4. Kafka集群搭建和配置

    Kafka配置优化 https://www.jianshu.com/p/f62099d174d9 1.安装&配置 下载tar包 解压后即可使用 修改配置文件 将server.propertie ...

  5. centos7 忘记root密码,如何进入单用户模式。

    init方法 1.centos7的grub2界面会有两个入口,正常系统入口和救援模式: 2.修改grub2引导 在正常系统入口上按下"e",会进入edit模式,搜寻ro那一行,以l ...

  6. cosbench 安装

    cosbench是什么 COSBench是Intel团队基于java开发,衡量云对象存储服务性能的基准测试工具,全称是Cloud object Storage Bench,同所有的性能测试工具一样,C ...

  7. python学习之函数(一)

    4.4函数 面向过程编程的缺点: ​ 1.代码重复: ​ 2.代码可描述性不高: 4.4.1 函数初识 ​ 函数是对代码块动作和功能的封装定义:函数是以功能为导向,一个为函数封装一个功能. ​ 优点: ...

  8. jitamin配置(nginx设置)

    server { listen 66; server_name 192.168.2.253; root "/var/www/jitamin/public"; location / ...

  9. linux scp放后台执行方法

    客户要搭建异地的容灾dg,压缩备份集500G,只能使用scp,前台跑经常超时,使scp放后台跑完成相关的文件传输: FULLBAK_LFCXJMYB_20190507_6448_1.DBFILE 10 ...

  10. 【神经网络与深度学习】Caffe部署中的几个train-test-solver-prototxt-deploy等说明

    1:神经网络中,我们通过最小化神经网络来训练网络,所以在训练时最后一层是损失函数层(LOSS), 在测试时我们通过准确率来评价该网络的优劣,因此最后一层是准确率层(ACCURACY). 但是当我们真正 ...