1. 程式人生 > >集合Collection及迭代器介紹

集合Collection及迭代器介紹

集合介紹

陣列長度是固定,當新增的元素超過了陣列的長度時需要對陣列重新定義,太麻煩,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()創造物件後,但建構函式並沒有對引數進行初始化,如何就使用起來了,我表示很懵。以後再來修改吧,我先看看別人的想法。