1. 程式人生 > >集合知識點總結1

集合知識點總結1

集合就是一個已經封裝好的物件

集合三大介面

Collection 所有集合類的跟介面

Map 對映介面,存放鍵值對

Iterator 遍歷集合的迭代介面

Java的集合框架是由很多介面、抽象類、具體類組成的,都位於java.util包中。除Comparable位於Java.lang包


Collection單列集合的跟介面)<E>(泛型)1.2JDK版本

collection因為是介面不能例項化不能新建物件,所以要用實現類,那麼要父類引用指向子類物件。

list有序(存和取的順序一致),有索引可以儲存重複

ArrayList-字首告訴底層是陣列,LinkedList-字首告訴底層是連結串列實現的,Vector-字首底層也是陣列實現的,但是不遵循list命名。Vector出現比ArrayList要早,在JDK1.0版本的時候出現的,ArrayList則在1.2版本的時候出現的。

@SupperWarning(“rawtypes”,"unchecked")//保持型別,不檢查,但沒有加泛型,有一定的安全隱患

Collection a=new ArrayList();//父類引用指向子類物件
boolean b= a.add("abc");
boolean c=a.add(true);//自動裝箱new boolean(true);
boolean d=a.add(100);
boolean e=a.add(new Client(“李四”,23));//將Client類的封裝;
boolean f=a.add("abc")//能放進來重複的元素;
System.out.println(c);//==System.out.println(c.toString);實質上重寫了,要往上父類、爺爺類查詢。

return true;

return true;

return true;

return true;

return true;

[abc,true,100,Client[name=李四,age=23],abc]

如果是List集合一直返回true,因為可以儲存重複元素。如果是Set集合當儲存重複元素時候,就會返回false。

set無序(存和取的順序不一致),無索引不可以儲存重複,Set集合由Set介面和Set介面的實現類組成。Set介面繼承了Collection介面,因此包含Collection介面的所有方法。Set介面中的方法和Collection介面一致。

HashSet-底層雜湊演算法 TreeSet-底層二叉樹演算法

Set介面的常見實現類: 
HashSet:內部資料結構是雜湊表,是不同步的。 
HashSet如何保證該集合中元素的唯一性: 
是通過物件的hashCode和equals方法啊來完成物件的唯一性的。如果物件的hashCode值不同,那麼不用判斷equals方法,就直接儲存到雜湊表中。如果物件的hashCode值相同,那麼要再次判斷物件的equals方法是否為true。如果為true,視為相同元素,不存。如果為false。那麼視為不同元素,就進行儲存。 

如果元素儲存到HashSet集合中,必須覆蓋hashCode方法和equals方法。一般情況下,如果定義的類會產生很多物件,比如人,學生,書,通常都需要覆蓋equals方法和hashCode方法,建立物件判斷是否相同的依據。 
HashSet是無序的,但是下面的子介面LinkedHashSet是具有可預知迭代順序的set介面的雜湊表和連結串列實現的,有序。 
TreeSet:可以對Set集合中的元素進行指定順序的排序。是不同步的。 
TreeSet如何保證該集合中元素的唯一性: 
就是根據比較方法compareTo的返回結果是否是0,是0,就判定為相同元素,不存。

TreeSet對元素進行排序的方式一: 
讓元素自身具備比較功能,就需要實現Comparable介面。覆蓋CompareTo方法。 
如果不要按照物件中具備的自然順序進行排序。如果物件中不具備自然順序。這個時候可以使用TreeSet集合的第二種排序方式。 
TreeSet集合的第二種排序方式二: 
讓集合自身具備比較功能,定義一個類實現Comparator介面。覆蓋compare方法。將該類物件作為引數傳遞給TreeSet集合的建構函式。相對來說,這個方法比較常見。

HashSet例一:往hashSet集合中儲存Person物件,如果姓名和年齡相同,視為同一個人(相同元素)。 
先新建一類Person:

public class Person {  

    private String name;  
    private int age;  
    public Person() {  
        super();  

    }  
    public Person(String name, int age) {  
        super();  
        this.name = name;  
        this.age = age;  
    }  

    /** 
     * 覆蓋Object類中的hashCode方法。建立Person物件自己特點的雜湊值演算法。 
     */  
    public int hashCode(){  
        //System.out.println(this+"...hascode...");
        return name.hashCode() + age*27;//乘以27是為了儘量保證雜湊值唯一。  
    }  
    /**  
     * 覆蓋Object類中的equals方法,建立Person物件判斷是否相同的依據。 根據Person自身的特點來判斷。  
     */  
    public boolean equals(Object obj){  
        //System.out.println(this+"...equals..."+obj);  
        if(!(obj instanceof Person))  
            return false;  

        Person p = (Person)obj;  

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

    public String getName() {  
        return name;  
    }  

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

    public int getAge() {  
        return age;  
    }  

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

    @Override  
    public String toString() {  

        return name+":"+age;  
    }  

再新建HashSetTest類,進行儲存與取出Person物件的操作:
/*
往hashSet集合中儲存Person物件,如果姓名和年齡相同,視為同一個人(相同元素)。
 * */
public class HashSetTest {

    public static void main(String[] args) {
        HashSet hs=new HashSet();
        /*HashSet集合資料結構是雜湊表,所以儲存元素的時候,使用的元素的hashCode方法來確定位置,如果位置相同,再通過元素的equals來確定是否相同。*/
        hs.add(new Person("abc1",21));
        hs.add(new Person("abc2",22));
        hs.add(new Person("abc3",23));
        hs.add(new Person("abc4",24));
        hs.add(new Person("abc2",22));

        Iterator it=hs.iterator();
        while(it.hasNext()){
            Person p=(Person)it.next();//因為存入集合容器中的元素都會向上轉型為Object類,會丟失掉Person類的特有屬性,所以必須強制向下轉型為Person類,才可以拿到它的name和age屬性;另外,由於同時要拿兩個屬性,所以等於說it.next()取到的物件不止使用一次,必須用一個變數來接收。
            System.out.println(p.getName()+":"+p.getAge());
        }
    }
}

結果輸出為: 
abc3:23 
abc2:22 
abc4:24 
abc1:21

Java集合關係圖: