List接口
List集合特点:有序可重复
1、 实现List接口的集合类中的元素是有序的,且允许重复。
2、 List集合中的元素都对应一个整数型的序号记载其在集合中的位置(每个元素都有索引),可以根据序号存取集合中的元素。
3、 List集合不仅支持Iterator还支持List集合专用迭代器ListIterator(双向迭代器)
相比Collection新增方法
List接口比Collection接口中新增的几个实用方法:
1、 public Object get(int index) 返回列表中的指定位置的的元素
2、 public Object add(int index, Object element); 在列表的指定位置插入指定元素.将当前处于该位置的元素(如果有的话)和所有后续元素向右移动
3、 public Object set(int index, Object new) ; 用指定元素替换列表中指定位置的元素
4、 public Object remove(int index) 移除列表中指定位置的元素
5、 public ListIterator listIterator() 返回此列表元素的列表迭代器(List专有)
注意:list集合中的元素的索引与数组中元素的索引一样,均是从0开始。
常用实现类
ArrayList
ArrayList是使用数组结构实现的List集合
优点:
1、 对于使用索引取出元素有较好的效率 //随机读取效率非常高
2、 可以使用索引来快速定位对象
缺点:删除和添加效率极低
ListDemo.java
public class ListDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
List<String> temp = new ArrayList<>();
list.add("小明");// 继承自collection的方法
list.add(0, "老王");
temp.add("aa");
temp.add("bb");
list.addAll(temp);
temp.add("cc");
// list.removeAll(temp);// 移除交集
list.retainAll(temp);// 保留交集
// list.set(1, "小绿");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
Demo2.java
public class Demo2 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 双向迭代器
// list.listIterator(1);// 设置迭代器初始位置
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
listIterator.add("rr");// 添加到下一个元素之前
System.out.println(listIterator.next());
}
while (listIterator.hasPrevious()) { // 判断前面有没有元素
System.out.println(listIterator.previous());
}
}
}
Demo3.java
public class Demo3 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
// 对list来说,一般用for循环遍历
for (int i = 0, size = list.size(); i < size; i++) {
System.out.println(list.get(i));
}
// for each
for (String string : list) {
System.out.println(string);
}
String[] arr = new String[list.size()];
String[] arrs = list.toArray(arr);
for (String s : arrs) {
System.out.println(s);
}
}
}
LinkedList
LinkedList是使用双向链表实现的集合。该类也实现了Deque双向队列接口。Deque定义了很多操作双向队列的方法。
Vector
在List 接口中还有一个子类:Vector。Vector类从整个 Java 的集合发展历史来看,Vector算是一个元老级的类,在 JDK1.0 的时候就已经存在此类。但是到了Java2(JDK1.2)之后重点强调了集合框架的概念,所以先后定义了很多的新接口(如:List 等)。但是考虑到一大部分的人已经习惯了使用 Vector类,因此设计者就让 Vector 类多实现了一个 List接口,这样才将其保留下来。但是因为其是 List 接口的子类,所以 Vector 类的使用与之前的并没有太大的区别。但是Vector内部有一些比较老的方法名比较长的方法。
Stack
Vector提供一个Stack子类,它用于模拟了“栈”这种数据结构,“栈”通常是指“后进先出”(LIFO)
主要提供了三个方法:
pop
push
peak
StackDemo.java
public class StackDemo {
public static void main(String[] args) {
Stack<String> stack = new Stack<String>();
// 入栈
stack.push("q");
stack.push("w");
stack.push("e");
stack.push("r");
stack.push("t");
stack.push("y");
for (String s : stack) {
System.out.println(s);
}
// 出栈
String s = stack.pop();
System.out.println(s);
for (String ss : stack) {
System.out.println(ss);
}
// peek
String peek = stack.peek();// 查看栈顶的元素
System.out.println(peek);
}
}