1 List集合
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。
List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引,例如第一次添加的元素索引为0,第二次添加的元素索引为1….
1.1 List接口和ListIterator接口
List作为Collection接口的子接口,当然可以使用Collection接口里的全部方法。而且由于List是有序集合,因此List集合里增加了一些根据索引来操作集合元素的方法。
- Void add(int index,Object element):将元素element插入到List集合的index处。
- Boolean addAll( int index,Collection c ):将集合c所包含的所有元素都插入到List集合的index处。
- Object get(int index):返回集合index索引处的元素
- Int indexOf(Object o):返回对象o在List集合中第一次出现的位置索引
- Int lastIndexOf(Object o):返回对象o在List集合中最后一次出现的位置索引
- Object remove(int index):删除并返回index索引处的元素。
- Object set(int index ,Object element):将index索引处的元素替换成element对象,返回新元素
- List subList(int fromIndex,int toIndex):返回从索引fromIndex包含到索引toIndex不包含处所有集合元素组成的子集合。
所有的List实现类都可以调用这些方法来操作集合元素。与Set集合相比,List增加了根据索引来插入、替换和删除集合元素的方法。
List books = new ArrayList(); books.add("轻量级Java EE企业级应用实战"); books.add("疯狂java讲义"); books.add("疯狂Android讲义"); System.out.println( books );
books.add(1,"疯狂Ajax讲义");
for(int i=0;i<books.size();i++){ System.out.println( books.get(i) ); }
books.remove(2);
System.out.println( books );
System.out.println(books.indexOf("疯狂Ajax讲义")); books.set(1, "疯狂Java讲义"); System.out.println(books);
System.out.println( books.subList(1, 2) ); |
List集合判断两个对象相等只要通过equals()方法比较返回true即可。
1.2 ArrayList和Vector实现类
ArrayList和Vector作为List类的两个典型实现,完全支持前面介绍的List接口的全部功能。
ArrayList和Vector类都似乎基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的、允许再分配的Object[]数组。
ArrayList和Vector对象使用initialCapacity参数来设置该数组的长度,当向ArrayList或Vector中添加元素超过了该数组的长度时,它们的initalCapacity会自动增加。
1.3 固定长度的List
操作数组的工具类:Arrays,该工具类里提供了asList(Object.. a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合,这个List集合既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例。
Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。
List fixedList = Arrays.asList("疯狂java","疯狂Javaee"); System.out.println(fixedList.getClass()); for(int i=0;i<fixedList.size();i++){ System.out.println( fixedList.get(i) ); } //试图增加、删除元素都会引发java.lang.UnsupportedOperationException 异常 fixedList.add("jkasdjfklsad"); fixedList.remove("疯狂java"); |
1.4 Queue集合
Queue集合模拟队列这种数据结构,队列通常是指 先进先出 的容器。
队列的头部保存在队列中存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。新元素插入到队列的尾部,访问元素操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
Queue接口中定义了如下几个方法:
- boolean add(E e):将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
- E element():获取,但是不移除此队列的头。
- boolean offer(E e):将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于
add(E)
,后者可能无法插入元素,而只是抛出一个异常。 - E peek():获取但不移除此队列的头;如果此队列为空,则返回 null。
- E poll():获取并移除此队列的头,如果此队列为空,则返回 null。
- E remove():获取并移除此队列的头。
Queue接口有一个PriorityQueue实现类。除此之外,Queue还有一个Deque接口,Deque代表一个双端队列,双端队列可以同时从两端添加,删除元素,因此Deque的实现类即可当成队列使用,也可当成栈使用。Java为Deque提供了ArrayDeque和LinkedList两个实现类。
1.4.1 PriorityQueue实现类
1.4.2 Deque接口与ArrayDeque实现类
1.4.3 LinkedList实现类