黑馬程序員-集合框架

-------android培訓java培訓期待與您交流!----------

介紹
  • 出現(xiàn)的原因:面向?qū)ο笳Z言對事物的體現(xiàn)都是以對象的形式存在疏咐,為了方便對多個對象的操作辛掠,就對對象進行存儲宜鸯,集合就是存儲對象最常用的一種方式陌凳。集合就是將若干用途保檐、性質(zhì)相同或相近的"數(shù)組"組合而成一個整體伞鲫。
  • 數(shù)組和集合的不同:數(shù)組可以存儲對象乙埃,但長度是固定的闸英;集合長度是可變的。數(shù)組中可以存儲基本數(shù)據(jù)類型介袜,集合只能存儲對象甫何。
  • 集合的特點:集合只用于存儲對象,集合長度是可變遇伞,集合可以存粗不同類型的對象辙喂。
集合體系結(jié)構(gòu)圖
  • 根據(jù)數(shù)據(jù)結(jié)構(gòu)的不同,集合可以分為以下結(jié)構(gòu)體系:


    集合框架.png
Collection接口和迭代器
  • 提供List、Set等數(shù)據(jù)結(jié)構(gòu)集合的最基礎共性的方法接口巍耗。
  • 迭代器:集合的取出元素的方式秋麸。

實現(xiàn)為:每個數(shù)據(jù)結(jié)構(gòu)不同的集合取出方式定義在內(nèi)部,取出方式被定義成了內(nèi)部類芍锦,所以取出的方式也不一樣竹勉,但是都有共性方式:判斷和取出,可以抽取共性娄琉。而這些內(nèi)部類都可以抽取成Iterator接口特性規(guī)則次乓,對外提供iterator();方法取出元素。

package com.sergio.Collections;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * collection接口介紹接迭代器介紹
 * Created by Sergio on 2015/1/16.
 */
public class CollectionDemo {
    public static void main(String[] args) {
        sop(-1 % 2);

    }

    public static void sop(Object obj) {
        System.out.println(obj);
    }

    //集合元素交集方法
    public static void CollectionRetainAllMethod() {
        //創(chuàng)建一個集合容器孽水,使用Collection接口的子類ArrayList演示共性方法
        Collection al1 = new ArrayList();
        al1.add("hello1");
        al1.add("hello2");
        al1.add("hello3");
        al1.add("hello4");

        ArrayList al2 = new ArrayList();
        al2.add("hello1");
        al2.add("hello2");
        al2.add("hello5");
        al2.add("hello7");

        al1.retainAll(al2); //取交集票腰,al中保留和al1相同的元素
        al1.retainAll(al2); //刪除al中al1存在的元素
    }

    //collection集合基礎方法使用介紹
    public static void CollectionMethod() {
        //創(chuàng)建一個集合容器,使用Collection接口的子類ArrayList演示共性方法
        Collection al = new ArrayList();

        /**
         * 添加元素
         * 1. add方法的參數(shù)類型是Object女气,以便于接受任意類型對象
         * 2. 集合中存儲的都是對象的引用(地址)
         */
        al.add("hello1");
        al.add("hello2");
        al.add("hello3");
        al.add("hello4");

        //打印原集合
        sop(al);

        //獲取集合長度
        sop("長度:" + al.size());

        //刪除元素
        al.remove("hello2");
        //打印刪除后的集合
        sop(al);
        al.clear(); //清空集合

        //判斷元素
        sop("hello3" + al.contains("hello3")); //是否包含hello3元素
        sop(al.isEmpty()); //是否為空
    }

    //獲取集合中的元素.迭代器介紹
    public static void CollectionGet() {
        Collection al = new ArrayList();
        al.add("hello1");
        al.add("hello2");
        al.add("hello3");
        al.add("hello4");

        Iterator it = al.iterator();//獲取迭代器杏慰,用于取出集合中的元素
        while (it.hasNext()) {
            sop(it.next());
        }
        //此方法相對while循環(huán)的效果一樣。但是比while節(jié)省內(nèi)存空間炼鞠,for循環(huán)完就釋放了內(nèi)存缘滥,而while沒有。推薦使用此方法
        //        for(Iterator it = al.iterator(); it.hasNext();)
        //        {
        //            sop(it.next());
        //        }
    }
}
List
  • 元素是有序的谒主,元素可以重復朝扼。因為該集合體系有索引。
  • 特有方法:凡是可以操作角標的方法都是該體系特有的方法霎肯。
  • List特有的迭代器ListIterator:ListIterator是Iterator的子接口擎颖。在迭代器時,不可以通過集合對象的方法操作集合中的元素观游,因為會發(fā)生ConcurrentModificationException異常搂捧。因為,在迭代器時懂缕,只能用迭代器的方式操作元素允跑,可是Iterator方式有限的,只能對元素進行判斷搪柑,取出吮蛹,刪除的操作,如果想要其他的操作如添加拌屏,修改等,就需要使用其子接口ListIterator术荤。 該接口之能通過List的集合的listIterator方法獲取倚喂。因為list都帶有角標。
