看到这个标题,同学们应该知道,博主发的这篇博客讲的什么(目前属于新手小白,如有错误的或者漏失的,还请各位读者大大补充呦)
首先我们先说说这两者的各自特点吧
一.动态数组的特点
动态数组看名称我们也知道它属于数组的,所以数组的特点,他基本也都有。比如连续空间存储,单个存储空间大小不可更改,通过索引能够直接查找元素等,除此之外,他还有它本身的特性,顾名思义就是他的动态性,能够根据要存储元素的不同,自动扩大数组的存储容量。
下面是具体的特性。
1.连续空间存储(容易查找元素,访问元素速度快):连续空间存储是一种数据存储方式,它将信息以连续的方式存储在物理介质上,确保数据在存储空间中的物理位置是相邻的。
2.单个元素存储空间固定。
3.能够通过索引直接查找元素。
4.动态性:自动调整数组的大小。(区别于一般数组)
缺点:
1.要求存储空间的连续性。(不能有效利用碎片内存空间和不适合存储超大量的元素)
2.扩容数组时,计算机花费的代价较大。(复制原来数组的元素)
3.元素的插入或者删除不方便。(需要移动大量的元素)
动态数组添加元素时的代码如下
public void add(int data){
//判断是否需要库容
if(size == arr.length){
//扩容数组
int[] nArr = new int[arr.length*2];
//复制原数组数据到新数组中
for(int i=0;i<arr.length;i++){
nArr[i] = arr[i];
}
//更新对象头
arr = nArr;
}
arr[size] = data;
size++;
}
//添加到指定位置
public void add(int index,int data) {
if (size == arr.length) {
int[] narr = new int[2 * arr.length];
for (int i = 0; i < index; i++) {
narr[i] = arr[i];
}
narr[index] = data;
for (int i = index + 1; i < arr.length; i++) {
narr[i] = arr[i-1];
}
arr=narr;
size++;
return;
}
for(int i=size-1;i>=index;i--) {
arr[i+1]=arr[i];
}
arr[index]=data;
size++;
return;
}
二.链表的特点
链表是数据结构这门课程的,他是一种与数组同等地位的基本数据结构。链表作为一种数据结构,他的特性也非常的明显,那就是他的插入和删除更加的方便,他只用创建一个新的节点,用来存储待操作的元素,然后修改相邻元素或者新节点的指针即可,不需要移动大量的元素。(博主刚学习链表时,用惯了数组的连续空间,不适应这种离散的存储呢,全都是bug,哎,说多了都是泪)
特点:
1.离散型的存储,不需要连续的存储空间。(有效的增加内存的利用率)
2.存储空间具有动态性。(不需要事先分配)
3.元素的插入和删除花费的代价小。(创建一个新的节点,修改指针即可)
缺点:
1.查找元素麻烦。(需要从头结点开始一个一个往后遍历)
2.操作相对于数组更加的困难。
链表的插入与删除的代码如下:
//末尾添加
public void add(E data){
Node mid=new Node(data);//创建一个新的节点
Node head=root.next;//头指针
if(head==null){ //判断头节点是否为空
root.next=mid;
last=mid; /尾指针移动到当前节点
}else{
last.next=mid;
last=mid;
}
size++;//链表长度加1
}
//通过索引中间添加,索引从0开始
public void add(int index,E data){
Node mid=new Node(data);
Node head=root.next;
if((head==null&&index!=0)||(index<0||index>size())){
System.out.println("添加错误")
}else{
Node p=root.next;
for(int i=0;i<index-1;i++){
p=p.next;
}
mid.next=p.next;
p.next=mid;
size++;
}
}
//通过位置删除
public int remove(int index){
Node p=root;
for(int i=0;i<index;i++){
p=p.next;
}
p.next=p.next.next;
size--;
return 0;
}
//通过元素值删除
public boolean removes(Object data){
Node p=root;
while(p.next.data!=data){
p=p.next;
}
p.next=p.next.next;
size--;
return true;
}
两者区别如下:(元素数据类型都为相同的基本类型如int,double等)
| 动态数组 | 链表 | |
| 内存空间的连续性 | 需要 | 不需要 |
| 自动扩容 | 有 | 有 |
| 单个元素存储空间 | 不可更改 | 不可更改 |
| 元素的插入和删除 | 不方便 | 方便 |
| 元素的查找 | 方便 | 不方便 |
| 额外空间 | 有时会保留空余空间 | 需要一个额外的新节点 |
550





