从概念上可知,数组属于线性表(逻辑上一一对应关系),数组在物理内存上采用顺序存储结构。当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组。
优点:可根据索引快速的查找元素。
缺点:大小不可变。(确切应该讲,不能往一个放满元素的数组里再添加新的元素)
ArrayList正是保留了数组可以快速查找的优势,同时,又弥补了数组在创建后,要往数组添加元素的弊端。
其实,要往一个已经放满元素的数组里面再添加一个元素,也是可以实现的,即创建一个比原数组容量大一的新数组,将数组中的元素“搬”到新数组,再将新的元素也放入新数组,最后将新数组赋给原数组即可。(这也是用数组的方式实现ArrayList的基本方法)
int[] oldArray = {1,2,3,4};
int[] newArray = new int[oldArray.length+1];
for(int t =0;t<oldArray.length;t++){
newArray[t] = oldArray[t];
}/*这里不能直接用newArray=oldArray; 因为这样newArray的大小会变成 跟oldArray一样了。 */
System.out.println(newArray.length);
newArray[oldArray.length] = 5;
oldArray = newArray;
通过这样的方法,我们可以简单的实现自己的ArrayList。
public class MyArrayList {
private static Object array[] = new Object[0];
//得到队列的大小
public int getLength(){
return array.length;
}
//根据索引得到元素
public Object get(int index){
return array[index];
}
public void add(Object obj){
Object o[] = new Object[(array.length+1)];
for(int t=0;t<array.length;t++){
o[t]=array[t];
}
o[array.length] = obj;
array = o;
}
public void add(int index, Object obj){
Object o[] = new Object[(array.length+1)];
for(int t=0;t<index;t++){
o[t]=array[t];
}
o[index] = obj;
for(int t=index+1;t<o.length;t++){
o[t]=array[t-1];
}
array = o;
}
/**
* 查找队列中是否存在obj元素
* @param obj:要查找的元素对象
* @return :返回元素第一次出现的索引位置,若不含该元素则返回-1
*/
public int indexOf(Object obj){
for(int t=0;t<array.length;t++){
if(array[t].equals(obj)){
return t;
}
}
return -1;
}
}
以上便是自己用数组实现的简单的ArrayList。
这样子,我们不但保留了数组可以根据索引快速查找的优势,同时,还可以随时往里面添加元素,不过添加元素的效率应该还是没有链表的效率高的,因为需要创建一个新的数组,还要进行“搬迁”的工作,实在麻烦。
=============================================
下面请教一下大家怎么称呼ArrayList的?
一开始学Java的时候,就一直把ArrayList称之为“队列”(也不知道对不对)。
ArrayList,以其称之为队列,倒不如叫做“可增长的数组”好了(个人看法)。
现在反倒觉得不恰当了,因为ArrayList根本也没继承队列Queue接口。而且,list在百度词典上有着“链表,表”的含义,完全没有“队列”这个意思。
同时,根据百度百科的定义:“队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。”ArrayList跟队列实在是风马牛不相干呀。
另外,LinkedList则是同时继承了Queue接口跟List接口。
PS:这篇文档,我反复的更改字体格式,甚至拷到Word中更改完再复制回来,但始终就是发表后,跟我预览的完全不一样...不知道是不是我电脑有问题,还是人品有问题。如造成您的阅读困扰,请谅解!!!
分享到:
相关推荐
使用数组列表ArrayList填充ListBox
C#中数组与arraylist C#中数组的应用与arraylist的应用 即两者间的区别
数据结构与算法(C#).PDF及代码 第1章 Collections类、泛型类和Timing类概述 第2章 数组和ArrayList 第3章 基础排序算法 第4章 基础查找算法 第5章 栈和队列 第6章 BitArray类 第7章 字符串、String类和StringBuioder...
java中数组列表ArrayList的使用.doc
java中数组列表arraylist的使用.docx
学习数据结构与算法的学生在学习如何实现它们之前可以先明白如何使用数据结构。以前老师在构建完整的堆栈数据结构之前只能抽象地讲解堆栈的概念。而现在老师可以立刻通过示范数据结构工具来向学生们展示如何用堆栈...
对数组和ArrayList的学习总结,详细介绍了数组与ArrylyList的使用
java中数组列表ArrayList的使用[归类].pdf
回到编程而言,比如将一个班级的学生名字要临时存储在内存中,你会选择什么数据结构来存储,数组还是ArrayList,或者HashSet,或者别的数据结构。如果不懂数据结构的,可能随便选择一个容器来存储,也能完成所有的...
数组模仿ArrayList,集合
《数据结构与算法分析:Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。...
中文名: 数据结构与算法分析_Java语言描述(第2版)作者: 韦斯译者: 冯舜玺资源格式: PDF版本: 扫描版出版社: 机械工业出版社书号: ISBN:9787111231837发行时间: 2009年01月01日地区: 大陆语言: 简体中文简介: 内容...
主要实现查找任意两地点间最短路径并获得其长度,添加地点,删除地点,添加路线,删除路线操作 该系统带有模拟地图的加权无向图,直观的表现... 数据结构: 二维数组存储加权无向图 ArrayList存储地点,路径的相关信息
在工作中经常遇到C#数组、ArrayList、List、Dictionary存取数据,但是该选择哪种类型进行存储数据,对于初学者的我一直不知道该怎么取舍。于是抽空好好看了下他们的用法和比较,在这里总结下来,后面有需要改进的...
表、栈和队列3.1 抽象数据类型3.2 表ADT3.2.1 表的简单数组实现3.2.2 简单链表3.3 JavaCollectionsAPI中的表3.3.1 Collection接口3.3.2 Iterator接口3.3.3 List接口、ArrayList类和LinkedList类3.3.4 例:remove...
java数据结构 ArrayList、Stack、Map,为提高效率,未做边界判断(由开发人员保证逻辑上不会出现越界),实现了添加和查询的功能,无修改删除功能
2.1.3 取回数组元数据的方法和属性31 2.1.4 多维数组31 2.1.5 参数数组32 2.1.6 锯齿状数组32 2.2ArrayList 类33 2.2.1ArrayList 类的成员34 2.2.2 应用ArrayList 类34 ArrayList grades = new ArrayList(); 34 小结...
内容简介《数据结构与算法分析:Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。...