Java学习笔记——集合(List)

时间:2021-08-18 15:36:46

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 ListlistIterator():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这样效率高。