package com.sergio.Collections;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 * Created by Sergio on 2015/1/19.
 */
public class ListDemo1 {
    public static void main(String[] args) {
        List al = new ArrayList();

        al.add("hello1");
        al.add("hello2");
        al.add("hello3");
        al.add("hello4");

        sop("原集合是:" + al);

        al.add(1, "hello8"); //在指定位置插入元素,后面元素依次后移,容量增加1

        al.remove(2); //刪除指定位置的元素

        al.set(2, "hell5"); //修改指定位置的元素

        al.get(3); //通過角標獲取元素

        //獲取集合所有元素
        for (int x = 0; x < al.size(); x++) {
            System.out.println("al(" + x + " +)" + al.get(x));
        }
        //迭代器獲取元素
        Iterator it = al.iterator();
        while (it.hasNext()) {
            sop("next:" + it.next());
        }

        sop(al.indexOf("hello3")); //通過indexOf獲取對象的位置

        List sub = al.subList(1, 3); //截取列表元素端圈,包含頭焦读,不包含尾
        sop(al);
        
        listIterator();
    }

    /**
     * List集合特有的迭代器。ListIterator是Iterator的子接口舱权。
     * 在迭代器時矗晃,不可以通過集合對象的方法操作集合中的元素,因為會發(fā)生ConcurrentModificationException異常宴倍。
     * 因為张症,在迭代器時,只能用迭代器的方式操作元素鸵贬,可是Iterator方式有限的俗他,只能對元素進行判斷,取出阔逼,刪除的操作兆衅,
     * 如果想要其他的操作如添加,修改等嗜浮,就需要使用其子接口ListIterator羡亩。
     * <p>
     * 該接口之能通過List的集合的listIterator方法獲取。因為list都帶有角標.
     */
    public static void listIterator() {
        List al = new ArrayList();

        al.add("hello1");
        al.add("hello2");
        al.add("hello3");
        al.add("hello4");

        sop(al);

        //在循環(huán)中操作元素
        ListIterator li = al.listIterator();
        //正向獲取元素危融。
        while (li.hasNext()) {
            Object obj = li.next();
            if (obj.equals("hello3")) {
                li.add("hello6");//添加
                li.set("hello4");//修改
            }
        }

        //反向獲取元素
        while (li.hasPrevious()) {
            sop("pre: " + li.hasPrevious());
        }
        sop(al);
        //        //在迭代過程中畏铆,準備添加或刪除元素。在迭代器中只能使用迭代器的方法专挪,
        //        // 集合對象引用中只能使用集合的方法及志,集合和迭代器有兩個相同對象引用,所以修改一方時會引發(fā)安全異常寨腔。
        //        Iterator it = al.iterator();
        //        while (it.hasNext())
        //        {
        //            Object obj = it.next();
        //            if(obj.equals("hello2"))
        //            {
        //                it.remove(); //將hello3的引用從集合中刪除
        //            }
        //            sop("obj=" + obj);
        //        }
    }

    public static void sop(Object obj) {
        System.out.println(obj);
    }
}
  • List常見的子類對象:
  1. ArrayList:底層的數(shù)據(jù)結(jié)構(gòu)使用的是數(shù)組結(jié)構(gòu)速侈。特點:查詢更改速度快,增刪稍慢迫卢。線程不同步倚搬。可變長度數(shù)組:元素初始是10的元素空間乾蛤,超過10空間每界,按原數(shù)組的50%增加空間,也就是變成15家卖,new一個新的數(shù)組眨层,將原始空間中的元素復制進來和新增加的元素添加到后面的空間中。
  2. LinkedList:底層使用的是鏈表數(shù)據(jù)結(jié)構(gòu)上荡。特點:查詢滿趴樱,增刪快。
  3. Vector:底層是數(shù)組數(shù)據(jù)結(jié)構(gòu)。特點:查詢叁征、增刪滿纳账。線程同步∞嗵郏可變長度數(shù)組:元素初始是10的元素空間疏虫,超過10空間,按原數(shù)組的50%增加空間啤呼,也就是變成15卧秘,new一個新的數(shù)組,將原始空間中的元素復制進來和新增加的元素添加到后面的空間中媳友。
  • Vector:枚舉是Vector特有的取出方式斯议,枚舉和迭代器重復。枚舉的名稱和方法名稱過長醇锚,被迭代器取代了哼御。
