JavaArrayList工作原理及实现-Java开发Java经验技巧_第1页
JavaArrayList工作原理及实现-Java开发Java经验技巧_第2页
JavaArrayList工作原理及实现-Java开发Java经验技巧_第3页
JavaArrayList工作原理及实现-Java开发Java经验技巧_第4页
JavaArrayList工作原理及实现-Java开发Java经验技巧_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、java arraylist t作原理及实现-编程开发技术java arraylist工作原理及实现原文出处:yikun1.概述关于java集合的小抄中是这样描述的:以数组实现。节约空间,但数组有容量限制。超出限制时会增加 50%容量,hj system, arraycopy ()复制到新的数组,因此最好能给 出数组人小的预估值。默认第一次插入元索时创建人小为10的数 组。按数组下标访问元素一get (i)/set (i, e)的性能很高,这是数组的 基本优势。直接在数组末尾加入元素一add(e)的性能也高,但如果按下标插 入、删除元素一add(i, e), remove(i), remove

2、 (e),则要用 system, arraycopy ()来移动部分受影响的元素,性能就变差了,这 是基本劣势。然后再来学习一下官方文档:resizab1earray?imp1ementation of the list interface.tmplements al 1 optional list operations, and permits al 1 clemcnts, including null in addition to implcmcnting the list int erface, t his class provides met hods to manipulate th

3、e size of the array that is used internally to store the list. (this class is roughly equivalent to vector, except that it is unsynchronized.)arraylist是一个相对来说比较简单的数据结构,最重要的一点就是它的自动扩 容,可以认为就是我们常说的“动态数组”。來看一段简单的代码:arraylist<string> list 二 new arraylist<string>(); list. add(,z语文:99");l

4、ist, add("数学:98");list, add(,z英语:100");list, remove(0);在执行这四条语句时,是这么变化的:语文:99语文:99语文:99数学:98数学:98hhhjljljljljl数学:98hhhjljljlj_jljl英语:100hhjljljl英语:100卜lt卜卜卜卜h卜卜llist e数学:98,其屮,add操作可以理解为直接将数组的内容置位,remove操作可以理解为删除 index为0的节点,并将后面元索移到0处。2. add函数当我们在arraylist中增加元素的时候,会使用add函数。他会将元素放到末尾。

5、具体实现如下:public boolean add(e e) cmsurccapacitylntcrnal(size +1);/ increments modcount!elementdatasize+ = e;return true;我们可以看到他的实现其实最核心的内容就是ensurecapac i ty internal。这个 函数其实就是自动扩容机制的核心。我们依次來看一下他的具体实现private void cnsurccapacitylnternal(int mincapacity) if (elementdata = defaultcapac1ty_empty_elementdat

6、a) mincapacity = math, max(default capacity, mincapacity); "cnsurcexplicitcapacity(mi ncapacity);private void ensureexplicitcapacity(int mincapacity) modcount+;/ overflow-conscious codeif (mincapacity - elementdata. length > 0)grow(m i ncapac ity);private void grow(int mincapacity) / overflo

7、w-conscious codeint oldcapacity 二 elementdata. length;/扩展为原來的1.5倍int ncwcapacity 二 oldcapacity + (oldcapacity >> 1);/如果扩为15倍还不满足需求,直接扩为需求值if (newcapacity - mincapacity < 0) newcapacity 二 mincapacity;if (newcapacity - max_array_stze > 0)ncwcapacity 二 hugccapacity(mincapacity);/ mincapacit

8、y is usually close to size, so this is a win: elementdata 二 arrays. copyof(elementdata, newcapacity);也就是说,当增加数据的时候,如果arraylist的犬小已经不满足需求时,那么 就将数组变为原长度的15倍,z后的操作就是把老的数组拷到新的数组里面。 例如,默认的数组大小是10,也就是说当我们addlo个元素之后,再进行一次add时,就会发生自动扩容,数组长度由10变为了 15具体情况如下所示: o listarraylist<e > (id = 18) g li< elem

9、entdataobject(10 (id=29)> 0洒文:i* (id=3刀0> 1数学:2- (id=38)0> 2英语:3- (id=39)0> 3踞台:4- (id=44)0> 4历史:5- (id=45)t>> 5物理:6, (id=46)d> 6化学:7' (id=47)t>> a 7生物:8" (id=48)t>> 8it禮:9* (id =49)t> 9体育:io' (id = 52)o modcount10t>回 size1003 set和get函数array的put

10、和get函数就比较简单了,先做index检查,然后执行赋值或访问 操作:public e set (int index, e element) remgecheck(index);e oldvalue = elementdata(index); elementdataindex二 element; return oldvalue;public e get (int index) rangecheck(index);return el ernentdata(index);4 remove 函数public e remove(int index) rangecheck(i ndex);modcount+;e oldvalue = elementdata(index);int rmmmoved = size - index - 1;if (nummoved > 0)/把后面的往前移system, arraycop) (elementdata, index+1, elementdata, index, nummoved);/把最后的置nullelementdata-size = null; / clear to let gc do its workreturn oldvalue;注释很清处:removes the element at

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论