集合Collection及迭代器介紹
阿新 • • 發佈:2018-12-15
集合介紹
陣列長度是固定,當新增的元素超過了陣列的長度時需要對陣列重新定義,太麻煩,java內部給我們提供了集合類,能儲存任意物件,長度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少
陣列和集合的區別
區別1 :
- 陣列既可以儲存基本資料型別,又可以儲存引用資料型別,基本資料型別儲存的是值,引用資料型別儲存的是地址值
- 集合只能儲存引用資料型別(物件)集合中也可以儲存基本資料型別,但是在儲存的時候會自動裝箱變成物件
區別2: - 陣列長度是固定的,不能自動增長
- 集合的長度的是可變的,可以根據元素的增加而增長
陣列和集合什麼時候用
- 如果元素個數是固定的推薦用陣列
- 如果元素個數不是固定的推薦用集合
- 集合繼承體系圖
Collection
單列集合的根介面
Collection集合的基本功能測試
其中 ArrayList 和 Vector 都是陣列實現,LinkedList是連結串列實現
Conllection介面的方法功能
set和List介面都是繼承於Conllection介面
所以我們使用ArraysList來實現方法
//增加元素
Collection c = new ArrayList();//1.5版本後要加泛型
//public boolean add(Object a)
public boolean add(E e) {// 當然這是ArrayList 重寫的
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;//返回值為Boolean
}
在List中(繼承實現體系中,返回值都是true) 而在Set(繼承實現體系中,返回值都是false)
//刪除指定元素
c.remove("a");
//清空集合
c.clear()
//判斷是否包含
c.contains ("a");
//判斷是否為空
c.isEmpty()
//獲取元素個數
c.size()
集合陣列的轉化
集合轉化為陣列
Object [] arr = c.toArray();//注意這個時候已經是向上提上了。
集合與集合之間
//集合和集合之間加減
//若c1和c2都是集合ArrayList,那麼
c1.add(c2);//將c2當一個元素新增到集合c1中
c1.addAll(c2);//將c2全部新增到c1中
//刪除的是交集,有刪除返回true,無刪除返回false
c1.removeAll(c2);
//判斷c1是否包含c2
c1.containsAll(c2)
//保留交集 有交集沒有交集沒關係
// 如果呼叫的集合改變了返回true ,反之返回false
c1.retainAll(c2);
集合中的遍歷–迭代
List 列表不但繼承了Collection介面還繼承了Iterable介面
//注意 不但是ArrayList()可用,其他的,只要實現了Iterator介面的可使用(介面是制定一種規則)
Conllection<String> c = new ArrayList<>();
c.add("a");
c.add("a");
c.add("b");
c.add("c");
Iterator it = c.iterator(); //獲取迭代器
// boolean hasNext() 如果還可迭代返回true
boolean c1 = it.hasNext(); //判斷集合中是否有元素
// <E> next() 返回迭代的下一個元素
String s1 = it.next();
//void remove()從迭代器指向的 collection 中移除迭代器返回的最後一個元素(可選操作)
迭代器原理
- 迭代器原理:迭代器是對集合進行遍歷,而每一個集合內部的儲存結構都是不同的,所以每一個集合存和取都是不一樣,那麼就需要在每一個類中定義hasNext()和next()方法,這樣做是可以的,但是會讓整個集合體系過於臃腫,迭代器是將這樣的方法向上抽取出介面,然後在每個類的內部,定義自己迭代方式,這樣做的好處有二,
- 第一規定了整個集合體系的遍歷方式都是hasNext()和next()方法,
- 第二,程式碼有底層內部實現,使用者不用管怎麼實現的,會用即可
我們尋找ArrayList中的迭代器
//823行
public Iterator<E> iterator() {//Iterator()是一個介面不可直接建立物件,用方法返回 聯絡Iterator it = c.iterator();
return new Itr();//new 了一個成員內部類
}
private class Itr implements Iterator<E> {//寫在ArrayList中的內部類
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {//
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
這裡我也是懵比狀態,它用iterator()創造物件後,但建構函式並沒有對引數進行初始化,如何就使用起來了,我表示很懵。以後再來修改吧,我先看看別人的想法。