package com.sergio.Collections;

import java.util.Enumeration;
import java.util.Vector;

/**
 * Vector枚舉獲取元素
 * Created by Sergio on 2015/1/19.
 */
public class VectorDemo {
    public static void main(String[] args) {
        Vector v = new Vector();
        v.add("hello1");
        v.add("hello2");
        v.add("hello3");
        v.add("hello4");

        //和迭代器重復
        Enumeration en = v.elements();
        while (en.hasMoreElements())
        {
            System.out.println(en.nextElement());
        }
    }
}
  • LinkedList:鏈表數(shù)據(jù)結(jié)構(gòu)的,元素之間的聯(lián)系是上個元素中保存著下個元素的位置信息焊唬,每個元素是這樣聯(lián)系的恋昼,所以查詢滿,刪除塊只需要改變相鄰兩個元素之間的位置指向的信息即可赶促。
package com.sergio.Collections;

import java.util.LinkedList;

/**
 * LinkedList實現(xiàn)中特有的方法介紹
 * Created by Sergio on 2015/1/19.
 */
public class LinkedDemo {
    public static void main(String[] args) {
        LinkedList lk = new LinkedList<>();
        lk.addFirst("hello1");
        lk.addFirst("hello2");
        lk.addFirst("hello3");
        lk.addFirst("hello4");

        sop(lk); //打印的順序是倒著放置元素的

        //此下集中刪除獲取元素時液肌,如果集合中沒有元素,會出現(xiàn)NoSuchElementsException
        //在Jdk1.6出現(xiàn)了替代方案:
        //增加:offerFist(),offerLast();獲取元素不刪除(如果沒有元素會返回null):peekFirst()鸥滨,peekLast();獲取元素并刪除(如果沒有元素會返回null):pollFist(),pollLast().
        sop(lk.removeFirst()); //獲取第一個元素并刪除
        sop(lk.removeFirst()); //獲取最后一個元素并刪除
        sop(lk.getFirst()); //獲取第一個元素嗦哆,不刪除元素
        sop(lk.getLast()); //獲取最后一個元素,不刪除元素

        //獲取集合中所有元素
        while (lk.isEmpty()) {
            sop(lk.getLast());
        }
        sop(lk.size());
    }

    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}
package com.sergio.Collections;

import java.util.LinkedList;

/**
 * LinkedList模擬一個堆椥鲎遥或者隊列數(shù)據(jù)結(jié)構(gòu)
 * 堆棧:先進后出老速。
 * 隊列:先進先出。
 * Created by Sergio on 2015/1/19.
 */
public class LinkedDemo2 {
    public static void main(String[] args) {
        Queue q = new Queue();
        q.myAdd("hello1");
        q.myAdd("hello2");
        q.myAdd("hello3");
        q.myAdd("hello4");
        //獲取所有元素
        while (!q.isNull()) {
            System.out.println(q.myGet());
        }

        Stack s = new Stack();
        s.myAdd("hello1");
        s.myAdd("hello2");
        s.myAdd("hello3");
        //獲取所有元素
        while (!s.isNull()) {
            System.out.println(s.myGet());
        }
    }
}


//隊列.根據(jù)隊列特點凸主,利用LinkedList封裝一些功能橘券。
class Queue {
    private LinkedList link;

    Queue() {
        link = new LinkedList();
    }

    //在第一個位置添加元素,先進
    public void myAdd(Object obj) {
        link.addFirst(obj);
    }

    //獲取第一個進入的元素卿吐,先出
    public Object myGet() {
        return link.removeLast();
    }

    //判斷元素是否為空
    public boolean isNull() {
        return link.isEmpty();
    }
}


//堆棧旁舰,封裝成一些功能
class Stack {
    private LinkedList link;

    Stack() {
        link = new LinkedList();
    }

    //在第一個位置添加元素,先進
    public void myAdd(Object obj) {
        link.addFirst(obj);
    }

    //獲取最后一個進入的元素嗡官,后出
    public Object myGet() {
        return link.removeLast();
    }

    //判斷元素是否為空
    public boolean isNull() {
        return link.isEmpty();
    }
}
Set
  • 元素是無序(存入和取出的元素順序不一定一致)的箭窜,元素不可以重復。
  • Set和Collection的功能是一致的衍腥。
  • Set常見子類對象:
