数组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的主要内容,如果未能解决你的问题,请参考以下文章