集合篇(Collection)

集合是什麼?簡單的說就是一種容器,用來裝載各種封裝後的數據,數組也能裝載數據,他和集合有什麼區別呢?簡單的說,數組是固定的,而集合卻是可以隨時根據需要增加,刪除,改變數據。
集合框架 看圖
這裏寫圖片描述
這是集合裏面包含的接口和實現類,我可能知道不是那麼多,只能將我學了的記下來
-List接口:存儲有序的,可以重複的元素.—相當於“動態”數組
常用方法 :刪除remove(int index) 修改set(int index,Object obj) 獲取get(int index)插入add(int index,Object obj)
主要實現類:-ArrayList(主要的實現類)
-LinkedList(更適用於頻繁的插入、刪除操作)

package collectior;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
/**此乃容器也,第一次接觸容器,容器一共有collectior(List、set(Hasset)),map(HasMap)這麼多接口
 * ArrayList:底層實現是數組,線程不安全,效率高。所以,查詢快,修改,插入,刪除慢。
 * LinkedList:底層實現是鏈表,線程不安全,效率高。所以,查詢慢。修改,插入,刪除快。
 * List與順序有關,而且可以重複
 * set與順序無關且不可以重複
 */
public class Test01 {
    public static void main(String[] args) {
        List list=new ArrayList();//父類指向子類的引用
        List list0=new LinkedList();//父類指向子類的引用 多態無時不在,面向接口編程
        list0.add("imiao");//向list0中添加一個字符串
        list0.add(new dog());//向list0中添加一個對象
        list0.remove(0);//刪除第0個元素
         for(int i=0;i<list0.size();i++){
             System.out.println(list0.get(i));
         }
        list.add("aaa");
        list.add(new Date());
        list.add(new dog());
        list.add(1234);//包裝類的:自動裝箱
        System.out.println(list.size());
        System.out.println(list.isEmpty());
       // list.remove("aaa");       //hasshoode和equals
       //System.out.println(list.size());
        List list2=new ArrayList();//父類指向子類的引用
        list2.add("bbb");
        list2.add("ccc");
        list.add(list2);
        System.out.println(list.size());
        //跟順序有關的操作
        String str=(String )list.get(0);
        System.out.println(str);
        list.set(1, "ababab");
        list.remove(0);
    }
}
class dog{
 public dog() {
System.out.println("this is dog");
 }
}
顯示結果
this is dog
collectior.dog@77f2fbff
this is dog
4
false
5
aaa

Set接口:存儲無序的,不可重複的元素。—相當於高中的“集合”概念
添加進Set集合中的元素所在的類一定要重寫equals() 和 hashCode()。要求重寫equals() 和 hashCode()方法保持一致。
1.無序性:無序性不等於隨機性。真正的無序性,指的是元素在底層存儲的位置是無序的。
2.不可重複性:當向Set中添加進相同的元素的時候,後面的這個不能添加進去。
HashSet(主要的實現類)
LinkedHashSet(是HashSet的子類,當我們遍歷集合元素時,是按照添加進去的順序實現的;頻繁的遍歷,較少的添加、插入操作建議選擇他)
TreeSet(可以按照添加進集合中的元素的指定屬性進行排序,默認升序)
添加進Set集合中的元素所在的類一定要重寫equals() 和 hashCode()。要求重寫equals() 和 hashCode()方法保持一致
兩個對象equals相等,那麼它的hashcode相等
兩個對象equals不相等,那麼它的hashcode並不要求它不相等,但一般建議不相等
hashcode相等不代表兩個對象相等(採用equals比較)

package collectior;

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

public class TestSet {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "小明";
        p1.age = 8;

        Person p2 = new Person();
        p2.name = "小紅";
        p2.age = 5;

        Person p3 = new Person();
        p3.name = "小紅";
        p3.age = 10;

        Set set = new HashSet();
        set.add(p1);
        set.add(p2);
        set.add(p3);

        for (Iterator iter=set.iterator(); iter.hasNext();) {
            Person p = (Person)iter.next();
            System.out.println("name=" + p.name + ", age=" + p.age);
        }

        System.out.println("p1.hashCode=" + p1.hashCode());
        System.out.println("p2.hashCode=" + p2.hashCode());
        System.out.println("p3.hashCode=" + p3.hashCode());
        Set set0 =new HashSet();
        set0.add("aaa");
        set0.add("ddd");
        set0.add(set);
        set0.add(new String ("aaa"));
        System.out.println(set0.size());//2,表明是不可以插入重複的數據的
        for (Iterator iter=set0.iterator(); iter.hasNext();) {
            System.out.println(iter.next());
        }
        /**
            * 3
            [(this Collection), aaa, ddd]
            aaa
            ddds
             *      
             */
    //表明輸出結果是無序的
        //set.remove("aaa");
        }

    }
    顯示結果:
    name=小明, age=8
    name=小紅, age=5
    p1.hashCode=756703
    p2.hashCode=762995
    p3.hashCode=762995
    3
    [collectior.Person@b8bdf, collectior.Person@ba473]
    aaa
    ddd

