ArrayList:动态数组,使用的时候,只需要操作即可,内部已经实现扩容机制。
null
元素,且可以重复Vector和前面说的ArrayList
很是类似,这里说的也是1.8版本,它是一个队列,但是本质上底层也是数组实现的。同样继承AbstractList
,实现了List
,RandomAcess
,Cloneable
, java.io.Serializable
接口。具有以下特点:
RandomAcess
接口,这个接口主要是为List
提供快速访问的功能,也就是通过元素的索引,可以快速访问到。Cloneable
接口ArrayList
。LinkedList:链表结构,继承了AbstractSequentialList
,实现了List
,Queue
,Cloneable
,Serializable
,既可以当成列表使用,也可以当成队列,堆栈使用。主要特点有:
List list = Collections.synchronizedList(new LinkedList());
List
接口,可以对它进行队列操作Queue
接口,可以当成堆栈或者双向队列使用Serializable
,可以被序列化和反序列化 Java提供了许多集合类来处理和操作数据,其中ArrayList、LinkedList和Vector是常见的几种。这些集合类具有相似的功能,但在实现和性能方面存在一些区别。本文将详细介绍ArrayList、LinkedList和Vector的相同点和区别,并提供相应的源代码示例。
相同点:
区别:
1、ArrayList的基础使用
ArrayList是Java中的一个动态数组类,可以存储任意类型的数据,并且长度可以动态改变。下面是一个使用代码来深度讲解ArrayList集合的示例:
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
// 创建一个ArrayList对象
ArrayList<String> list = new ArrayList<>();
// 添加元素
list.add("Java");
list.add("Python");
list.add("C++");
// 获取元素
String firstElement = list.get(0);
System.out.println("第一个元素是:" + firstElement);
// 修改元素
list.set(2, "JavaScript");
System.out.println("修改后的元素列表:" + list);
// 删除元素
list.remove(1);
System.out.println("删除后的元素列表:" + list);
// 判断是否包含指定元素
boolean containsPython = list.contains("Python");
System.out.println("列表是否包含Python:" + containsPython);
// 获取元素的索引
int index = list.indexOf("Java");
System.out.println("Java的索引为:" + index);
// 获取列表的长度
int size = list.size();
System.out.println("列表的长度为:" + size);
// 遍历列表
for (int i = 0; i < list.size(); i++) {
String element = list.get(i);
System.out.println("第" + (i + 1) + "个元素是:" + element);
}
}
}
上面的代码演示了ArrayList集合的一些常用操作:
创建ArrayList对象:通过new ArrayList<>()
来创建一个ArrayList对象,可以在<>中指定存储的元素类型。
添加元素:使用add()
方法来将元素添加到ArrayList中,可以添加任意类型的元素。
获取元素:使用get()
方法来获取指定索引位置的元素。
修改元素:使用set()
方法来修改指定索引位置的元素。
删除元素:使用remove()
方法来删除指定索引位置的元素。
判断是否包含指定元素:使用contains()
方法来判断ArrayList是否包含指定元素。
获取元素的索引:使用indexOf()
方法来获取指定元素在ArrayList中的索引。
获取列表的长度:使用size()
方法来获取ArrayList的长度。
遍历列表:使用for
循环来遍历ArrayList中的元素。
上面的代码只是演示了ArrayList的一些基本操作,还有很多其他的方法可以操作ArrayList集合。使用ArrayList可以方便地对一组数据进行存储和操作,是Java中常用的集合类之一。
2、LinkedList的基础使用
LinkedList是Java中提供的一个双向链表实现的数据结构,它实现了List接口,能够存储任意类型的元素。和ArrayList相比,LinkedList在插入、删除元素时具有快速的性能,但是在访问和查找元素时相对较慢。
下面是LinkedList的基础使用:
LinkedList<String> linkedList = new LinkedList<>();
也可以使用带有Collection参数的构造函数,将一个集合中的元素加入到LinkedList中:
List<String> list = Arrays.asList("a", "b", "c");
LinkedList<String> linkedList = new LinkedList<>(list);
linkedList.add("d");
也可以使用addFirst或addLast方法在LinkedList的头部或尾部添加一个元素:
linkedList.addFirst("z");
linkedList.addLast("y");
String element = linkedList.get(0);
也可以使用getFirst或getLast方法获取LinkedList的头部或尾部元素:
String firstElement = linkedList.getFirst();
String lastElement = linkedList.getLast();
linkedList.remove(0);
也可以使用removeFirst或removeLast方法删除LinkedList的头部或尾部元素:
linkedList.removeFirst();
linkedList.removeLast();
linkedList.set(0, "new value");
for (String element : linkedList) {
System.out.println(element);
}
也可以使用迭代器遍历LinkedList中的元素:
Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
这些是LinkedList的基础使用方法,通过这些方法可以对LinkedList进行增删改查等操作。
注意:LinkedList不是线程安全的,如果在多线程环境下使用LinkedList,需要进行适当的同步处理。
3、Vector的基础使用
Vector集合是Java中用于存储一组对象的动态数组,它可以自动调整容量以适应存储的元素数量的变化。以下是使用代码深度讲解Vector集合的一些常见操作:
import java.util.Vector;
Vector<String> vector = new Vector<String>();
vector.add("元素1");
vector.add("元素2");
vector.add("元素3");
int size = vector.size();
System.out.println("Vector集合的大小: " + size);
String element = vector.get(0);
System.out.println("Vector集合中的第一个元素: " + element);
vector.remove(0);
boolean isEmpty = vector.isEmpty();
System.out.println("Vector集合是否为空: " + isEmpty);
for(String element : vector){
System.out.println(element);
}
vector.clear();
以上是Vector集合的基本操作,可以根据需求进行相应的调用和修改。需要注意的是,Vector集合是线程安全的,因此在多线程环境下使用Vector集合可以确保数据的一致性。
LinkedList
源码中一共定义了三个迭代器:
Itr
:实现了Iterator
接口,是AbstractList.Itr
的优化版本。ListItr
:继承了Itr
,实现了ListIterator
,是AbstractList.ListItr
优化版本。ArrayListSpliterator
:继承于Spliterator
,Java 8 新增的迭代器,基于索引,二分的,懒加载器。Vector
和ArrayList
基本差不多,都是定义了三个迭代器:
Itr
:实现接口Iterator
,有简单的功能:判断是否有下一个元素,获取下一个元素,删除,遍历剩下的元素ListItr
:继承Itr
,实现ListIterator
,在Itr
的基础上有了更加丰富的功能。VectorSpliterator
:可以分割的迭代器,主要是为了分割以适应并行处理。和ArrayList
里面的ArrayListSpliterator
类似。LinkedList
里面定义了三种迭代器,都是以内部类的方式实现,分别是:
ListItr
:列表的经典迭代器DescendingIterator
:倒序迭代器LLSpliterator
:可分割迭代器import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListIteratorDemo {
public static void main(String[] args) {
// 创建ArrayList集合
ArrayList<String> arrayList = new ArrayList<String>();
// 添加元素到ArrayList集合
arrayList.add("元素1");
arrayList.add("元素2");
arrayList.add("元素3");
// 使用迭代器遍历ArrayList集合
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
import java.util.LinkedList;
import java.util.Iterator;
public class LinkedListIteratorDemo {
public static void main(String[] args) {
// 创建LinkedList集合
LinkedList<String> linkedList = new LinkedList<String>();
// 添加元素到LinkedList集合
linkedList.add("元素1");
linkedList.add("元素2");
linkedList.add("元素3");
// 使用迭代器遍历LinkedList集合
Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
import java.util.Vector;
import java.util.Iterator;
public class VectorIteratorDemo {
public static void main(String[] args) {
// 创建Vector集合
Vector<String> vector = new Vector<String>();
// 添加元素到Vector集合
vector.add("元素1");
vector.add("元素2");
vector.add("元素3");
// 使用迭代器遍历Vector集合
Iterator<String> iterator = vector.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
}
}
以上示例代码展示了如何使用迭代器遍历ArrayList、LinkedList和Vector集合。通过调用集合的iterator()
方法获取迭代器对象,然后使用hasNext()
和next()
方法来遍历集合中的元素。