Java集合学习笔记
(1)List接口
List接口定义:List集合是一个有序集合,集合中的每一个元素都有对应的索引(索引从零开始),
且集合中的元素可以重复。
List接口中常用的方法:
01 importjava.util.*;
02
03 publicclass List
04 {
05 publicstatic void main(String[]args)
06 {
07 ArrayListl = new ArrayList();
08 ArrayListc = new ArrayList();
09
10 //①boolean add(E e)方法是将对象e添加到集合c的末尾。
11 c.add(newString("Jsp"));
12 c.add(newString("ASP"));
13
14 l.add(newString("C"));
15 l.add(newString("C#"));
16 l.add(newString("Java"));
17 l.add(newString("Ruby"));
18
19 //List索引是从0开始的,应该获得“C”。
20 //②E get(int index)方法是获得集合中索引为index的元素。
21 System.out.println("--------------- get() ------------------");
22 System.out.println(c.get(0));
23
24 //③boolean addAll(int index, Collection c)方法将集合c的所有元素添加到集合l的开始处。
25 //如果集合c中只有一个元素,则将集合c中的元素添加到集合l索引为0处,集合l中的元素索引依次向后错
26 //一位。如果集合c中有多个元素,则将集合c中的元素一次添加到l索引为0,1,2……处,
27 //集合l中的元素索引依次向后错相应的位数。
28 System.out.println("--------------- addAll() ----------------");
29 l.addAll(0,c);
30 System.out.println(l);
31
32 //④int indexOf(Object o)方法是获得对象o在集合l中的索引。
33 System.out.println("--------------- indexOf() ---------------");
34 System.out.println(l.indexOf("JSP"));
35
36 //⑤E remove(int index)方法是删除索引为index的元素。
37 System.out.println("--------------- remove() ----------------");
38 l.remove(0);
39 System.out.println(l);
40
41 //⑥E set(int index, E element)方法是将集合中索引为index的的元素换成element元素。
42 System.out.println("--------------- set() -------------------");
43 l.set(0,new String("ASP.NET"));
44 System.out.println(l);
45
46 //⑦List<E> subList(int fromIndex, int toIndex)方法是从集合中获取一个真子集
47 //包括索引为fromIndex到toIndex-1,也就是不包括索引为toIndex的集合。
48 System.out.println("---------- addAll(), subList() ----------");
49 ArrayListl2 = new ArrayList();
50 l2.addAll(l.subList(1,2));
51 System.out.println(l2);
52 }
53 }
List接口中remove()方法:List接口中的remove(Object o)方法是通过对象o调用equals()方法来
与集合中的元素比较来判断应该删除的元素的。
01 import java.util.*;
02
03 class C
04 {
05publicboolean equals(Object obj)
06{
07 return true;
08}
09 }
10
11 public class List2
12 {
13publicstatic void main(Stringargs[])
14{
15 ArrayLista = new ArrayList();
16
17 a.add(1);
18 a.add(2);
19 a.add(3);
20
21 a.remove(newC());
22 System.out.println(a);
23}
24 }
25
26 List与listIterator():listIterator()方法是Iterator()的子类。listIterator()方法实现向前迭代与向后迭代
27 两个方法。
28
29 import java.util.*;
30
31 public class List3
32 {
33publicstatic void main(Stringargs[])
34{
35 ArrayLista = new ArrayList();
36
37 a.add(newString("1"));
38 a.add(newString("2"));
39 a.add(newString("3"));
40
41 ListIteratori = a.listIterator();
42
43 while(i.hasNext())
44 {
45 Stringnumber = (String)i.next();
46 System.out.println(number);
47
48 //void remove()方法是将刚刚迭代出来的变量从集合中删除出去,是Iterator接口中的方法。
49 i.remove();
50 }
51
52 //void add()方法是向集合中添加新的元素,是ListIterator接口中的方法。
53 i.add(newString("4"));
54
55 while(i.hasPrevious())
56 {
57 Stringnumber = (String)i.previous();
58 System.out.println(number);
59 }
60}
61 }
(2)List接口的实现类——ArrayList
ArrayList类:ArrayList类是基于数组实现的List类,完全支持List接口的所有功能。
ArrayList实际上维护着一个Object[]数组。每个ArrayList对像有一个capacity属性,这个属性
代表了ArrayList对象所维护的Object[]的长度。当向ArrayList对象添加元素到一定程度时,capacity
属性会自动增加。
new ArrayList(int initialCapacity) 该构造方法可以再生成ArrayList对象时一次性确定该对象所维护的Object[]
的长度。
void trimToSize() 该方法是让Object[]数组的长度等于实际上ArrayList对象所存放的元素的长度。
void ensureCapacity(int minCapacity) 该方法是生成ArrayList对象后再确定Object[]数组的长度。
以上关于capacity的方法都是在提高程序性能方面,一般的小程序就不用计较了。
(3)Array.ArrayList(固定长度的List)
Arrays.asList(T... a) 该方法会返回一个List<T>的集合,该集合是一个元素数目固定的集合,
不能添加也不能删除其中的元素。
(4)LinkedList类
LinkedList类:linkedList对象的功能的功能十分强大,因为实现了Deque接口,List接口所以
分别能实现“栈”,“双向队列”,“List”这三种功能。
栈: Object pop() 该方法实现了出栈。出栈之后就会被删除。
void push() 该方法实现了入栈。
双向队列: (其实就是两个栈尾尾相接)
插入:
boolean offerFirst() 将指定元素插入到双向队列的开头。
boolean offerLast() 将指定元素插入到双向队列的最后。
void addFirst() 将指定元素插入到双向队列的开头。
void addLast() 将指定元素插入到双向队列的最后。
获取:
Object peekFirst() 获取但不删除第一个元素,若队列为空则 return null。
Object peekLast() 获取但不删除最后一个元素,若队列为空则 return null。
Object pollFirst() 获取删除第一个元素,若队列为空则 return null。
Object pollLast() 获取删除最后一个元素,若队列为空则 return null。
import java.util.*;
public class List5
{
public static void main(String argsp[])
{
LinkedList list = new LinkedList();
/*
void push(Object o)
Object pop()
通过这两个方法的操作实现了用LinkedList对象模拟书记结构“栈”。即先进后出。
*/
list.push(new String("1"));
list.push(new String("2"));
list.push(new String("3"));
//注意此处的pop()方法是将元素出栈,并且删除该元素。
System.out.println(list.pop());
System.out.println(list.pop());
System.out.println(list.pop());
System.out.println(list);
System.out.println("--------------------------");
/*
所为双向队列是限定插入和删除都只能在线性表两端进行的线性表。
*/
list.addFirst(new String("0"));
list.addLast(new String("4"));
Iterator i = list.descendingIterator();
/*
Iterator descendingIterator()方法返回一个迭代器,没有hasPrevious()方法。
只有实现了listIterator接口才有那个方法,不过是反向迭代。
*/
while(i.hasNext())
{
String string = (String) i.next();
System.out.println(string);
}
}
}
(5)性能比较
①对于遍历集合,ArrayList应该使用随机访问(for + get)。对于LinkedList应该使用迭代器,这样效率比较高。
②如果需要经常执行插入,删除元素应该使用LinkedList这样效率高。