List集合代表一個元素有序、可重複的集合,集合中每個元素都有其對應的順序索引。List集合可以通過索引來訪問指定位置的集合元素。List集合預設按元素的新增順序設定元素的索引。
Java8改進的List介面和ListIterator介面
普通方法
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(不包含)處所有集合元素組成的子集合
import java.util.*;
public class ListTest3
{
public static void main(String[] args)
{
List teams = new ArrayList();
//向teams集合中新增三個元素
teams.add(new String("克利夫蘭騎士"));
teams.add(new String("金州勇士"));
teams.add(new String("俄克拉荷馬雷霆"));
System.out.println(teams);
//將新字串物件插入在第二個位置
teams.add(1, new String("費城76人"));
for (int i = 0 ; i < teams.size() ; i++ )
{
System.out.println(teams.get(i));
}
//刪除第3個元素
teams.remove(2);
System.out.println(teams);
//判斷指定元素在List集合中的位置:輸出1,表明位於第二位
System.out.println(teams.indexOf(new String("費城76人"))); ①
//將第二個元素替換成新的字串物件
teams.set(1, new String("洛杉磯快船"));
System.out.println(teams);
//將teams集合的第二個元素(包括)
//到第三個元素(不包括)擷取成子集合
System.out.println(teams.subList(1, 2));
}
}
[克利夫蘭騎士, 金州勇士, 俄克拉荷馬雷霆]
克利夫蘭騎士
費城76人
金州勇士
俄克拉荷馬雷霆
[克利夫蘭騎士, 費城76人, 俄克拉荷馬雷霆]
1
[克利夫蘭騎士, 洛杉磯快船, 俄克拉荷馬雷霆]
[洛杉磯快船]
從程式碼①處可知,List判斷兩個物件相等的標準只要equals()方法返回true即可
預設方法
-
void replaceAll(UnaryOperator operator):根據operator指定的計算規則重新設定List集合的所有元素
-
void sort(Comparator c):根據Comparator引數對List集合的元素排序
import java.util.*;
public class ListTest3
{
public static void main(String[] args)
{
List teams = new ArrayList();
// 向books集合中新增4個元素
teams.add(new String("克利夫蘭騎士"));
teams.add(new String("金州勇士"));
teams.add(new String("俄克拉荷馬雷霆"));
teams.add(new String("費城76人"));
// 使用目標型別為Comparator的Lambda表示式對List集合排序
teams.sort((o1, o2)->((String)o1).length() - ((String)o2).length());
System.out.println(teams);
// 使用目標型別為UnaryOperator的Lambda表示式來替換集合中所有元素
// 該Lambda表示式控制使用每個字串的長度作為新的集合元素
teams.replaceAll(ele->((String)ele).length());
System.out.println(teams); // 輸出[4, 5, 6, 7]
}
}
ListIterator方法
ListIterator()方法返回一個ListIterator物件,ListIterator介面繼承了Iterator介面,提供了專門操作List的方法,ListIterator介面在Iterator介面基礎上增加了如下方法
-
boolean hasPrevious():返回該迭代器相關的集合是否還有上一個元素
-
Object previous():返回該迭代器的上一個元素
-
void add(Object o):在指定位置插入一個元素
ListIterator與Iterator對比
-
ListIterator增加了向前迭代的功能,Iterator只能向後迭代
-
ListIterator可以通過add()方法向List集合中新增元素,Iterator只能刪除元素
import java.util.*;
public class ListIteratorTest
{
public static void main(String[] args)
{
String[] teams = {
"金州勇士", "俄克拉荷馬雷霆",
"克利夫蘭騎士"
};
List teamList = new ArrayList();
for (int i = 0; i < teams.length ; i++ )
{
teamList.add(teams[i]);
}
ListIterator lit = teamList.listIterator();
while (lit.hasNext())
{
System.out.println(lit.next());
lit.add("-------分隔符-------");
}
System.out.println("=======下面開始反向迭代=======");
while(lit.hasPrevious())
{
System.out.println(lit.previous());
}
}
}
金州勇士
俄克拉荷馬雷霆
克利夫蘭騎士
=======下面開始反向迭代=======
-------分隔符-------
克利夫蘭騎士
-------分隔符-------
俄克拉荷馬雷霆
-------分隔符-------
金州勇士
ArrayList和Vector實現類
ArrayList和Vector都是基於陣列實現的List類,所以ArrayList和Vector類封裝了一個動態的、允許再分配的Object[]陣列。initialCapacity引數用來設定該陣列的長度,如果向ArrayList和Vector新增大量元素時,可使用ensureCapacity(int minCapacity)方法一次性增加initialCapacity。減少重分配次數,提供效能
建立空的ArrayList和Vector集合時不指定initialCapacity引數,則Object[]陣列的長度預設為10
重新分配Object[]陣列的方法
-
void ensureCapacity(int minCapacity):將ArrayList和Vector集合的長度增加大於或大於minCapacity值
-
void trimToSize():調整ArrayList和Vector集合的Object[]陣列長度為當前元素的個數。呼叫該方法可減少ArrayList和Vector集合物件佔用的儲存空間
Vector的系列方法名長,具有很多缺點,通常儘量少用Vector實現類
ArrayList和Vector的區別
-
ArrayList是執行緒不安全,當多個執行緒訪問同一個ArrayList集合時,如果有超過一個執行緒修改了ArrayList集合,則程式必須手動保證該集合的同步性
-
Vector是執行緒安全,無須程式保證該集合的特別想,也因為執行緒安全,Vector的效能比ArrayList的效能低
-
Collections工具類可以將一個ArrayList變成執行緒安全,因此依然不推薦Vector實現類
固定長度的List
運算元組的工具類:Arrays,該工具類提供了asList(Object.. a)方法,可以把一個陣列或者指定個數的物件轉換成一個List集合,這個List集合既不是ArrayList實現類的例項,也不是Vector實現類的例項,而是Arrays的內部類ArrayList的例項
Arrays.ArrayList是一個固定長度的List集合,程式只能遍歷訪問該集合裡的元素,不可增加、刪除該集合裡的元素
import java.util.*;
public class FixedSizeList
{
public static void main(String[] args)
{
List fixedList = Arrays.asList("克利夫蘭騎士", "金州勇士");
// 獲取fixedList的實現類,將輸出Arrays$ArrayList
System.out.println(fixedList.getClass());
// 使用方法引用遍歷集合元素
fixedList.forEach(System.out::println);
// 試圖增加、刪除元素都會引發UnsupportedOperationException異常
fixedList.add("俄克拉荷馬雷霆");
fixedList.remove("金州勇士");
}
}