如图,是左边这部分
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不同步,不安全,快