集合(3)——List集合
List集合
List集合代表一個元素有序,可重復的集合,集合中每個元素都有其對應的順序索引.List集合允許使用重復元素,可以通過索引來訪問指定位置的集合元素。List集合允許使用重復元素,可以通過索引來訪問指定位置的集合元素。List集合默認按元素的添加順序設置元素的索引,例如第一次添加的元素索引為0,第二次添加的元素索引為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處所有集合元素組成的子集合。
void replaceAll(UnaryOperator operator):根據operator指定的計算規則重新設置List集合的所有元素。
void sort(Comparator c):根據Comparator參數對List集合的元素排序。
import java.util.*; public class ListTest { public static void main(String[] args) { List<String> books = new ArrayList<String>(); //向books集合中添加三個元素 books.add(new String("龍珠")); books.add(new String("犬夜叉")); books.add(new String("網球王子")); books.add(null); System.out.println(books); //將新字符串對象插入在第二個位置 books.add(1, new String("海賊王")); for(int i = 0; i < books.size(); i++){ System.out.println(books.get(i)); } //刪除第三個元素 books.remove(2); System.out.println(books); //判斷指定元素在List集合中的位置:輸出1,表明位於第二位 System.out.println(books.indexOf(new String("海賊王"))); //將第二個元素替換成新的字符串對象 books.set(1,new String("海賊王")); System.out.println(books); //將books集合的第二個元素(包括)到第三個元素(不包括)截取成子集合 System.out.println(books.subList(1,2)); } }
測試結果:
註意:List判斷兩個對象是否相等的標準,只要兩個對象通過equals()方法返回true即可。
import java.util.*; class A{ public boolean equals(Object obj) { return true; } } public class ListTest2{ public static void main(String[] args) { List<Object> list = new ArrayList<Object>(); list.add(new String("龍珠")); list.add(new String("棋魂")); list.add(new String("遊戲王")); System.out.println(list); //list刪除一個A對象,將list中的第一個元素刪除 list.remove(new A()); System.out.println(list); //將再次刪除第一個元素 list.remove(new A()); System.out.println(list); } }
測試結果:
通過上面這段代碼可以看出,List集合是通過equals()方法判斷兩個元素是否相同。
Java8為List集合增加了sort()和repalceAll()兩個常用的默認方法,其中sort()方法需要一個Comparator對象來控制元素排序,程序可使用Lambda表達式來作為參數;而replaceAll()方法則需要一個UnaryOperator來替換所有集合元素,UnaryOperator也是一個函數式接口,因此程序也可使用Lambda表達式作為參數。
import java.util.*; public class ListTest3{ public static void main(String[] args) { List<Object> list = new ArrayList<Object>(); list.add("死神"); list.add("海賊王"); list.add("灌籃高手"); list.add("進擊的巨人"); list.add("鋼之煉金術師"); list.add("棋魂"); //將list按字符串長度順序排序 list.sort((o1,o2) -> ( ((String)o1).length() - ((String)o2).length())); System.out.println(list); //將list集合中的字符串替換成對應的字符串長度 list.replaceAll(ele -> (((String)ele).length())); System.out.println(list); } }
測試結果:
上面程序對List集合進行了排序,傳給sort()方法的Lambda表達式指定的排序規則是:字符串長度越長,字符串越大。
與Set只提供了一個iterator()方法不同,List還額外提供了一個listIterator()方法,該方法返回一個ListIterator對象,ListIterator接口繼承了Iterator接口,提供了專門操作List的方法。ListIterator接口在Iterator接口基礎上增加了如下方法:
boolean hasPrevious():返回該叠代器關聯的集合是否還有上一個元素
Object previous():返回該叠代器的上一個元素。
void add(Object o):在指定位置插入一個元素。
import java.util.*; public class ListIteratorTest{ public static void main(String[] args) { String[] arr = {"龍珠","犬夜叉","遊戲王","海賊王","死神","灌籃高手"}; List<String> list = new ArrayList<String>(); for(int i = 0; i < arr.length; i++) { list.add(arr[i]); } ListIterator lit = list.listIterator(); while(lit.hasNext()) { System.out.println(lit.next()); } //開始反向遍歷 System.out.println("==================="); while(lit.hasPrevious()) { System.out.println(lit.previous()); } } }
測試結果:
集合(3)——List集合