1.HashSet:底層的數(shù)據(jù)結(jié)構(gòu)是哈希表绽快。線程不同步芥丧。
  * 保證唯一性:是通過元素的兩個方法,hashCode和equals來完成坊罢。如果元素的HashCode值相同,才會判斷equals是否為true擅耽。如果元素的HashCode值不同活孩,才會調(diào)用equals。
  * 注意:對于判斷元素是否存在乖仇,以及刪除等操作憾儒,依賴方法是元素的hashCode和equals方法。
package com.sergio.Collections;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * HashSet的添加乃沙、刪除等元素使用介紹起趾。跟Collection一致的用法。
 * Created by Sergio on 2015/1/20.
 */
public class HashSetDemo {
    public static void main(String[] args) {
        Set hs = new HashSet<>();
        //存person2的對象元素
        hs.add(new Person2("hello1", 11));
        hs.add(new Person2("hello3", 12));
        hs.add(new Person2("hello2", 31));
        hs.add(new Person2("hello1", 11));

        sop(hs.contains(new Person2("hello1", 11))); //判斷新對象是否在集合中存在
        hs.remove(new Person2("hello2", 12)); //刪除集合中跟新對象一樣的元素

        Iterator it = hs.iterator();
        while (it.hasNext()) {
            Person2 p = (Person2) it.next();
            sop(p.getName() + "::" + p.getAge());
        }
    }

    public static void sop(Object obj) {
        System.out.println(obj);
    }
}


//存儲的對象
class Person2 {
    private String name;
    private int age;

    Person2(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //比較兩者對象的地址值
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Person2)) {
            return false;
        }

        Person2 p = (Person2) o;
        return this.name.equals(p.name) && this.age == p.age;
    }

    //返回字符串的哈希值
    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + age;
        return result;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
2.TreeSet
  • 可以對Set集合中的元素進行排序警儒。默認按照自然順序排序训裆。
  • 排序時:當主要條件相同時,一定要判斷下次要條件蜀铲。
  • 底層數(shù)據(jù)結(jié)構(gòu)是:二叉樹边琉。保證數(shù)據(jù)唯一性的依據(jù):compareTo方法return 大于(1),等于(0),小于(-1)。
  1. TreeSet排序的第一種方式:讓元素自身具備比較性记劝。元素需要實現(xiàn)Comparable接口变姨,覆蓋compareTo方法,這種方式也稱為元素的自然順序厌丑,或者默認字典順序定欧。
  2. TreeSet的第二種排序方式:當元素自身不具備比較性,或者具備的比較性不是所需要的怒竿。這時需要讓集合自身具備比較性砍鸠。在集合初始化時,就讓其具備比較性愧口,也就是構(gòu)造函數(shù)指定比較器睦番。兩種排序都存在時,以比較器為主耍属。定義一個類托嚣,實現(xiàn)comparator接口,覆蓋compare方法厚骗。
  1. TreeSet使用介紹:
package com.sergio.Collections;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

/**
 * TreeSet使用介紹及比較器方法介紹示启。
 * Created by Sergio on 2015/1/20.
 */
public class TreeSetDemo {
    public static void main(String[] args) {
        Set ts = new TreeSet();

        ts.add(new Student("hello1", 30));
        ts.add(new Student("hello2", 30));
        ts.add(new Student("hello3", 40));

        Iterator it = ts.iterator();
        while (it.hasNext()) {
            Student stu = (Student) it.next();
            System.out.println(stu.getName() + stu.getAge());
        }

    }
}

//此接口讓學生類具有比較性
class Student implements Comparable {
    private String name;
    private int age;

    Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //按學生年齡大小排序
    @Override
    public int compareTo(Object o) {
        if (!(o instanceof Student)) {
            throw new RuntimeException("不是學生對象");
        }
        //排序判斷條件
        Student stu = (Student) o;
        //樹的左邊
        if (this.age > stu.age) {
            return 1;
        }
        //相等時,比較次要條件進行排序
        if (this.age == stu.age) {
            return this.name.compareTo(stu.name);
        }
        //樹的右邊
        return -1;
    }
}
  1. TreeSet第一種元素可以比較方法介紹:
package com.sergio.Collections;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

/**
 * 比較器創(chuàng)建方式领舰,自定義比較器類夫嗓,實現(xiàn)comparator接口迟螺。
 * Created by Sergio on 2015/1/20.
 */
public class TreeSetDemo2 {
    public static void main(String[] args) {
        Set ts = new TreeSet(new MyCompare());

        ts.add(new Teacher("hello1", 30));
        ts.add(new Teacher("hello2", 20));
        ts.add(new Teacher("hello3", 50));
        ts.add(new Teacher("hello2", 70));
        ts.add(new Teacher("hello2", 40));

        Iterator it = ts.iterator();
        while (it.hasNext()) {
            Teacher stu = (Teacher) it.next();
            System.out.println(stu.getName() + "::" + stu.getAge());
        }
    }
}


