数组6:Java中的ArrayArrays和ArrayList

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组6:Java中的ArrayArrays和ArrayList相关的知识,希望对你有一定的参考价值。

​你平时写代码的时候是否注意过,jdk里竟然有三个数组相关的类:Array、Arrays和ArrayList。这三个看上去都是数组结构的线性表,但是有啥区别呢?

一.Array与Arrays类的区别

在java中的这两个类有点奇怪,它们不是在一个包里的,Arrays在java.util包下,这个包是我们经常使用的各类基础工具。而Array不是其单数形式,而且也不在java.util包下,而是在java.lang.reflect.包下(在java.sql包下也有一个,先不管了)。这两个到底啥关系呢?

既然是在reflect包下,那一定是和反射有关系了,反射要获得什么呢?动态创建和访问的方法,所以Array就是为了外部能够动态创建和访问 Java 数组的方法而提供的一个类,其主要方法如newInstance,getByte等都是为了方便反射操作而提供的。而Arrays的路径是 java.util.Arrays,有自定义的public 方法来操作数组(比如排序和搜索等)。此类还包含一个允许将数组作为列表来查看的静态工厂。除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException。

结论就是两者其实没有半毛钱关系,我们用到数组的时候放心的使用Arrays就行了。

二.Arrays与ArrayList类的区别

ArrayList 也在java.util下,是 java 集合框架中比较常用的数据结构。我们先看其定义:

public class ArrayList<E> extends AbstractList<E>        implements List<E>, RandomAccess, Cloneable, java.io.Serializable       }

通过这个定义我们就知道,其功能远比Arrays强大。它继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化,允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。因为其功能强大,特别是支持动态扩容等特性,这个类在我们的业务代码里用的更多。

ArrayList的get方法是基于迭代器来做的,其设计也非常精妙,这个我们在后面梳理递归和迭代器的时候专门分析这个问题。

现在先轻松一下,看看Arrays的使用方法吧。

三.Arrays的使用

这个类在我们刷算法,面算法时经常遇到,所以再梳理一下其常见的用法吧。

Arrays类提供了几个非常有用的方法。如果熟练掌握的话,对我们写出简洁优美的算法大有裨益。

Arrays提供的方法都是静态的,其中比较重要的有:

1.void Arrays.sort()

void Array.sort(Object[] array)

功能是对数组按照升序排序。这个类提供了一个非常重要的方法sort(),在处理复杂算法的时候,我们能直接使用,这就减少了很多麻烦。

      int[] nums = {2,5,0,4,6,-10};
      Arrays.sort(nums);
      for(int i :nums)
          System.out.print(i+" ");

输出结果:

-10 0 2 4 5 6

这个排序还能对数组元素进行指定范围排序:

Arrays.sort(Object[] array, int from, int to)

功能:对数组元素指定范围进行排序(排序范围是从元素下标为from,到下标为to-1的元素进行排序)

      int[] nums = {2,5,0,4,1,-10};
      //对前四位元素进行排序
      Arrays.sort(nums, 0, 4);
      for(int i :nums)
          System.out.print(i+" ");

输出结果:

0 2 4 5 1 -10

2.Arrays.fill(Object[] array,Object object)

功能:可以为数组元素填充相同的值

      int[] nums = {2,5,0,4,1,-10};
      Arrays.fill(nums, 1);
      for(int i :nums)
          System.out.print(i+" ");
     

执行结果:

1 1 1 1 1 1

这里也可以对数组的部分元素填充一个值,从起始位置到结束位置,取头不取尾

Arrays.fill(Object[] array,int from,int to,Object object)

      int[] nums = {2,5,0,4,1,-10};
      //对数组元素下标2到4的元素赋值为3
      Arrays.fill(nums,2,5,3);
      for(int i :nums)
          System.out.print(i+" ");

执行结果:

2 5 3 3 3 -10

3.Arrays.toString(Object[] array)

功能:返回数组的字符串形式

      int[] nums = {2,5,0,4,1,-10};
      System.out.println(Arrays.toString(nums));

输出结果:

[2, 5, 0, 4, 1, -10]

4.Arrays.deepToString(Object arrays)

功能:返回多维数组的字符串形式

     int[][] nums = {{1,2},{3,4}};
      System.out.println(Arrays.deepToString(nums));
  

输出结果:

[[1, 2], [3, 4]]


 

以上是关于数组6:Java中的ArrayArrays和ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

java取数组中的最大值

Java中的数值和集合

写一个方法,将一个整形数组中的偶数复制到另一个数组中,用java写。

Javascript中如何删除数组中指定元素后形成新的数组

Javascript中如何删除数组中指定元素后形成新的数组

键盘录入6个int类型的数据存入数组arr中,将arr数组中的内容反转...