浅析Arrayist内部实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅析Arrayist内部实现

浅析ArrayList的内部实现 ArrayList的特性:可以自由扩展,存储任意多个数字,弥补了数组的定长的缺陷!但是他的内部还是数组!为什么ArrayList可以自由扩展了! 下面我们用代码来演示下ArrayList的内部实现! 首先我们定义一个MyArrayList,既然是集合,集合的内部实现都是数组,我们定义一个MyArrayList里面包含一个Object类型的数组!和一个int 类型的size size是用来存储数组中存储了多少个Object! public class MyArrayList { Object []arr=new Object[2]; //定义一个数组 int size=0; //存入了多少数到数组里面的记录!(数组里面有多少个数)当记录数等于数组的长度时就需要扩容 } 这样我们自己的MyArrayList就定义好了,在ArrayList中有添加数,在指定位置添加数,根据索引查询,根据索引删除,删除指定对象等方法,用代码来实现: 首先定义一个添加的方法add(Object object); 我们只需要将传进来的object添加到上面定义好的arr的数组中,但是数组的长度只有2个,当我们添加第三个object的时候,就会越界,下面我们要做的是将arr数组的长度增加!如何做了? 代码实现如下 /*添加数据,判断扩容*/ public void add(Object num){ if(arr.length==size){ Object []temp=new Object[arr.length*3/2+1]; System.arraycopy(arr, 0, temp, 0, size); arr=temp; } arr[size++]=num; //每进一个数就要将记录数++ } 下面我们来看下 代码的实现 当我们发现数组的长度等于数组中的记录数的时候,我们知道,数组已经装满了!如果在添加的话就会越界,这时我们就new一个临时数组temp出来,长度比原来数组长度大就行了,然后我们把arr数组里面的数按添加位置,复制到temp中就行了,我们可以使用for循环一个一个的去移,那样速度会慢一点(但数大的时候区别大一些,代码中的方法为源码中的方法,我们借鉴下),我们就是用System.arraycope方法将arr数组按添加位置添加临时数组temp数组中,arraycope方法中五个参数的意思分别是:源(要copy哪个数组,以arr和temp为例)、从arr的0个位置开始copy、copy到temp数组、copy到temp的0个位置、copy多少个长度! 整个意思就是 我们将arr数组中的第0个位置开始一直copy数组中的记录数size个数 copy到temp中从第0个位置开始放置!这样我们的temp数据就比arr数组要大,然后再temp数组整体复制给arr数组就达到了扩容的目的!好了我们第一个方法add(Object object) 方法成功! 现在是不是 迫不及待的测试下 自己的MyArrayList的方法add(Object object)是否成功, 我们就写一个get(int index)方法就行! 在get(int index)方法中我们要做的就是将arr数组中的数据按index索引返回就行 代码示例 public Object get(int index){ return arr[index]; } 呵呵! 就这么简单!我们定义好了一个MyArrayList集合! 然后就是指定索引位置添加数据了! 现在我们应该有一个思路,我们的MyArrayList就是一个数组,跟数组不同的就是一个扩容问题,我们把扩容处理好了,就是在对数组操作! 我们还是先定义一个方法add(Object object)方法重载的方法,add(int index,Object object)方法,要做的三件事,首先是判断数组是否需要扩容,然后是将指定位置后的object整体往后移一位,最后就是将要添加的object添加到指定的index位置了! 代码如下 public void add(int index,Object object){ /*传递过来的索引 我们首先要判断是否大于数组的长度 * 小于我们就加!否则越界 * 我们还要判断一点的是他什么时候扩容 */ if(indexarr.length){ if(size==arr.length){ Object []temp=new Object[arr.length*3/2+1]; System.arraycopy(arr, 0, temp, 0, size);

文档评论(0)

138****7331 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档