//此接口讓學生類具有比較性
class Teacher implements Comparable {
    private String name;
    private int age;

    Teacher(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //按年齡大小排序
    @Override
    public int compareTo(Object o) {
        if (!(o instanceof Teacher)) {
            throw new RuntimeException("不是學生對象");
        }
        //排序判斷條件
        Teacher stu = (Teacher) o;
        //樹的左邊
        if (this.age > stu.age) {
            return 1;
        }
        //相等時,比較次要條件進行排序
        if (this.age == stu.age) {
            return this.name.compareTo(stu.name);
        }
        //樹的右邊
        return -1;
    }
}


//自定義比較器舍咖,實現(xiàn)Comparator接口中的compare方法矩父。按姓名字幕順序自然排序
class MyCompare implements Comparator {
    public int compare(Object o1, Object o2) {
        Teacher s1 = (Teacher) o1;
        Teacher s2 = (Teacher) o2;

        int num = s1.getName().compareTo(s2.getName());
        if (num == 0) {
            return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
            //等價上一句
            //            if (s1.getAge() > s2.getAge())
            //                return 1;
            //            if (s1.getAge() == s2.getAge())
            //                return 0;
            //            return -1;
        }
        return num;
    }
}
  1. TreeSet練習(包括內(nèi)部類使用方式介紹)
package com.sergio.Collections;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

/**
 * 按字符串長度排序.比較方式微分:創(chuàng)建比較類和創(chuàng)建比較匿名函數(shù)
 * Created by Sergio on 2015/1/21.
 */
public class TreeSetDemo3 {
    public static void main(String[] args) {
        Set ts = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                String s1 = (String) o1;
                String s2 = (String) o2;

                int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
                //主要條件比完,需要比較次要條件排霉,防止重復元素
                if (num == 0) {
                    return s1.compareTo(s2);
                }
                return num;
            }
        });

        ts.add("a");
        ts.add("sff");
        ts.add("sdfsfsf");
        ts.add("sgdggse");

        Iterator it = ts.iterator();
        while (it.hasNext())

        {
            System.out.println(it.next());
        }
    }
}

//比較字符串長度
//class StringLenCompare implements Comparator {
//    public int compare(Object o1, Object o2) {
//        String s1 = (String) o1;
//        String s2 = (String) o2;
//
//        int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
//        //主要條件比完窍株,需要比較次要條件,防止重復元素
//        if (num == 0) {
//            return s1.compareTo(s2);
//        }
//        return num;
//    }
//}
Map
  • Map框架圖:
Map結(jié)構(gòu)圖.png
  • Map<K,V>:K--此映射所維護的鍵的類型攻柠;V--映射值的類型球订。

  • Map集合存儲鍵值對,一對一對存取瑰钮,而且要保證鍵的唯一性冒滩。

  • Hashtable:底層是哈希表數(shù)據(jù)結(jié)構(gòu),不可以存入null鍵null值浪谴。該集合是線程同步的开睡。效率低。

  • HashMap:底層是哈希表數(shù)據(jù)結(jié)構(gòu)较店,允許使用null鍵null值士八,該集合是不同步的。效率高梁呈。

  • TreeMap:底層是二叉樹數(shù)據(jù)結(jié)構(gòu)婚度,線程不同步」倏ǎ可以用于Map集合中鍵進行排序蝗茁。
    Set集合的底層使用了Map集合功能。

package com.sergio.Collections;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by Sergio on 2015/1/22.
 */
public class MapIntroduction {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        //添加元素寻咒,當存入鍵時相同時哮翘,存入的新值會覆蓋原來的值。當存入鍵時相同時毛秘,put會返回原來鍵所對應的值饭寺。
        map.put("01", "yiyi");
        map.put("01", "lier");
        map.put("03", "lisi");

        sop(map.containsKey("02")); //是否包含鍵為02的值
        sop(map.remove("02")); //根據(jù)鍵刪映射值

        sop(map.get("01")); //根據(jù)鍵獲取映射值.也可以通過get方法的返回值判斷一個鍵是否存在,通過返回null判斷

        Collection<String> coll = map.values();
        sop(coll); //獲取mao集合中所有的值
    }

    public static void sop(Object obj) {
        System.out.println(obj);
    }
}
  • Map中另外兩種獲取元素的方式:
  1. keySet:將Map中所有的鍵存入到Set集合叫挟,而Set集合具有迭代器功能艰匙,可以通過此方式獲取所有的鍵,再根據(jù)get方法抹恳,獲取每一個鍵對應的值员凝。
  2. Set<Map.Entry<k,v>> entry:將Map集合中的映射關系存入到了Set集合中,而這個關系的數(shù)據(jù)類型是:Map.Entry奋献。Map.Entry的關系具體實現(xiàn)是:Entry做為Map接口的內(nèi)部接口存在健霹,其中包含getKey和getValue的方法旺上,通過這兩種方法可以獲取鍵和值。
