20180801_12_Java中List集合,範型,可變引數以及增強for迴圈的一些介紹
List集合的特有功能
void add(int index; E element) :在指定索引處新增元素
E remove(int index) :移除指定元素的索引,返回被移除的元素
E get(int index) :獲取指定索引處的元素
E set(int index,E element) :更改指定元素的索引,返回那個被替換的元素
List集合的遍歷
1)用迭代器
ListIterator<String> li = list.listIterator();
while(li.hasNext()){
System.out.println(li.next());
}
逆向遍歷: boolean hasPrevious() 如果以逆向遍歷列表列表迭代器有多個元素,則返回 true。
E previous() 返回列表中的前一個元素。
2)List集合特有的遍歷方法(通過size()和get()方法)
A:儲存String型別的遍歷
ArrayList<String> al = new ArrayList();
for(int i = 0; i < al.size();i++){
System.out.println(al.get(i));
}
B:儲存物件的遍歷
ArrayList<Student> students = new ArrayList<>();
Student s1 = new Student("柴小力", 20, "女");
Student s2 = new Student("李四亂", 20, "男");
students.add(s1);
students.add(s2);
for (int j = 0;j < students.size();j++){
Student s = students.get(j);
System.out.println(s.getName()+"-"+s.getAge()+"-"+s.getSex());
}
ListIteragor的功能
ListIterator 繼承自Iterator 可以使用Iterator中的方法
特有功能:
boolean hasPrevious(): 是否存在前一個元素
E previous(): 返回列表中的前一個元素
併發修改異常的問題
ArrayList<String> st = new ArrayList<>();
st.add("Hello");
st.add("World");
ListIterator<String> stl = st.listIterator();
System.out.println(st);
while (stl.hasNext()){
String next = stl.next();
if("World".equals(next)){
st.add("javaee");
}
}
System.out.println(st);
這時會出現異常警告:ConcurrentModificationException
原因:原因是我們的迭代依賴於集合 當我們往集合中新增好了元素之後 獲取迭代器 ,那麼迭代器已經知道了集合的元素個數,這個時候你在遍歷的時候又突然想給 集合裡面加一個元素(用的是集合的add方法) 那迭代器不同意 就報錯了。
解決方法: 1.用ListIterator迭代器遍歷 用迭代器自帶的add方法新增元素
2. 使用for迴圈遍歷集合 新增元素
List的三個子類的特點
ArrayList:
底層資料結構是陣列,查詢快,增刪慢。
執行緒不安全,效率高。
Vector:
底層資料結構是陣列,查詢快,增刪慢。
執行緒安全,效率低。
LinkedList:
底層資料結構是連結串列,查詢慢,增刪快。
執行緒不安全,效率高。
ArrayList類
底層資料結構是陣列,查詢快,增刪慢,執行緒不安全,效率高 可以儲存重複元素
int indexOf (Object o)返回此列表中指定元素的第一個出現的索引,或 - 如果此列表 不包含元素,或 - 1。
void sort (Comparator < ? super E > c)分類列表使用提供的 Comparator比較元素。
List<E> subList ( int fromIndex, int toIndex)返回一個檢視之間的指定 fromIndex,包容, 和 toIndex這份名單的部分,獨家。
Object[] toArray () 返回一個數組,包含在這個列表中的所有元素在適當的順序(從 第一 個到最後一個元素)
Vector類
可以實現可增長的物件陣列 , Vector 是同步的。
底層資料結構是陣列,查詢快,增刪慢,執行緒安全,效率低。
特有功能:
public void addElement(E obj) 將指定的元件新增到此向量的末尾,將其大小增加 1。
public E elementAt(int index) 返回指定索引處的元件。
public Enumeration elements() 返回此向量的元件的列舉。
LinkedList類
此實現不是同步的。
底層資料結構是連結串列,查詢慢,增刪快,執行緒不安全,效率高
特有功能
public void addFirst(E e)及addLast(E e) 將指定元素插入此列表的開頭/結尾
public E getFirst()及getLast() 返回此列表的第一個/最後一個元素
public E removeFirst()及public E removeLast() 移除並返回此列表的第一/最後一個元素
泛型
是一種把型別明確的工作推遲到建立物件或者呼叫方法的時候才去明確的特殊的 型別。
格式:<資料型別> 這裡的資料型別只能是引用資料型別
好處
(1): 把執行時期的問題提前到了編譯期間
(2): 避免了強制型別轉換
(3):優化了程式設計,解決了黃色警告線
注意:泛型只在編譯期有效 但在執行期就擦除了
泛型類:
把泛型定義在類上
格式: public class 類名<泛型型別1,…>
注意: 泛型型別必須是引用型別
泛型方法:
把泛型定義在方法上
格式: public <泛型型別> 返回型別 方法名(泛型型別 變數名)
泛型介面:
把泛型定義在介面上
格式: public interface 介面名<泛型型別>
泛型介面的子類:
第一種情況: 就是在定義子類的時候我們已經可以明確資料型別了
第二種情況: 就是在定義子類的時候我們還不知道到底使用神馬資料型別.這個時候我們就需要將這個子類也定義成泛型。
泛型高階之萬用字元
泛型萬用字元<?>: 任意型別,如果沒有明確,那麼就是Object以及任意的Java類了
? extends E : 向下限定,E及其子類
? super E: 向上限定,E及其父類
增強for迴圈
格式: for(資料型別 變數名:陣列或者Collection集合){
}
eg: ArrayList<Integer> integers = new ArrayList<>();
for(Integer num : integers){
System.out.println(num);
}
可變引數
格式: 修飾符 返回值型別 方法名(資料型別… 變數名){}
eg: public static void main(String[] args) {
addNum(1,2,3,4,5);
}
public static int addNum(int... a) {
int sum = 0;
for (int num: a){
sum+=num;
}
}