标签:ali 链接 void ret 特点 list接口 选择 基于 安全
线性表是一种常用的数据结构,通常用来存储数据,存储方式是线性的。常见的线性表有顺序表,
链表等。顺序表是基于数组实现的,链表是通过一个个节点链接而成。线性表具有随机访问的机制,可以
在任意位置插入和删除数据元素。
C语言实现:
#define MaxSize 10
typedef struct{
char list[MaxSize];
int capacity;
}SequenceList;//ADT定义,字符数组大小10
void ListInitalize(SequenceList *L){
L->capacity= 0;//初始化数据元素个数为0
}
int Length(SequenceList L){//返回顺序表长度L
return L.capacity;
}
boolean ListInsert(SequenceList *L,int i,char target){//将target插入顺序表L的第i个位置
if(L->capacity >= MaxSize){
return false;//表长大于最大容量,无法插入
else if(i < 0 || i > L->capacity){
return false;//下标越界
}else{
int j ;
for(j = L->capacity; j > i;j--){//j为表长,从后插入
L->list[j] = L -> list[j-1];
L->list[i] = target;//插入
L -> capacity++;
return true;
}
}
}
boolean Delete(SequenceList *L, int i ,char *target){//删除操作
if(L->capacity < = 0){
return false;//表已空;
}else if(i < 0 || i > L->capacity-1){
return false;//下标越界
}else{
*target = L->list[i];
for(j = i+1; j <= L->capacity-1;j++){
L->list[j-1] = L->list[j];//往前覆盖
}
L->capacity--;//表长减一
return true;
}
}
在java中顺序表ArrayList是基于数组实现的,继承于AbstractList,实现了List接口,RandomAccess接口,
ArrayList是线程不安全的,由于ArrayList没有实现synchronized锁,当有多个线程对其操作时将会产生错误。
但Collections集合实现了synchronized,使得我们初始化List可以保证线程安全,
List list = Collections.synchronizedList(new ArrayList(...));
This is best done at creation time, to prevent accidental unsynchronized access to the list:
ArrayList初始化数组的容量是10,当数组超过最大容量时,会生成一个1.5容量的新数组来代替旧的数组。
而LinkedList是基于链表实现的,实现List,Deque,等接口,因而LinkedList也有双端队列提供的方法,
LinkedList同样是线程不安全的,可以通过
List list = Collections.synchronizedList(new LinkedList(...));
使得我们初始化List可以保证线程安全。
比较:顺序表是基于数组实现的,在计算机内存中是占一段连续的内存,而链表是通过一个一个的节点链接起来的,
在计算机内存是离散的。顺序表的查找效率是O(1),我们可以通过下标来定位我们需要查找的元素,链表的查找效率是
O(n),因为链表的存储是离散的。而顺序表插入删除操作效率是O(n),因为我们需要移动插入或删除的一部分元素,而链表
插入删除是O(1),这与其存储特点有关。在需要频繁插入操作时,选择链表更为有效。
标签:ali 链接 void ret 特点 list接口 选择 基于 安全
原文地址:https://www.cnblogs.com/binhuang01/p/11517111.html