package com.sergio.Collections;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * Map集合中的兩種獲取元素方式
 * Created by Sergio on 2015/1/22.
 */
public class MapGetSet {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("01", "yiyi");
        map.put("02", "lier");
        map.put("03", "lisi");
        //將Map集合中的映射關系取出糖埋,存入到Set集合中.這種關系類型為Map.Entry宣吱。
        //再通過Map.Entry關系接口中定義的方法getKey和getValue獲取關系中的鍵和值
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, String>> it = entrySet.iterator();
        while (it.hasNext())
        {
            Map.Entry<String, String> me = it.next();
            String key = me.getKey();
            String values = me.getValue();

            System.out.println(key + ":"+ values);
        }

        //先獲取mao集合的所有鍵的Set集合,keySet
        Set<String> keySet = map.keySet();
        //根據(jù)Set集合阶捆,獲取迭代器
        Iterator<String> it1 = keySet.iterator();
        while(it1.hasNext())
        {
            String key = it1.next();
            //結(jié)果為key的結(jié)果集
            String values = map.get(key);
            System.out.println("key: " + key + "values" + values);
        }
    }
}

練習:

package com.sergio.Collections;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * HashMap練習:公民信息有姓名凌节、年齡、住址洒试。用HashMap存儲公民信息,姓名朴上、年齡相同被視為同一個公民垒棋。公民年齡具有自然比較。
 * Created by Sergio on 2015/1/22.
 */
public class HashMapTest {
    public static void main(String[] args) {
        Map<Citizen, String> hm = new HashMap<Citizen, String>();
        hm.put(new Citizen("lisi", 23), "chengdu");
        hm.put(new Citizen("haili", 34), "xian");
        hm.put(new Citizen("wangi", 53), "beijing");

        Set<Citizen> set = hm.keySet();
        Iterator<Citizen> it = set.iterator();
        while (it.hasNext()) {
            Citizen ct = it.next();
            String str = hm.get(ct);
            System.out.println(ct + str);
        }
    }
}


class Citizen implements Comparable<Citizen> {
    private String name;
    private int age;