再來看一個treeSet的例子

package collectior;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class TesttreeSet {
    public static void main(String[] args) {
        Set set0 = new TreeSet();
        set0.add(1);
        set0.add(8);
        set0.add(5);
        set0.add(3);
        for (Iterator set=set0.iterator(); set.hasNext();) {
            int int1 = (int)set.next();//強制類型轉換成int
            System.out.print(int1+"\t");
        }
    }
}
顯示結果
1   3   5   8   按升序排序輸出


繼續排序 實現Comparable接口

package collectior;

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

public class TestSet {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "小明";
        p1.age = 8;

        Person p2 = new Person();
        p2.name = "小紅";
        p2.age = 5;

        Set set = new TreeSet();

        set.add(p1);
        set.add(p2);
        for (Iterator iter=set.iterator(); iter.hasNext();) {
            Person p = (Person)iter.next();
            System.out.println("name=" + p.name + ", age=" + p.age);
        }
        }

    }




    package collectior;

public class Person implements Comparable {//實現Comparable接口
        String name;
        int age;
        //重寫hashCode()
        public int hashCode() {
            return (name==null)?0:name.hashCode();  
        }   

        //重寫equals
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;    
            }
            if (obj instanceof Person) {
                Person p = (Person)obj;
                return this.name.equals(p.name);
            }
            return false;

        }

        public int compareTo(Object o) {//重寫copareTo()方法
            if (o instanceof Person) {
                Person p = (Person)o;
                //降序
                return ( p.age-this.age);

            }
            throw new IllegalArgumentException("非法參數,o=" + o);
        }

}

顯示結果:
name=小明, age=8
name=小紅, age=5

繼續排序 實現Comparator接口

package collectior;

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

public class TestSet {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "小明";
        p1.age = 8;

        Person p2 = new Person();
        p2.name = "小紅";
        p2.age = 5;
        //內部類實現Coparator方法,所謂內部類就是在new的同時把類給直接寫出來了 不需類名,卻可以訪問外部類的屬性和方法
        Set set = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (!(o1 instanceof Person)) {//instanceof的意思是檢查傳入的對象與原對象是否一致
                    throw new IllegalArgumentException("非法參數,o1=" + o1);
                }
                if (!(o2 instanceof Person)) {
                    throw new IllegalArgumentException("非法參數,o2=" + o2);
                }
                Person p1 = (Person)o1;
                Person p2 = (Person)o2;
                return p2.age - p1.age;
            }               
        });

        set.add(p1);
        set.add(p2);
        for (Iterator iter=set.iterator(); iter.hasNext();) {
            Person p = (Person)iter.next();
            System.out.println("name=" + p.name + ", age=" + p.age);
        }
        }

    }
    顯示結果:
    name=小明, age=8
    name=小紅, age=5

一個類實現了Camparable接口則表明這個類的對象之間是可以相互比較的,這個類對象組成的集合就可以直接使用sort方法排序。
Comparator可以看成一種算法的實現,將算法和數據分離

Map接口:存儲“鍵-值”對的數據 —-相當於高中的
key是不可重複的,使用Set存放。value可以重複的,使用Collection來存放。一個key-value對構成一個entry(Map.Entry),entry使用Set來存放
常用方法:添加put(Object key,Object value)
刪除remove(Object key)
獲取get(Object key) size() / keySet() values() entrySet()
HashMap:主要的實現類,可以添加null鍵,null值
LinkedHashMap:是HashMap的子類,可以按照添加進Map的順序實現遍歷
TreeMap:需要按照key所在類的指定屬性進行排序。要求key是同一個類的對象。對key考慮使用自然排序 或 定製排序

我不想舉例了。。。。。。
Iterator接口:用來遍歷集合Collection元素,foreach就是Iterator加入泛型後的產品
來了解一下這個類
Collections工具類:操作Collection及Map的工具類,大部分爲static的方法。
泛型 :這個就是C++中的函數模板,很相似,後面會夾帶出現,但就不單獨作爲一個點來細細記了
這篇好像寫得有點多了哦 ,我會加油的,博客的質量也會越來越好的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章