如图,是左边这部分

List:有序,可重复
Set:无序,不可重复
1 List接口
1.1 特点
1)它是一个元素存取有序的集合。
2)它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
3)集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
1.2常用方法

在指定位置添加元素add()
获取get(index)
删除remove()
替换set(index)
例:
import java.util.ArrayList;
import java.util.List;
public class ListTest1 {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
//在指定位置添加元素
list.add(1,"c");
System.out.println(list);
//遍历(通过下标获取)
for(int i=0;i<list.size();i++){
System.out.print(list.get(i)+" ");
}
System.out.println();
//删除指定位置的元素
String str=list.remove(1);
System.out.println("删除:");
System.out.println(str);
System.out.println(list);
//替换指定位置上的元素
list.set(1, "z");
System.out.println("替换:");
System.out.println(list);
}
}

1.3 Iterator并发修改异常
在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。
例:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorTest {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
Iterator<String> it=list.iterator(); //获取迭代器对象
//循环遍历
while(it.hasNext()){
String s=it.next();
//如果有元素"b",那么再添加一个元素
if(s.equals("b")){
list.add("d");
}
}
}
}

所以用迭代器和增强for时,在遍历时不能对元素进行操作。想操作只能用普通for。
2集合存储数据的结构
List接口下有很多个集合,它们存储元素所采用的结构方式是不同的,这样就导致了这些集合有它们各自的特点,供给我们在不同的环境下进行使用。
数据存储的常用结构有:堆栈、队列、数组、链表。
2.1堆栈
特点:
1)先进后出
2)栈的入口、出口的都是栈的顶端位置
3)压栈:就是存元素
4)弹栈:就是取元素
2.2队列
特点:
1)先进先出
2)队列的入口、出口各占一侧。
2.3数组结构
特点:
1)查找元素快:因为有索引
2)增删元素慢:因为长度不可变,需要创建新数组
2.4链表
多个节点之间,通过地址进行连接。
有数据域和指针域,指针域中存是的下一个数据的地址。
特点:
1)查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
2)增删元素快(如下图):
增加元素:只需要修改连接下个元素的地址即可。
删除元素:只需要修改连接下个元素的地址即可。

3 ArrayList集合数据存储结构
ArrayList集合数据存储的结构是数组结构。
由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。
许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
看需求,是查询多,还是增删多。
4 LinkedList集合
LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
4.1常用方法
1)添加
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
LinkedList<Integer> list=new LinkedList<Integer>();
list.add(1);
list.add(2);
list.addFirst(3);
list.addFirst(4);
list.addLast(5);
System.out.println(list);
}
}
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
LinkedList<Integer> list=new LinkedList<Integer>();
list.addLast(1);
list.addLast(2);
list.add(3);
list.addFirst(4);
list.addFirst(5);
System.out.println(list);
}
}

2)获取首尾
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
LinkedList<Integer> list=new LinkedList<Integer>();
list.addLast(1);
list.addLast(2);
list.add(3);
list.addFirst(4);
list.addFirst(5);
System.out.println(list);
System.out.println("第一个是"+list.getFirst());
System.out.println("最后一个是"+list.getLast());
}
}

3)删除首尾
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
LinkedList<Integer> list=new LinkedList<Integer>();
list.addLast(1);
list.addLast(2);
list.add(3);
list.addFirst(4);
list.addFirst(5);
System.out.println(list);
list.removeLast();
list.removeFirst();
System.out.println("删除后:");
System.out.println(list);
}
}

4)堆栈顺序存取
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
LinkedList<Integer> list=new LinkedList<Integer>();
list.push(1);
list.push(2);
list.push(3);
list.push(4);
System.out.println(list.pop());
System.out.println(list.pop());
System.out.println(list.pop());
System.out.println(list.pop());
}
}

5)上面例子中,pop()方法,如果集合中没有元素了,再pop,就会报异常

所以要加个判断 list.size()!=0,也可以用isEmpty()方法
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
LinkedList<Integer> list=new LinkedList<Integer>();
list.push(1);
list.push(2);
list.push(3);
list.push(4);
while(!list.isEmpty()){
System.out.println(list.pop());
}
}
}

isEmpty()是从Collection继承来的
4.2 LinkedList和ArrayList的区别
1)ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构。
2)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
3)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
5 Vector集合(过时,了解即可,和Iterator和ArrayList一样的)
Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。
Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。
Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。
5.1 Vector常用方法

对比ArrayList:
elementAt()就是ArrayList中的get()
elements() 就是Iterator中获取对象的iterator() 方法
5.2 Enumeration枚举常用方法

对比Iterator:
hasMoreElements() 就是hasNext()
nextElement() 就是next()
5.3 Vector和ArrayList对比
Vector是同步的,安全,慢
ArrayList不同步,不安全,快
原文:https://www.cnblogs.com/hzhjxx/p/10095430.html