JAVA----集合的子介面List
List
List:列表
此介面對應的實現類的特點都是:有序的,可以重複的
重複與否與元素的equals方法有關
常用方法:
void add(int index,E element)--------將某一元素,插入到此集合的某一下標index處
E get(int index)--------------返回指定下標上的元素
int indexOf(Object obj)--------------返回指定元素出現的位置,如果沒有返回-1。E set(int index, E newElement) -------------使用新元素newElement替換下標index上的元素,返回原元素。
boolean remove(int index)--------------移除此集合中下標為index的元素 (注意在元素的類中重寫equals方法)
List subList(int fromIndex,int endIndex)------ 擷取此集合中的一部分,即擷取子集,從fromIndex到endIndex,包前不包後
PS:此方法在堆中產生了一個內部類SubList集合物件,此集合物件引用的是父集的一部分。修改子集,會影響父集。
int lastIndexOf(Object obj)------------返回此集合指定元素obj最後一次出現的下標,找不到返回-1
陣列與集合之間的轉換
1、集合轉陣列
Object[ ] toArray()
<E>E[ ] toArray(E[ ] e)
2、陣列轉集合
List Arrays.asList(T……a)
注意:陣列轉型的集合,不能進行增刪操作,否則會出現執行時異常,可以進行替換操作,但是會對陣列變數有影響。
如果想要成功進行增刪操作,可以將元素存入新的集合中。
Iterator:迭代器介面
(1)迭代器的作用是用來遍歷集合元素。是一個介面,Collection繼承了該介面,提供了一個方法Iterator iterator()
(2)Collection的實現類使用內部類定義了迭代器子類。
(3)迭代器提供了統一的方法,用於遍歷集合元素
常用方法:
boolean hasNext()--------------- 判斷集合中是否有下一個元素
E next()----------------- 取出集合中的下一個元素
remove(Object obj)在使用迭代器對集合進行遍歷時,不能使用集合的移除方法移除集合的元素.
必須使用迭代器自己提供的移除方法才行。
增強for迴圈——foreach迴圈
for(元素型別 變數名:要遍歷的集合或者陣列){
}
與經典for迴圈的區別:
(1)增強for迴圈中無法使用下標。
(2)經典for迴圈可以使用下標,跟下標有關的邏輯,隨便寫
List的實現類
(1)ArrayList------底層是基於動態陣列的資料結構。是有存放順序的。
(2)LinkedList------底層是基於雙鏈表的資料結構。每一個儲存單元都涉及到其他兩個引用。
ArrayList和LinkedList比較:在執行get()/set()時,ArrayList的效率高,LinkedList需要移動指標,效率低在增加和刪除 時,LinkedList效率高, ArrayList效率低(需要擴容,移動元素)
PS:當然,在元素的數量大的情況下,區別才明顯
(3)Vector:是一個比較古老的集合型別,執行緒安全但是效率特別低,雖然安全也不建議使用。
public class TestIterator02 {
public static void main(String[] args) {
/*建立一個集合list,用於儲存座標系第二象限的整數點
* 整數點5個
* 使用迭代器進行遍歷,檢視是否有點(-3,2).
* 如果有,請從集合中刪除
* */
List<Point> list = new ArrayList<Point>();
list.add(new Point(-1,2));
list.add(new Point(-2,4));
list.add(new Point(-3,2));
list.add(new Point(-6,7));
list.add(new Point(-9,8));
System.out.println(list);
Iterator<Point> it = list.iterator();
Point p1 = new Point(-3,2);
while(it.hasNext()){
Point p = it.next();
if(p.equals(p1)){
it.remove();
}
}
System.out.println(list);
}
}
List排序
Comparable介面:
如何定義集合元素之間的大小之分?我們需要在定義元素型別時,實現Comparable介面,實現介面內的CompareTo(E e)。實現此介面的型別的物件之間可以進行比較。
方法:
int compareTo(E e):
比較規則:
(1)this與e比較,this-e
如果大於零,返回大於0的一個數
如果等於零,返回0
如果小於零,返回小於0的一個數
按照升序排序
(2)e-this,降序排序
工具類Collections
提供了一個sort(Collection c)方法,對集合裡的元素進行排序
Comparator比較器介面:
如果元素型別已經實現了Comparable介面,定義了預設的比較規則,之後再想換其他比較規則時,不修改原始碼。
可以利用比較器介面來重新定義比較規則。
方法:
int compare(E o1,E o2);
比較規則:
升序:o1-o2
降序:o2-o1
public class TestSort02 {
public static void main(String[] args) {
/* 在集合List中儲存五個字串物件,排序 */
List<String> list = new ArrayList<String>();
list.add("php");
list.add("java");
list.add("python");
list.add("scala");
list.add("C++");
System.out.println(list);
// 定義一個比較器物件
Comparator<String> my = new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
};
Collections.sort(list, my);
/**Collections.sort(list, new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
};);----------------進一步修改*/
System.out.println(list);
/**max():找到自然排序後的最大值*/
String e1= Collections.max(list);
System.out.println(e1);
/**reverse():對集合元素進行反轉*/
Collections.reverse(list);
System.out.println(list);
/*shuffle():對集合元素進行打亂順序,混洗*/
Collections.shuffle(list);
System.out.println(list);
}
}