資料結構小節(1)

來源:互聯網
上載者:User

標籤:不同   理解   indexof   linked   rand   and   儲存   定義   先後   

介面總結UML類圖中的關係
  1. 依賴 : 局部變數和外部類的關係
  2. 關聯 : 簡單理解的話就是成員變數
  3. 彙總:has-a的成員變數,整體與部分分離,有各自獨立的生命週期。eg: 公司&員工,電腦&cpu
  4. 合成: contains-a關係的成員變數,外部類和內部成員保持同一個生命週期
  5. 實現 : 實作類別 實現→ 介面 比如Chinese實現Person
  6. 泛化 : 父類與子類的關係,繼承為其中一種
集合的分類
  • 集合主要被分為Collection和Map兩個介面
  • Collection被List和Set繼承
  • List被AbstractList實現,然後分為ArrayList,LinkedList和Vector
  • Set被AbstractSet實現,然後分為HashSet,TreeSet
  • Map衍生出HashMap,HashTable和TreeMap
Collection介面Collection介面基本操作
  1. add()
  2. addAll()
  3. clear();
  4. contains();
  5. ...
  6. ...
AbstractCollection實現方法
  1. contains()
  2. isEmpty()
  3. toArray()
  4. remove()
  5. clear()
子介面List

一個list是元素有序,可以重複,可以為null的集合
最好做法是: 預設使用ArrayList,多插入刪除時使用LinkedList,Vector太慢避免使用

List實現有序,可重複的原理
  1. List的資料結構就是一個序列,儲存內容時直接在記憶體中開闢一塊連續空間,然後將空間地址與索引對應
  2. ArrayList本質為數組
  3. List元素儲存是互不干擾,所以可以重複(與Set有很大區別)
List介面定義的方法除了Collection內建方法還提供以下的操作:
  • 位置相關:比如get,set,add,addAll,remove;
  • 搜尋: 從list中尋找元素位置, indexof,lastindexof
  • 迭代: 使用Iterator的擴充版迭代器,ListIterator進行迭代操作
  • 範圍性操作: subList;
集合操作
public boolean equals(Object o){?    retrun this == o;}
  • 比較地址是否相等,如果要比較內容,需要重寫.equals().
    remove(), contains(), indexof() 都需要用.equals();
public boolean contains(Object object){?    Object[] a = array;?    int s = size;?    if (object!= null){?    for (int i =0;i < s; i++){?        if(object.equals(a[i])){?            return true;?        }?    }}}
  • indexof() 方法差不多,但是要多一個else{} 遍曆Object等於null的情況
位置訪問,搜尋get,set,add,remove
  • set,remove方法返回被覆蓋,被刪除的元素
indexOf,lastIndexOf
  • 返回指定元素在list中的首次出現,最後一次出現位置(lastIndexOf為倒序遍曆)
addAll(int,Collection)
  • 在指定地點插入集合所有元素,元素按照迭代器Iterator返回的先後順序進行插入
簡單List swap()
public static <E> void swap(List<E> a, int i, int j){?    E temp = a.get(i);?    a.set(i,a.get(j));?    a.set(j,temp);}
局部範圍操作
  • subList本質為返回原來list的引用,改變了開始位置的offset和size.
  • return new SubAbstractListRandomAccess<E>(this, start, end);
  • 對subList改動同樣會影響原來的list;
List於Array的區別相似之處
  • 都可以表示一組相同類型的對象
  • 都是用下標進行索引
不同之處
  • 數組可以存任何類型元素
  • List不可以存基礎資料型別 (Elementary Data Type),必須封裝
  • 數組容量固定, List容量可動態正常
  • 數組效率高, List由於需要維護,效率相對低
總結
  • 容量固定時先使用數組, 容納類型更多更高效
  • 容量不確定的情況下, List更有優勢
List與Array間的轉換
  • Object[] toArray(): 返回一個包含List中所有元素的數組
  • T[] toArray(T[] array): 作用同上,不同的是,array長度大於List元素是.
    會使用參數array儲存List中的元素; 否則會建立一個新的array存放List中元素
迭代器
  • List繼承了Collection的iterator()方法,可以擷取Iterator,使用它進行向後遍曆
  • 在此基礎上, List還可以擷取更強大的迭代器ListIterator
  • ListIterator可以對list進行向前,向後雙向遍曆,同時還允許進行set,add,remove等操作
例子
public int indexOf(E e) { for (ListIterator<E> it = listIterator(); it.hasNext(); ) if (e == null ? it.next() == null : e.equals(it.next())) return it.previousIndex(); // Element not found return -1; }
public static <E> void replace(List<E> list, E val. E newVal){?    for(ListIterator<E> it = list.listIterator();it.hasNext();){?       if (val == null ? it.next == null ; val.equals(it.next()));?       it.set(newVal);?       }}

資料結構小節(1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.