JAVA學習筆記(十六)

來源:互聯網
上載者:User

標籤:integer   依次   class   實現   長度   fbo   except   shm   dHash   

List介面

  查閱API,看List的介紹。有序的 collection(也稱為序列)。此介面的使用者可以對列表中每個元素的插入位置進行精確地控制。使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。與 set 不同,列表通常允許重複的元素。

List介面:

  它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。那麼集合中,元素的儲存就是按照11、22、33的順序完成的)。

  它是一個帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數組的索引是一個道理)。

  集合中可以有重複的元素,通過元素的equals方法,來比較是否為重複的元素。

  List介面常用的子類有:ArrayList集合、LinkedList集合

List介面中常用的方法
public static void main(String[] args) {        //add();        //delete();        //update();        //get();        edit();    }    /*     * void add(int index,E element)     *在指定位置添加元素      * java.lang.IndexOutOfBoundsException集合的越界異常     * java.lang.ArrayIndexOutOfBoundsException數組的越界異常     * java.lang.StringIndexOutOfBoundsException 字串越界異常     * */    public static void add() {        List<String> list=new ArrayList<String>();        list.add("abc");        list.add("456");        list.add("bcd");        list.add(3, "rrr");        System.out.println(list);    }    /*     * E remove(int index)     * 1.刪除指定位置上的元素     * 2.返回這個元素的值     * */    public static void delete() {        List<String> list=new ArrayList<String>();        list.add("abc");        list.add("456");        list.add("bcd");        list.add(3, "rrr");        System.out.println(list);        String element=list.remove(0);        System.out.println(element);        System.out.println(list);    }    /*     *E set(int index,E element)     *1.替換指定位置上的值     *2.還可以擷取替換以前的值     * */    public static void update() {        List<String> list=new ArrayList<String>();        list.add("abc");        list.add("456");        list.add("bcd");        System.out.println(list);        String e=list.set(1, "吳彥祖");        System.out.println(e);        System.out.println(list);    }    /*     * E get(int index)     * 擷取指定索引上的元素值     * */    public static void get() {        List<String> list=new ArrayList<String>();        list.add("abc");        list.add("456");        list.add("bcd");        System.out.println(list);        System.out.println(list.get(0));        for(int i=0;i<list.size();i++) {            System.out.println(list.get(i));        }    }
Iterator的並發修改異常
 /*     * Iterator並發修改異常     * 在遍曆的過程中,只能做不改變長度的事情     * 一旦做了改變長度的事情,就會出現並發修改異常     * */    public static void edit() {        List<String> list=new ArrayList<String>();        list.add("abc");        list.add("456");        list.add("bcd");        Iterator<String> it=list.iterator();        while(it.hasNext()) {            String str=it.next();            System.out.println(str);            if(str.equals("456")) {                int i=list.indexOf(str);                list.set(i, "吳彥祖");            }            System.out.println(str);        }
List集合儲存資料的結構

  List介面下有很多個集合,它們儲存元素所採用的結構方式是不同的,這樣就導致了這些集合有它們各自的特點,供給我們在不同的環境下進行使用。資料存放區的常用結構有:堆棧、隊列、數組、鏈表。

堆棧,採用該結構的集合,對元素的存取有如下的特點:

  先進後出(即,存進去的元素,要在後它後面的元素依次取出後,才能取出該元素)。例如,子彈壓進彈夾,先壓進去的子彈在下面,後壓進去的子彈在上面,當開槍時,先彈出上面的子彈,然後才能彈出下面的子彈。

  棧的入口、出口的都是棧的頂端位置。

  壓棧:就是存元素。即把元素儲存到棧的頂端位置,棧中已有元素依次向棧底方向移動一個位置。

  彈棧:就是取元素。即,把棧的頂端位置元素取出,棧中已有元素依次向棧頂方向移動一個位置。

隊列,採用該結構的集合,對元素的存取有如下的特點:

  先進先出(即,存進去的元素,要在後它前面的元素依次取出後,才能取出該元素)。例如,安檢。排成一列,每個人依次檢查,只有前面的人全部檢查完畢後,才能排到當前的人進行檢查。

  隊列的入口、出口各佔一側。例如,中的左側為入口,右側為出口。

數組,採用該結構的集合,對元素的存取有如下的特點:

  尋找元素快:通過索引,可以快速存取指定位置的元素

  增刪元素慢:

    指定索引位置增加元素:需要建立一個新數組,將指定新元素儲存在指定索引位置,再把原數組元素根據索引,複製到新數組對應索引的位置。如

    指定索引位置刪除元素:需要建立一個新數組,把原數組元素根據索引,複製到新數組對應索引的位置,原數組中指定索引位置元素不複製到新數組中。

鏈表,採用該結構的集合,對元素的存取有如下的特點:

  多個節點之間,通過地址進行串連。例如,多個人手拉手,每個人使用自己的右手拉住下個人的左手,依次類推,這樣多個人就連在一起了。

  尋找元素慢:想尋找某個元素,需要通過串連的節點,依次向後尋找指定元素

  增刪元素快:

    增加元素:操作如左圖,只需要修改串連下個元素的地址即可。

    刪除元素:操作如右圖,只需要修改串連下個元素的地址即可。

ArrayList集合

  ArrayList集合資料存放區的結構是數組結構。元素增刪慢,尋找快,由於日常開發中使用最多的功能為查詢資料、遍曆資料,所以ArrayList是最常用的集合。

LinkedList集合

  LinkedList集合資料存放區的結構是鏈表結構。方便元素添加、刪除的集合。下面是LinkedList的常用方法

public static void main(String[] args) {        //add();        get();    }/* * void addFirst(E e)將指定元素插入此列表的開頭 * coid addLast(E e)將指定元素插入此列表的結尾 *  * */    public static void add() {        LinkedList<String> list=new LinkedList<String>();        list.addLast("程、陳冠希");        list.add("吳彥祖");        list.addFirst("梁朝偉");        System.out.println(list);    }    /*     *     E getFirst() 返回此列表的第一個元素     * E getLast()返回此列表的最後一個元素     * java.util.NoSuchElementException     *      * */    public static void get() {        LinkedList<String> list=new LinkedList<String>();        list.addLast("程、陳冠希");        list.add("吳彥祖");        list.addFirst("梁朝偉");        String f=list.getFirst();        String l=list.getLast();        System.out.println(f+l);    }}
Vector集合

  Vector集合資料存放區的結構是數組結構,為JDK中最早提供的集合。Vector中提供了一個獨特的取出方式,就是枚舉Enumeration,它其實就是早期的迭代器。此介面Enumeration的功能與 Iterator 介面的功能是類似的。Vector集合已被ArrayList替代。

  Vector集合與ArrayList集合使用的對比:

Set介面

  List和Set十Collection的兩個子介面,前面我們知道List中可以存放重複元素。而Set介面裡邊的集合儲存的是不重複的元素。通過查閱Set集合的API知道Set集合判斷元素是否重複是通過equals方法來判斷的。

HashSet集合

  查閱HashSet集合的API介紹:此類實現Set介面,由雜湊表支援(實際上是一個 HashMap集合)。HashSet集合不能保證的迭代順序與元素儲存順序相同。HashSet集合,採用雜湊表結構儲存資料,保證元素唯一性的方式依賴於:hashCode()與equals()方法。

HashSet集合儲存資料的結構(雜湊表)

什麼是雜湊表呢?

  雜湊表底層使用的也是數組機制,數組中也存放對象,而這些對象往數組中存放時的位置比較特殊,當需要把這些對象給數組中存放時,那麼會根據這些對象的特有資料結合相應的演算法,計算出這個對象在數組中的位置,然後把這個對象存放在數組中。而這樣的數組就稱為雜湊數組,即就是雜湊表。

  當向雜湊表中存放元素時,需要根據元素的特有資料結合相應的演算法,這個演算法其實就是Object類中的hashCode方法。由於任何對象都是Object類的子類,所以任何對象有擁有這個方法。即就是在給雜湊表中存放對象時,會調用對象的hashCode方法,算出對象在表中的存放位置,這裡需要注意,如果兩個對象hashCode方法算出結果一樣,這樣現象稱為雜湊衝突,這時會調用對象的equals方法,比較這兩個對象是不是同一個對象,如果equals方法返回的是true,那麼就不會把第二個對象存放在雜湊表中,如果返回的是false,就會把這個值存放在雜湊表中。

import java.util.HashSet;/* * 1.計算儲存物件的雜湊值,然後比較集合中有沒有相同的雜湊值 * 2.如果有相同的雜湊值,再調用equals方法,"aab".equals("aab"),如果相同 * 返回true,判定這是個重複元素,丟掉 * 3.如果雜湊值相同,則調用equals方法,如果euqals返回false,存入Set *  * */public class HashSetDemo {    public static void main(String[] args) {        method();    }    public static void method() {        HashSet<Person> hs=new HashSet<Person>();                Person p1=new Person("a",12);                Person p2=new Person("b",11);                Person p3=new Person("b",11);                Person p4=new Person("d",12);                System.out.println(p1.hashCode());                System.out.println(p2.hashCode());                System.out.println(p3.hashCode());                hs.add(p1);                hs.add(p2);                hs.add(p3);                hs.add(p4);                System.out.println(hs);    }    public static void hash() {        HashSet<String> hs=new HashSet<String>();        hs.add("aab");        hs.add("aab");        hs.add("bbc");        hs.add("bbc");        System.out.println(hs);    }}

  給HashSet中儲存JavaAPI中提供的類型元素時,不需要重寫元素的hashCode和equals方法,因為這兩個方法,在JavaAPI的每個類中已經重寫完畢,如String類、Integer類等。

  給HashSet中存放自訂類型元素時,需要重寫對象中的hashCode和equals方法,建立自己的比較方式,才能保證HashSet集合中的對象唯一。

LinkedHashSet

  在HashSet下面有一個子類LinkedHashSet,它是鏈表和雜湊表組合的一個資料存放區結構。它和HashSet的區別就是LinkedHashSet集合保證元素的存入和取出的順序。

JAVA學習筆記(十六)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.