ArrayList,LinkedList, Vector, Stack的区别
2015-10-09 13:22
447 查看
List的框架图
List
|---- LinkList
|---- ArrayList
|---- Vector
|---- Stack
List是一个接口,它继承于Collection的接口。它代表着有序的队列。
ArrayList,LinkedList, Vector, Stack是List的4个实现类。
ArrayList:一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、删除效率低。
LinkedList:一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。随机访问效率低,但随机插入、随机删除效率低。
Vector:矢量队列,和ArrayList一样,它也是一个动态数组。但是ArrayList是非线程安全的,而Vector是线程安全的。
Stack:它继承于Vector。它的特性是:先进后出(FILO, FirstIn Last Out)。
List使用场景
如果涉及到“栈”、“队列”、“链表”等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍。
1、对于需要快速插入,删除元素,应该使用LinkedList。
2、对于需要快速随机访问元素,应该使用ArrayList。
3、对于“单线程环境” 或者“多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。
下面是自己用C语言写的单链表,实现了基本的添加元素,删除元素,遍历元素的功能。 注释非常详细,有点数据结构和C基础的一定能看懂。
List
|---- LinkList
|---- ArrayList
|---- Vector
|---- Stack
List是一个接口,它继承于Collection的接口。它代表着有序的队列。
ArrayList,LinkedList, Vector, Stack是List的4个实现类。
ArrayList:一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、删除效率低。
LinkedList:一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。随机访问效率低,但随机插入、随机删除效率低。
Vector:矢量队列,和ArrayList一样,它也是一个动态数组。但是ArrayList是非线程安全的,而Vector是线程安全的。
Stack:它继承于Vector。它的特性是:先进后出(FILO, FirstIn Last Out)。
List使用场景
如果涉及到“栈”、“队列”、“链表”等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍。
1、对于需要快速插入,删除元素,应该使用LinkedList。
2、对于需要快速随机访问元素,应该使用ArrayList。
3、对于“单线程环境” 或者“多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。
下面是自己用C语言写的单链表,实现了基本的添加元素,删除元素,遍历元素的功能。 注释非常详细,有点数据结构和C基础的一定能看懂。
<span style="font-family:FangSong_GB2312;font-size:18px;">/* * LinkList.c * * Created on: 2011-11-2 * Author: du_minchao */ #include <stdlib.h> #include "IDVRealise.h" #include "BaseLinkList.h" int main(){ //建立空表,初始化头指针, head ->next = NULL; LinkList head = (LinkList)malloc(sizeof(LNode)); head->next = NULL; LinkList L = head; insertList(L,1,5); insertList(L,1,4); insertList(L,1,3); insertList(L,1,2); insertList(L,1,1); printList(L); delList(L,1); delList(L,5); //由于没有第5个元素,所有删除失败, 提示位置不合适 printList(L); return 0; } </span>
<span style="font-family:FangSong_GB2312;font-size:18px;">/* * IDVRealise.h * * Created on: 2011-11-2 * Author: du_minchao */ #ifndef IDVREALISE_H_ #define IDVREALISE_H_ #include <stdio.h> #include <stdlib.h> #define DataType int typedef struct LNode{ DataType data; struct LNode *next; }LNode, *LinkList; //查找L中得第i个元素, 并返回其指针 LinkList findList(LinkList L, int i){ LinkList p ; int j=0; p = L; //p指向头结点,这样可以找到第i个元素 while(p && j<i){ p = p->next; ++j; } if(!p){ printf("链表中没有第%d个元素\n", i); return NULL; } return p; } //在头指针链表L第I个位置插入元素e void insertList(LinkList L, int i, DataType e){ //1.首先找到链表中的第i-1个元素 LinkList p = findList(L,i-1); if(!p){ printf("你插入的位置无效!\n"); return; } //2.将元素e插入到链表中 LinkList s = (LinkList)malloc(sizeof(LNode)); s->data = e; s->next = p->next; p->next = s; printf("你已经插入元素%d。\n", s->data); return ; } //删除L中的第I个元素 void delList(LinkList L, int i){ LinkList s=NULL; //1.先找到第i-1个元素 LinkList p = findList(L,i-1); //p指向第i-1个元素 if(!p || !(p->next)){ //如果第I个元素或者第i个元素为空, 则返回删除位置无效 printf("你要删除的位置无效\n"); return ; } //第i个位置不为空 s = p->next; //s指向第i个元素 p->next = s->next; //删除第i个元素 //3.如果有效删除第i个元素。 printf("你已经删除第%d个元素%d。\n",i,s->data); free(s); return ; } #endif /* IDVREALISE_H_ */ </span>
<span style="font-family:FangSong_GB2312;font-size:18px;">/* * BaseLinkList.h * * Created on: 2011-11-3 * Author: du_minchao */ #ifndef BASELINKLIST_H_ #define BASELINKLIST_H_ #include <stdio.h> //对线性表进行初始化 void initList(LinkList L){ } void getElem(LinkList L, int i, DataType e){ } //遍历打印链表中的所有元素 void printList(LinkList L){ LinkList p = L->next; //p指向第一个元素 while(p){ printf("%d ",p->data); p = p->next; } puts(""); return; } #endif /* BASELINKLIST_H_ */ </span>
相关文章推荐
- 如何创建一个原始Mac OS镜像
- 运行脚本提示/bin/bash^M: bad interpreter: No such file or directory
- 重新编译Mono加密DLLMon
- Linux进程间通信(IPC)机制总览
- 航班票价查询api数据整合实现
- 视频质量评价:常规方法
- 归并排序
- 第六周项目1-建立顺序栈的算法库
- 一个简单的.NET MVC 实例
- char** name是什么,如何初始化
- 博客第一篇
- CentOS 6 NFS的安装配置
- hist的使用
- 函数指针(pointer to function)——qsort函数应用实例
- Ionic系列——CodePen上的优秀Ionic_Demo
- cnn公式推导
- 10.8 nova 会议纪要
- GRBL九:STM32移植——主函数调用
- linux中mkdir创建多个同级或下级目录
- 取得表单域的值