    Citizen(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int compareTo(Citizen s) {
        int num = new Integer(this.age).compareTo(s.getAge());
        if (num == 0) {
            return this.name.compareTo(s.getName());
        }
        return num;
    }

    public int hashCode() {
        return name.hashCode() + age * 34;
    }

    public boolean equals(Object obj) {
        //        if (this == obj) {
        //            return true;
        //        }
        if (!(obj instanceof Citizen)) {
            throw new ClassCastException("輸入類型與公民類型不匹配");
        }
        Citizen s = (Citizen) obj;
        return this.name.equals(s.getName()) && this.age == s.getAge();
    }

    @Override
    public String toString() {
        return "Citizen{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }
}
package com.sergio.Collections;

import java.util.*;

/**
 * TreeMap練習痪宰,創(chuàng)建比較器類叼架,讓公民的名字具有比較器。
 * Created by Sergio on 2015/1/23.
 */
public class TreeMapTest {
    public static void main(String[] args) {
        Map<Citizen, String> hc = new TreeMap<Citizen, String>(new MyCompareTo());
        hc.put(new Citizen("abc", 23), "beijing");
        hc.put(new Citizen("wabc", 33), "shanghai");
        hc.put(new Citizen("sabc", 43), "chengdu");

        Set<Map.Entry<Citizen, String>> tm = hc.entrySet();

        Iterator<Map.Entry<Citizen, String>> it = tm.iterator();
        while (it.hasNext()) {
            Map.Entry<Citizen, String> me = it.next();
            Citizen cname = me.getKey();
            String add = me.getValue();
            System.out.println(cname + add);
        }
    }
}

//自定義比較器類
class MyCompareTo implements Comparator<Citizen> {
    @Override
    public int compare(Citizen o1, Citizen o2) {
        int num = o1.getName().compareTo(o2.getName());
        if (num == 0) {
            return new Integer(o1.getAge()).compareTo(o2.getAge());
        }
        return num;
    }
}
package com.sergio.Collections;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

/**
 * 集合嵌套練習
 * Created by Sergio on 2015/2/11.
 */
public class CollectionInCollection {
    public static void main(String[] args) {
        demo();
    }

    //參考集合嵌套書寫
    public static void demo() {
        HashMap<String, List<Car>> jhqt = new HashMap<>();
        List<Car> jc = new ArrayList<Car>();
        List<Car> pc = new ArrayList<Car>();

        jhqt.put("轎車", jc);
        jhqt.put("跑車", pc);

        jc.add(new Car("0111", "zhangsa"));
        jc.add(new Car("023444", "lisi"));
        pc.add(new Car("0234", "wangwu"));
        pc.add(new Car("01234", "maliu"));
        //迭代器獲取車信息
        Iterator<String> it = jhqt.keySet().iterator();
        while (it.hasNext()) {
            String carName = it.next();
            List<Car> name = jhqt.get(carName);

            System.out.println(carName);
            getInfo(name);
        }
    }

    //獲取list集合中的信息
    public static void getInfo(List<Car> list) {
        Iterator<Car> it = list.iterator();
        while (it.hasNext()) {
            Car c = it.next();
            System.out.println(c);
        }
    }

    //獲取嵌套集合中車信息方式
//    public static void getCarInfo(HashMap<String, String> carMap) {
//        Iterator<String> it = carMap.keySet().iterator();
//        while (it.hasNext()) {
//            String id = it.next();
//            String name = carMap.get(id);
//            System.out.println(id + "::::" + name);
//        }
//    }
}


class Car {
    private String id;
    private String name;

    Car(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String toString() {
        return id + ":::::" + name;
    }
}
Collections工具類
  • 此工具類中的方法定義的都是靜態(tài)方法衣撬,共享性數(shù)據(jù)乖订,沒有提供構(gòu)造函數(shù)。
  • public static <T extends [Comparable<? super T>> void sort([List<T> list):集合工具類中的List集合排序方法具练,<T extends [Comparable<? super T>>表示類型限定是Comparable的子類乍构,接受的類型是子類或者子類的父類。
  • Collection和Collections的區(qū)別:
  1. Collection是集合框架的一個頂層接口扛点,定義了單列集合的共性方法哥遮,兩個重要的子接口List(對元素都有定義索引。有序陵究,元素可重復)眠饮、Set(元素不重復,無序)铜邮。
  2. Colections是集合框架中的一個工具類仪召,該類的方法都是靜態(tài)的,提供對list等集合進行排序松蒜,二分查找等方法扔茅,通常常用的集合都是線程不安全的,當多線程操作這些集合時牍鞠,可以使用該工具類將線程不安全的集合轉(zhuǎn)換成安全同步的咖摹。
package com.sergio.CollectionsUtils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 工具類使用。排序方法介紹
 * Created by Sergio on 2015-02-23.
 */
public class IntroductionCollections {
    public static void main(String[] args) {
        sortDemo();
        maxDemo();
        fillDem();
        reverseDemo();
    }

    //排序
    public static void sortDemo() {
        List<String> list = new ArrayList<>();

        list.add("absdf");
        list.add("bsdfdf");
        list.add("osdf");

        sop(list);
        //工具類排序难述,數(shù)組實現(xiàn)的重復元素排序按索引排序
        Collections.sort(list);
        ////工具類排序.自定義比較器
        Collections.sort(list, new StrLenComparator());
        sop(list);
    }

    //求最大值.
    public static void maxDemo() {
        List<String> list = new ArrayList<>();

        list.add("absdf");
        list.add("bsdfdf");
        list.add("osdf");
        list.add("zzz");


        sop(list);
        //按自然排序求最大值
        String max2 = Collections.max(list);
        //自定義比較器排序求最大值
        String max = Collections.max(list, new StrLenComparator());
        sop(max);
        sop(max2);
    }

    //二分查找.集合必須是有序的
    public static void binarySearchDemo() {
        List<String> list = new ArrayList<>();

        list.add("absdf");
        list.add("bsdfdf");
        list.add("osdf");
        list.add("zzz");
        //先進性排序
        Collections.sort(list);

        sop(list);
        int index = Collections.binarySearch(list, "zzz");
        sop("index " + index);
    }

    //將集合中的元素全部替換成指定元素
    public static void fillDem() {
        List<String> list = new ArrayList<>();

        list.add("absdf");
        list.add("bsdfdf");
        list.add("osdf");
        list.add("zzz");

        sop(list);
        Collections.fill(list, "ppp");
        sop(list);
    }

    //替換指定區(qū)間的元素
    public static void fillDemo2(List<String> list, int start, int end, String str) {
        List<String> list1 = new ArrayList<>();

        list1.add("absdf");
        list1.add("bsdfdf");
        list1.add("osdf");
        list1.add("zzz");

        List<String> subList = list.subList(start, end);
        Collections.fill(subList, str);
        sop(list);
    }

    //反轉(zhuǎn)集合元素
    public static void reverseDemo() {
        List<String> list = new ArrayList<>();
        list.add("sdf");
        list.add("sdfsdf");
        list.add("weri");

        Collections.reverse(list);
        sop(list);
    }

    public static void sop(Object obj) {
        System.out.println(obj);
    }
}


//自定義比較器
class StrLenComparator implements Comparator<String> {
    public int compare(String s1, String s2) {
        if (s1.length() > s2.length()) {
            return 1;
        }
        if (s1.length() < s2.length()) {
            return -1;
        }
        return s1.compareTo(s2);
    }
}
Arrays工具類
package com.sergio.Arrays;

import java.util.Arrays;
import java.util.List;

/**
 * 數(shù)組變集合
 * Created by Sergio on 2015-02-23.
 */
public class ArrayToCollection{
    public static void main(String[] args) {
        String[] str = {"1", "2", "5"};

        /**
         * 將數(shù)組變成list集合:
         * 變成list集合后可以使用集合的思想和方法來操作數(shù)組中的元素萤晴。
         * 注意:不可以使用集合的增刪方法吐句。因為數(shù)組的長度是固定的。
         */
        List<String> list = Arrays.asList(str);
        System.out.println("包含:" + list.contains("4"));
        System.out.println(list);

        /**
         * 如果數(shù)組中的元素都是對象店读,那么變成集合時嗦枢,數(shù)組中的元素就直接轉(zhuǎn)換成集合中的元素。
         * 如果數(shù)組中的元素都是基礎數(shù)據(jù)類型屯断,那么會將數(shù)組作為集合中的元素存在文虏。
         */
        int[] num = {1, 2, 6};
        List<int[]> li = Arrays.asList(num);
        System.out.println(li);

    }
}
package com.sergio.Arrays;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 集合轉(zhuǎn)數(shù)組.當集合元素數(shù)限定,轉(zhuǎn)成數(shù)組不可操作增刪操作殖演,非常有用
 * Created by Sergio on 2015-02-23.
 */
public class CollectionToArray {
    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<>();
        al.add("acb1");
        al.add("abc2");
        al.add("abc3");
        //數(shù)組的大小為集合元素的空間大小
        String[] arr = al.toArray(new String[al.size()]);
        System.out.println(Arrays.toString(arr));
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氧秘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子趴久,更是在濱河造成了極大的恐慌丸相,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彼棍,死亡現(xiàn)場離奇詭異灭忠,居然都是意外死亡,警方通過查閱死者的電腦和手機座硕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門弛作,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人华匾,你說我怎么就攤上這事映琳。” “怎么了瘦真?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵刊头,是天一觀的道長。 經(jīng)常有香客問我诸尽,道長原杂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任您机,我火速辦了婚禮穿肄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘际看。我一直安慰自己咸产,他們只是感情好,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布仲闽。 她就那樣靜靜地躺著脑溢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屑彻,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天验庙,我揣著相機與錄音,去河邊找鬼社牲。 笑死粪薛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的搏恤。 我是一名探鬼主播违寿,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼熟空!你這毒婦竟也來了藤巢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤息罗,失蹤者是張志新(化名)和其女友劉穎菌瘪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阱当,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年糜工,在試婚紗的時候發(fā)現(xiàn)自己被綠了弊添。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡捌木,死狀恐怖油坝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刨裆,我是刑警寧澤澈圈,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站帆啃,受9級特大地震影響瞬女,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜努潘,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一诽偷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疯坤,春花似錦报慕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菌瘫,卻和暖如春蜗顽,著一層夾襖步出監(jiān)牢的瞬間布卡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工诫舅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羽利,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓刊懈,卻偏偏與公主長得像这弧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虚汛,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法匾浪,類相關的語法,內(nèi)部類的語法卷哩,繼承相關的語法蛋辈,異常的語法,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • title: java集合框架學習總結(jié) tags:集合框架 categories:總結(jié) date: 2017-03...
    行徑行閱讀 1,676評論 0 2
  • 概述 Java集合框架由Java類庫的一系列接口将谊、抽象類以及具體實現(xiàn)類組成冷溶。我們這里所說的集合就是把一組對象組織到...
    absfree閱讀 1,251評論 0 10
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 870評論 0 1
  • 發(fā)現(xiàn) Finder 中左側(cè)導航欄的桌面圖標變成了英文的,其他都是漢字 轉(zhuǎn)換成中文的方法:在Desktop文件夾中創(chuàng)...
    千罹閱讀 824評論 0 0