写在前面
关于程序的定义有一个很经典的公式:程序=数据结构+算法;足以可见数据结构对于编程的重要性,掌握好数据结构对日常的开发和性能优化有很大的帮助。一直忙忙碌碌从事工作,很少静下心来梳理自己所学,尤其是一些基础性的东西逐渐被忽视。冥思苦想一番后觉得是时候将数据结构这一块儿进行梳理一下了。作为数据结构开篇,我将从线性表着手,第一篇便是数组。由于笔者自身从事的是android开发,所以文中所使用的代码均以Java为主。
数组
关于数组的定义以及如何使用这里不再多说,数组作为线性表中最简单的一种,很多在Java中用到的数据结构底层都是基于数组或由数组作为组成部分来实现的,比如说ArrayList,HashMap等等,关于ArrayList,HashMap等在后续我也会专门写文章。对于多维数不作过多说明,因为本质上是不存在什么多维数组的。这里我们定义一个如下的一维数组:
int[] a = new int[3];
复制代码
数组的内存
数组在JVM中的内存分配不像链表,它是整块连续内存空间的分配,对内存要求比较高,比如说我们申请了一个100M大小的数组,当内存中没有连续并且足够大的存储空间的时候,即便是内存中剩下的总可用空间大于100M我们还是会申请失败。而链表却恰恰相反它并不需要一块连续的内存空间关于链表的内存分配这里暂不作详细说明,后期文章会写到。那么数组的内存分配具体是怎样的呢?就拿上面定义的数组a来说,首先JVM会在内存中寻找并分配一块连续的内存空间,比如该内存空间的首地址即数组a的首地址是100,那么数组a在内存中的分配如下:
这便是一个连续的内存空间,这里由于int类型一般是占有4个字节,所以a[0]到a[1]在地址数值上虽然间隔4,但是地址却是连续的。数组的优点
由于数组在内存分配上是连续的,这也是数组元素可以通过下标快速访问的原因。因为通过如下公式就能快速定位对应元素的地址:首地址+下标x对应数组元素所占字节。例如:a[1]的地址104 = a[0]首地址100+1x4。所以对于查找操作数组显然具有强的优势。
数组的缺点
前面说到过由于数组在内存分配上必须是一块连续的内存空间,这在为数组提供一些便利的同时也是限制数组的最重要因素。首先一点就是对内存要求较为严格,再者数组的长度要事先指定,但往往我们事先是不知道数据到底有多少个的,这个也是数组的一个局限性。同时对于插入和删除操作数组需要对元素进行前移或后挪,所以在进行频繁插入和删除的场景时尽量不要使用数组。
数组的处理
一般数组作为一种数据结构主要是用来存储数据,同时伴随着增、删、改、查,遍历等操作。在Java中提供了Arrays 类,java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的。
最后
本篇是第一篇比较简单,下一篇将会写链表相关内容,包括一些常见的关于链表的算法以及相应的分析等,文章中如有错误希望大家不吝赐教,共同学习。