数据结构-数组Array进阶攻略

数组是非常基础的数据结构,本文准备从数组自身与java的Arrays工具类来分析数组:
(Queue系列第二篇难产了,发现要写清楚得再复习复习并发的知识,所以先写简单的)

数组基本概念与特性

数组特点

1:长度固定
2:数组是相同数据类型的有序集合
3:数组也是对象(属于引用类型)

可以看见,特点1是对数组使用的一个致命性打击,在大多数编程的情况下,我们需要一个	
可伸缩的容器而不是一个定长的容器。那么数组还有使用的必要么?答案是肯定的,
时光回到java远古时代,当时并没有泛型的说法,数组成了唯一可以控制元素类型的容器。这是数组的第一个优势。
而在当时,也仅有数组可以持有基本类型,这是数组的第二个优势。
第三个优势则是效率,数组是一种效率最高的存储和随机访问对象引用序列的方式《Thinking in java,p433》
当然,到了现在数组也仅有第三点优势存在了,
泛型的出现使得其他容器也可以持有基本类型(通过自动打包),也可以用泛型约束元素类型。

初始化数组:

1.静态初始化
简化格式:
数据类型[] 数组名称 = {值, 值, …};
int[] arr={1,2,3,6};
完整格式(推荐):
数据类型[] 数组名称 = new 数据类型[]{值, 值, …};
int[] arr=new int[]{1,2,3,4,5,6,7,22};
2.动态初始化
数组定义与为数组元素分配空间并赋值的操作分开进行
int[] a1=new int[2];//动态初始化元素,先分配空间
a1[0]=1;//给数组元素赋值

数组内存分配图:

在这里插入图片描述

数组的素敌:泛型

仔细看过前面的读者肯定知道,数组就是被泛型害的丧失了三个优势中的两个,不光如此,
通常,数组与泛型并不能很好的结合,你不能实例化具有参数化类型的数组。

Peel<Banana>[] peels = new Peel<Banana>[10];//Error!

如果你真的需要运用泛型数组,那么有个奇怪的技巧可以解决问题:

T[] array;
array = new T[10]//这会报错
array = (T[])new Object[10];//OK

实用的Arrays工具类与System.arraycopy();

System.arraycopy

在说Arrays工具类之前,先说说System.arraycopy方法
此方法只需关注三点
1:效率高,比传统for循环挨个赋值,不知道高到哪里去了
2:此为浅拷贝,只拷贝了引用,新数组与老数组引用对象的内存地址都是一样的
3:两个数组的类型要求完全一样,不支持自动装箱!

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

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

dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。

Arrays工具类

Arrays工具类是JAVA专门用于支持数组操作的工具类,下面介绍几个比较常用的方法:

1、Arrays.asList(T… data)
注意:该方法返回的是Arrays内部静态类ArrayList,而不是我们平常使用的ArrayList,,该静态类ArrayList没有覆盖父类的add, remove等方法,所以如果直接调用,会报UnsupportedOperationException异常

2、Arrays.fill()

Arrays.fill(Object[] array, Object obj)
用指定元素填充整个数组(会替换掉数组中原来的元素)

Arrays.fill(Object[] array, int fromIndex, int toIndex, Object obj)
用指定元素填充数组,从起始位置到结束位置,取头不取尾(会替换掉数组中原来的元素)

3、Arrays.sort()

Arrays.sort(Object[] array)
对数组元素进行排序(串行排序)

Arrays.sort(T[] array, Comparator<? super T> comparator)
使用自定义比较器,对数组元素进行排序(串行排序)

4、Arrays.parallelSort()
注意:其余重载方法与 sort() 相同

Arrays.parallelSort(T[] array)
对数组元素进行排序(并行排序),当数据规模较大时,会有更好的性能

5、Arrays.binarySearch()

注意:在调用该方法之前,必须先调用sort()方法进行排序,如果数组没有排序,
那么结果是不确定的,此外如果数组中包含多个指定元素,则无法保证将找到哪个元素

6、Arrays.equals(Object[] array1, Object[] array2)

判断两个数组是否相等,实际上比较的是两个数组的哈希值,
即 Arrays.hashCode(data1) == Arrays.hashCode(data2)

彩蛋:arraycopy,clone,copyof都是浅拷贝,那么如何实现对象的深度拷贝呢?

答:
实现Cloneable接口,并重写clone方法,注意一个类不实现这个接口,直接使用clone方法是编译通不过的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章