目录
一、List相关概念
List接口也是一个顶层接口,继承了Collection接口;
List接口常用的实现类:ArrayList,Vector ,LinkedList;
List集合的特点:
- 集合中的元素可以重复;
- 集合的元素是有序的,各元素插入的顺序就是各元素的顺序;
- 集合的元素可通过索引来访问。
二、ArrayList
ArrayList是一个动态数组,也是常用的集合。
(一)ArrayList特点
优点:
- 支持自动改变大小的功能
- 可以灵活的插入元素
- 可以灵活的删除元素
缺点:
- 在速度上比一般的数组慢
(二)ArrayList相关方法
(1)添加元素
// 初始化
ArrayList<String> language = new ArrayList<String>();
ArrayList<String> cs = new ArrayList<String>();
// 添加元素
System.out.println("------add():将对象添加到结尾------");
language.add("Java");
language.add("Python");
System.out.println(language);
System.out.println("------add(int index, Eelement):将元素插入ArrayList的指定位置------");
language.add(1, "C++" );
System.out.println(language);
System.out.println("------addAll():将集合中所有的元素添加到另一个集合中------");
cs.addAll(language);
System.out.println(cs);
------add():将对象添加到结尾------
[Java, Python]
------add(int index, Eelement):将元素插入ArrayList的指定位置------
[Java, C++, Python]
------addAll():将集合中所有的元素添加到另一个集合中------
[Java, C++, Python]
(2)删除元素
// 删除元素
System.out.println("------remove(Object o):删除指定元素------");
cs.remove("C++");
System.out.println(cs);
System.out.println("------remove(int index):删除指定位置元素------");
cs.remove(1);
System.out.println(cs);
------remove(Object o):删除指定元素------
[Java, Python]
------remove(int index):删除指定位置元素------
[Java]
(3)访问元素
// 访问元素
System.out.println("------get()------");
System.out.println(language.get(0));
System.out.println(language.get(1));
System.out.println("------indexOf()------");
System.out.println(language.indexOf("Java"));
System.out.println(language.indexOf("Python"));
------get()------
Java
Python
------indexOf()------
0
1
(4)修改元素
// 修改元素
language.set(0, "I love Java!");
System.out.println("------set()------");
System.out.println(language);
------set()------
[I love Java!, Python]
(5)List转换为数组
// List转换为数组
String [] strArr = language.toArray(new String[] {});
System.out.println("------toArray():List转换为数组------");
System.out.println(Arrays.toString(strArr));
------toArray():List转换为数组------
[I love Java!, C++, Python]
(6)数组转换为List
// 数组转换为List
List<String> list = Arrays.asList(strArr);
System.out.println("------asList():数组转换为List------");
System.out.println(list);
------asList():数组转换为List------
[I love Java!, C++, Python]
(7)List排序
// 排序
List<Integer> nums = new ArrayList<Integer>();
Random random = new Random(1);
for (int i = 0; i < 10; i++){
nums.add(random.nextInt(10));
}
System.out.println("------未排序前------");
System.out.println(nums);
Collections.sort(nums);
System.out.println("------排序后------");
System.out.println(nums);
------未排序前------
[5, 8, 7, 3, 4, 4, 4, 6, 8, 8]
------排序后------
[3, 4, 4, 4, 5, 6, 7, 8, 8, 8]
三、Vector
Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:
- Vector 是同步访问的。
- Vector 包含了许多传统的方法,这些方法不属于集合框架。
- 扩容:ArrayList扩容后的数组长度增加50%,Vector扩容后的数组增加一倍。
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。
下面的程序说明这个集合所支持的几种方法
import java.util.EmptyStackException;
import java.util.Stack;
public class Day25 {
static void showPush(Stack<Integer> st, int a) {
st.push(a);
System.out.println("push(" + a + ")");
System.out.println("stack: " + st);
}
static void showPop(Stack<Integer> st) {
System.out.print("pop -> ");
Integer a = st.pop();
System.out.println(a);
System.out.println("stack: " + st);
}
public static void main(String args[]) {
Stack<Integer> st = new Stack<Integer>();
System.out.println("stack: " + st);
showPush(st, 42);
showPush(st, 66);
showPush(st, 99);
showPop(st);
showPop(st);
showPop(st);
try {
showPop(st);
} catch (EmptyStackException e) {
System.out.println("empty stack");
}
}
}
stack: []
push(42)
stack: [42]
push(66)
stack: [42, 66]
push(99)
stack: [42, 66, 99]
pop -> 99
stack: [42, 66]
pop -> 66
stack: [42]
pop -> 42
stack: []
pop -> empty stack
四、LinkedList
(一)LinkedList特点
LinkedList是一个双向链表,允许存储任何元素(包括null),其主要特性如下:
- LinkedList所有的操作都是双向性的。
- LinkedList不是线性安全的。
- LinkedList 继承了 AbstractSequentialList 类。
- LinkedList 实现了 Queue 接口,可作为队列使用。
- LinkedList 实现了 List 接口,可进行列表的相关操作。
- LinkedList 实现了 Deque 接口,可作为队列使用。
- LinkedList 实现了 Cloneable 接口,可实现克隆。
- LinkedList 实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输。
(二)LinkedList相关方法
(1)表的创建
// 链表的创建
LinkedList<String> language = new LinkedList<String>();
LinkedList<String> cs = new LinkedList<String>();
(2)添加
// 添加元素
System.out.println("------add(E e):末尾添加元素------");
language.add("C");
language.add("C++");
language.add("Java");
System.out.println(language);
System.out.println("------add(int index, E e):指定位置添加元素------");
language.add(2, "Python");
System.out.println(language);
System.out.println("------addAll(Collection c):将一个集合所有的元素添加到链表后------");
cs.addAll(language);
System.out.println(cs);
System.out.println("------addFirst(E e):头部添加元素------");
language.addFirst("Head");
System.out.println(language);
System.out.println("------addLast(E e):尾部添加元素------");
language.addLast("Tail");
System.out.println(language);
------add(E e):末尾添加元素------
[C, C++, Java]
------add(int index, E e):指定位置添加元素------
[C, C++, Python, Java]
------addAll(Collection c):将一个集合所有的元素添加到链表后------
[C, C++, Python, Java]
------addFirst(E e):头部添加元素------
[Head, C, C++, Python, Java]
------addLast(E e):尾部添加元素------
[Head, C, C++, Python, Java, Tail]
(3)删除
// 删除元素
System.out.println("------remove():删除并返回第一个元素------");
System.out.println("删除之前: " + cs);
System.out.println("删除返回的第一个元素: " + cs.remove());
System.out.println("删除之后: " + cs);
System.out.println("------removeFirst():删除并返回第一个元素------");
System.out.println("删除之前: " + cs);
System.out.println("删除返回的第一个元素: " + cs.removeFirst());
System.out.println("删除之后: " + cs);
System.out.println("------removeLast():删除并返回最后一个元素------");
System.out.println("删除之前: " + cs);
System.out.println("删除返回的最后一个元素: " + cs.removeLast());
System.out.println("删除之后: " + cs);
------remove():删除并返回第一个元素------
删除之前: [C, C++, Python, Java]
删除返回的第一个元素: C
删除之后: [C++, Python, Java]
------removeFirst():删除并返回第一个元素------
删除之前: [C++, Python, Java]
删除返回的第一个元素: C++
删除之后: [Python, Java]
------removeLast():删除并返回最后一个元素------
删除之前: [Python, Java]
删除返回的最后一个元素: Java
删除之后: [Python]
(4)访问
// 访问元素
System.out.println("------getFirst():返回第一个元素------");
System.out.println("返回第一个元素: " + language.getFirst());
System.out.println("------getLast():返回最后一个元素------");
System.out.println("返回最后一个元素: " + language.getLast());
System.out.println("------get(int index):返回指定位置的元素------");
System.out.println("返回指定位置的元素: " + language.get(2));
------getFirst():返回第一个元素------
返回第一个元素: Head
------getLast():返回最后一个元素------
返回最后一个元素: Tail
------get(int index):返回指定位置的元素------
返回指定位置的元素: C++
(5)修改
// 修改元素
System.out.println("------set(int index, E e):修改指定位置元素值------");
language.set(0, "aa");
System.out.println(language);
------set(int index, E e):修改指定位置元素值------
[aa, C, C++, Python, Java, Tail]
(6)迭代
// 元素的迭代
System.out.println("------元素的迭代------");
for (int i = 0; i < language.size(); i++){
System.out.println(language.get(i));
}
// for-each实现迭代
for (String l: language){
System.out.println(l);
}
------元素的迭代------
aa
C
C++
Python
Java
Tail
aa
C
C++
Python
Java
Tail
(7)LinkedList转换为数组
// LinkedList转换为数组
String [] strArr = language.toArray(new String[] {});
System.out.println("------toArray():转换为数组------");
System.out.println(Arrays.toString(strArr));
------toArray():转换为数组------
[aa, C, C++, Python, Java, Tail]
五、代码
1、ArrayList
import java.util.*;
public class Day24 {
public static void main(String[] args){
// 初始化
ArrayList<String> language = new ArrayList<String>();
ArrayList<String> cs = new ArrayList<String>();
// 添加元素
System.out.println("------add():将对象添加到结尾------");
language.add("Java");
language.add("Python");
System.out.println(language);
System.out.println("------add(int index, Eelement):将元素插入ArrayList的指定位置------");
language.add(1, "C++" );
System.out.println(language);
System.out.println("------addAll():将集合中所有的元素添加到另一个集合中------");
cs.addAll(language);
System.out.println(cs);
// 删除元素
System.out.println("------remove(Object o):删除指定元素------");
cs.remove("C++");
System.out.println(cs);
System.out.println("------remove(int index):删除指定位置元素------");
cs.remove(1);
System.out.println(cs);
// 访问元素
System.out.println("------get()------");
System.out.println(language.get(0));
System.out.println(language.get(1));
System.out.println("------indexOf()------");
System.out.println(language.indexOf("Java"));
System.out.println(language.indexOf("Python"));
// 修改元素
language.set(0, "I love Java!");
System.out.println("------set()------");
System.out.println(language);
// List转换为数组
String [] strArr = language.toArray(new String[] {});
System.out.println("------toArray():List转换为数组------");
System.out.println(Arrays.toString(strArr));
// 数组转换为List
List<String> list = Arrays.asList(strArr);
System.out.println("------asList():数组转换为List------");
System.out.println(list);
// 排序
List<Integer> nums = new ArrayList<Integer>();
Random random = new Random(1);
for (int i = 0; i < 10; i++){
nums.add(random.nextInt(10));
}
System.out.println("------未排序前------");
System.out.println(nums);
Collections.sort(nums);
System.out.println("------排序后------");
System.out.println(nums);
}
}
2、Vector
import java.util.EmptyStackException;
import java.util.Stack;
public class Day25 {
static void showPush(Stack<Integer> st, int a) {
st.push(a);
System.out.println("push(" + a + ")");
System.out.println("stack: " + st);
}
static void showPop(Stack<Integer> st) {
System.out.print("pop -> ");
Integer a = st.pop();
System.out.println(a);
System.out.println("stack: " + st);
}
public static void main(String args[]) {
Stack<Integer> st = new Stack<Integer>();
System.out.println("stack: " + st);
showPush(st, 42);
showPush(st, 66);
showPush(st, 99);
showPop(st);
showPop(st);
showPop(st);
try {
showPop(st);
} catch (EmptyStackException e) {
System.out.println("empty stack");
}
}
}
3、LinkedList
import java.util.Arrays;
import java.util.LinkedList;
public class Day26 {
public static void main(String[] args){
// 链表的创建
LinkedList<String> language = new LinkedList<String>();
LinkedList<String> cs = new LinkedList<String>();
// 添加元素
System.out.println("------add(E e):末尾添加元素------");
language.add("C");
language.add("C++");
language.add("Java");
System.out.println(language);
System.out.println("------add(int index, E e):指定位置添加元素------");
language.add(2, "Python");
System.out.println(language);
System.out.println("------addAll(Collection c):将一个集合所有的元素添加到链表后------");
cs.addAll(language);
System.out.println(cs);
System.out.println("------addFirst(E e):头部添加元素------");
language.addFirst("Head");
System.out.println(language);
System.out.println("------addLast(E e):尾部添加元素------");
language.addLast("Tail");
System.out.println(language);
// 删除元素
System.out.println("------remove():删除并返回第一个元素------");
System.out.println("删除之前: " + cs);
System.out.println("删除返回的第一个元素: " + cs.remove());
System.out.println("删除之后: " + cs);
System.out.println("------removeFirst():删除并返回第一个元素------");
System.out.println("删除之前: " + cs);
System.out.println("删除返回的第一个元素: " + cs.removeFirst());
System.out.println("删除之后: " + cs);
System.out.println("------removeLast():删除并返回最后一个元素------");
System.out.println("删除之前: " + cs);
System.out.println("删除返回的最后一个元素: " + cs.removeLast());
System.out.println("删除之后: " + cs);
// 访问元素
System.out.println("------getFirst():返回第一个元素------");
System.out.println("返回第一个元素: " + language.getFirst());
System.out.println("------getLast():返回最后一个元素------");
System.out.println("返回最后一个元素: " + language.getLast());
System.out.println("------get(int index):返回指定位置的元素------");
System.out.println("返回指定位置的元素: " + language.get(2));
// 修改元素
System.out.println("------set(int index, E e):修改指定位置元素值------");
language.set(0, "aa");
System.out.println(language);
// 元素的迭代
System.out.println("------元素的迭代------");
for (int i = 0; i < language.size(); i++){
System.out.println(language.get(i));
}
// for-each实现迭代
for (String l: language){
System.out.println(l);
}
// LinkedList转换为数组
String [] strArr = language.toArray(new String[] {});
System.out.println("------toArray():转换为数组------");
System.out.println(Arrays.toString(strArr));
}
}