目录
4.Vector、ArrayList和LinkedList集合的区别:
1.Vector:
(1)动态数组:可以在运行时改变大小,并且能够像数组一样通过索引直接访问元素。
(2)随机访问:由于 vector
基于数组,所以它支持常数时间的随机访问。
(3)在尾部添加和删除元素:在 vector
的尾部添加和删除元素的效率很高,只涉及到指针的移动。
(4)在中间位置添加或删除元素:在中间位置添加或删除元素会导致指针移动,这是一个更为昂贵的操作,因为它可能涉及到后续元素的复制。
(5)容器大小和容器容量:vector
有一个容器大小的概念,它表示当前容器中元素的数量。还有一个容器容量的概念,它表示在不需要重新分配内存的情况下可以容纳的元素数量。
(6)自动管理内存:vector
会自动处理内存分配和释放,无需手动管理。
示范代码如下:
#include <iostream>
#include <vector>
int main() {
// 创建一个 int 类型的 vector
std::vector<int> v;
// 添加元素
v.push_back(10);
v.push_back(20);
v.push_back(30);
// 访问元素
for (size_t i = 0; i < v.size(); ++i) {
std::cout << v[i] << " ";
}
std::cout << std::endl;
// 在中间位置插入元素
v.insert(v.begin() + 1, 40);
// 输出容器大小和容器容量
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl;
return 0;
}
2.ArrayList:
(1)它允许在添加时自动增长容量(以初始容量10,乘以扩容因子1.5的比例扩容)。
(2)它允许null元素。
(3)它是非同步的,如果多个线程同时访问ArrayList实例,并且至少有一个线程修改了列表,则必须进行外部同步。
(4)当删除集合中的一个元素时,这之后的所有元素会向前补齐。
(5)它实现了RandomAccess接口,表示ArrayList支持快速随机访问。
(6)它实现了Cloneable接口,表示ArrayList支持克隆。
(7)它实现了Serializable接口,表示ArrayList支持序列化。
ArrayList的展示代码:
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
// 创建一个ArrayList
List<String> list = new ArrayList<>();
// 添加元素
list.add("Element1");
list.add("Element2");
list.add("Element3");
// 遍历ArrayList
for (String element : list) {
System.out.println(element);
}
// 删除元素
list.remove("Element2");
// 清空ArrayList
list.clear();
}
}
3.LinkedList:
(1)它实现了List接口,允许有重复元素。
(2)它不是线程安全的,如果多个线程同时访问链表,则必须手动提供外部同步。
(3)它允许null元素。
(4)它的元素是有序的,可以保存重复元素。
(5)它的实现是通过节点之间的引用来实现的,每个节点都包含三个部分:元素的值,前一个节点的引用和下一个节点的引用。
展示代码如下:
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
// 添加元素
linkedList.add("A");
linkedList.add("B");
linkedList.addFirst("C"); // 在头部添加元素
linkedList.addLast("D"); // 在尾部添加元素
// 遍历元素
for (String element : linkedList) {
System.out.println(element);
}
// 移除元素
linkedList.removeFirst(); // 移除头部元素
linkedList.removeLast(); // 移除尾部元素
// 再次遍历元素
for (String element : linkedList) {
System.out.println(element);
}
}
}
4.Vector、ArrayList和LinkedList集合的区别:
(1)Vector:
由于自身动态数组的特点,它的改查的处理速度相对于其他两个集合来说是比较慢的,但是在做尾部添加和删除元素是效率很高,因为只涉及指针移动。
(2)ArrayList:
ArrayList由于有元素下标,所以在做查询操作时会比LinkedList的速度快,但是它做增删改操作时的速度由于元素下标需要向前或向后推移的因素,要比ArrayList集合慢。
(3)LinkedList:
LinkedList集合由于链式结构的特定,他的增删改的速度要快于其他两个集合,因为它没有下标且由于链式结构在添加,删除,修改元素时只需要断开特定链节点两端的元素联系,且它没有下标,再做操作即可,不需要像ArrayList集合一样,还要处理下标的问题;但因为没有下标的原因,在做查询操作时的处理速度会比ArrayList集合的处理速度慢。