Java筆記 - List集合

集合Collection下面有兩大子體系,List和Set,他們都是Collection接口的子接口。
- List:是有序的collection,這裏的有序是指存入的順序(qwer順序存入,取出順序也是qwer),所以List接口和它的子類都有索引(角標)。並且List中元素可以重複。
- set:無序的collection,元素不能重複。

List常見方法
List繼承了Collection接口,所以Collection接口包含的方法List中都有,但是還有一些List特有的方法,這些方法有一個共性的特點就是可以操作角標。
1. 添加
void add(index, element):在列表的指定位置添加元素
boolean addAll(index, collection):在列表的指定位置添加Collection集合的所有元素。
2. 刪除
Object remove(int index):一處列表中指定位置的元素。
3. 修改
E set(int index, E element):用指定元素替換列表中指定位置的元素,返回以前在指定位置的元素
4. 獲取
Object get(int index):返回列表中指定位置的元素
int indexOf(Object o):返回列表中第一次出現指定元素的索引,如果此列表不包含指定元素,返回-1
int lastIndexOf(Object o):返回列表中最後一次出現指定元素的索引,如果不包含指定元素,返回-1
List subList(int fromIndex, int toIndex):返回fromIndex(包括)和toIndex(不包括)之間的視圖。

例:

//注意:List在java中的java.awt和java.util包中都有這個名字,注意不要導錯包
List li = new ArrayList();

li.add("abc1");
li.add("abc2");
li.add("abc3");
li.add("abc4");
System.out.println(li);
li.add(1, "abc5");
System.out.println(li);
System.out.println(li.remove(1));
System.out.println(li);
System.out.println(li.set(1, "abc6"));
System.out.println(li);
System.out.println("--------------------");
System.out.println(li.get(2));
System.out.println(li.indexOf("abc6"));
System.out.println(li.subList(1, 2));

輸出結果:
[abc1, abc2, abc3, abc4]
[abc1, abc5, abc2, abc3, abc4]
abc5
[abc1, abc2, abc3, abc4]
abc2
[abc1, abc6, abc3, abc4]


abc3
1
[abc6]

ListIterator迭代器
從Collection集合中繼承的迭代器Iterator

List li = new ArrayList();
li.add("abc1");
li.add("abc2");
li.add("abc3");
li.add("abc4");
Iterator it = li.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}

輸出結果:
abc1
abc2
abc3
abc4

List集合特有的列表迭代器:ListIterator

//需求:如果迭代到abc2,就添加一個abc9,否則就打印出來
List i = new ArrayList();
i.add("abc1");
i.add("abc2");
i.add("abc3");
i.add("abc4");

Iterator it = i.iterator();
while(it.hasNext()){
    Object obj = it.next();//add方法參數是Object類型的,不論傳入什麼類型的對象,都會類型提升爲Object
    if(obj.equals("abc2")){//使用Object中的equals方法,比較的是字符串常量地址值,字符串常量存在常量池中,如果要使用相同的字符串常量,會直接使用常量池中現有的字符串,不會新建
        i.add("abc9");
    }
    else{
        System.out.println(obj);
    }
}

輸出結果:
Exception in thread “main” java.util.ConcurrentModificationException
當方法檢測到對象的併發修改,但不允許這種修改時,拋出此異常。

因爲在建立迭代器的時候集合中有4個對象,在使用迭代器過程中調用List集合的add方法增加一個對象,迭代器是不知道的。所以如果想要增加對象,需要使用迭代器來增加,但是Iterator迭代器並沒有增加對象的方法,但是ListIterator列表迭代器中包含此方法。修改代碼如下:

List i = new ArrayList();
i.add("abc1");
i.add("abc2");
i.add("abc3");
i.add("abc4");

ListIterator li = i.listIterator();
while(li.hasNext()){
    Object obj = li.next();
    if(obj.equals("abc2")){
        li.add("abc9");
    }
    else{
        System.out.println(obj);
    }
}
System.out.println(i);

輸出結果:
abc1
abc3
abc4
[abc1, abc2, abc9, abc3, abc4]

boolean hasPrevious():逆向遍歷
E previous():返回列表中的前一個元素

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章