018_經常使用API_集合

0.Java集合框架圖數組

  

 

1.集合類(Collection)數據結構

  (1)集合是存儲對象最經常使用的一種方式。框架

  (2)集合的特色:
    ①存儲對象
    ②集合長度可變
    ③集合不能夠存儲基本數據類型ide

   集合容器由於內部數據結構的不一樣,有多種具體容器,不斷的向上抽取,就造成了集合框架。。函數

  (3)框架的頂層Collection接口this

    Collection的常見方法:spa

    ①添加
      boolean add(E e) code

      boolean addAll(Collection c)

    ②刪除
      boolean remove(Object o)
      boolean removeAll(Collection c)
      void clear()
    ③判斷
      boolean contains(Object o)
      boolean containsAll(Collection c)
      boolean isEmpty() 對象

    ④獲取
      size() 返回此 collection 中的元素數
      Iterator iterator() 取出元素的方式,迭代器

    ⑤該對象必須依賴於具體容器,由於每個容器的數據結構都不一樣,因此該迭代器對象是在容器內部進行實現的。
     對於容器使用者而言,具體的實現方式不重要,只要經過容器獲取到該實現的迭代器對象便可,也就是iterator方法。
     Iterator接口就是對全部的Collection容器進行元素取出的公共接口。blog

  (4)其它

    boolean retainAll(Collection c) 取交集
    toArray() 將集合轉成數組

  (5)分支   

     --List:有序(存入和取出的順序一致),元素都有索引(角標),元素能夠重複。
     --Set:元素不能重複,無序。

 

2.List

  (1)List常見特有方法:

    ①添加
      void add(index,element);
      void add(index,collection);
    ②刪除
      Object remove(index);
    ③修改
      Object set(index,element);
    ④獲取
      Object get(int index);
      int indexOf(Object);
      int lastIndexOf(Object);
      List subList(from,to);

  (2)ListIterator接口

    在迭代過程當中,不要使用集合操做元素,容易出現異常。
    可使用Iterator接口的子接口ListIterator來完成迭代中對元素進行更多操做。

  (3)List常見

     --Vector:內部是數組數據結構,是同步的。

     --ArrayList:內部是數組數據結構,不一樣步,替代Vector。

     --LinkList:內部是鏈表數據結構,是不一樣步的。

       addFirst();

       addLast():
        jdk1.6
       offerFirst();
       offetLast();

       getFirst();.//獲取但不移除,若是鏈表爲空,拋出NoSuchElementException.
       getLast();
        jdk1.6
       peekFirst();//獲取但不移除,若是鏈表爲空,返回null.
       peekLast():

       removeFirst();//獲取並移除,若是鏈表爲空,拋出NoSuchElementException.
       removeLast();
        jdk1.6
       pollFirst();//獲取並移除,若是鏈表爲空,返回null.
       pollLast();

 

3.Set

  Set接口中的方法和Collection一致

  (1)HashSet:內部數據結構是哈希表,是不一樣步的。
    如何保證該集合的元素的惟一性呢?
      是經過對象的hashCode和equals方法來完成對象惟一性的。
      若是對象的hashCode值不一樣,那麼不判斷equals方法,就直接存儲到哈希表中。
      若是對象的hashCode值相同,那麼要再次判斷對象的equals方法。
    記住:
      若是元素要存儲到HashSet集合中,必須覆蓋hashCode方法和equals方法。
      通常狀況下,若是定義的類會產生不少對象,好比人,學生,書,一般都須要覆蓋
      equals,hashCode方法。創建對象判斷是否相同的依據。

public class Person extends Object {
    private int age;
    private String name;
    
    Person(String name,int age){
        this.age=age;
        this.name=name;
    }
    
    public boolean equals(Object e) {
        if(this==e)
            return true;
        
        if(!(e instanceof Person))
            return false;
            
        Person p=(Person)e;
        
        return (this.age==p.age)&&(this.name.equals(p.name));
        
    }
    
    public int hashCode()
    {
        return name.hashCode()+age*39;
    }
}

  (2)TreeSet:能夠對Set集合中的元素進行排序。是不一樣步的。
    判斷元素惟一性的方式,就是根據compareTo()比較方法返回結果是否爲0。

    ①TreeSet對元素進行排序的方式1:
      讓元素自身具有比較功能,就須要實現Comparable接口,覆蓋compareTo方法。

public class Person extends Object implements Comparable{
    private int age;
    private String name;
    
    Person(String name,int age){
        this.age=age;
        this.name=name;
    }
    
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        Person p=(Person)o;
        int temp=this.age-p.age;
        
        return temp==0?this.name.compareTo(p.name):temp;
    }
}

    ②TreeSet對元素進行排序的方式2:
      讓集合自身具有比較功能,定義一個類實現Comparator接口,覆蓋compare方法。
      將該類對象做爲參數傳遞給TreeSet集合的構造函數。

public class ComparatorByName implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        // TODO Auto-generated method stub
        String p1=(String)o1;
        String p2=(String)o2;
        
        int temp=p1.length()-p2.length();
        return temp==0?p1.compareTo(p2):temp;
    }

}
public class TreeSetTest{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TreeSet ts=new TreeSet(new ComparatorByName());
        
        ts.add("aaa");
        ts.add("ab");
        ts.add("abcd");
        ts.add("aaabbbb");
        
        Iterator it=ts.iterator();
        
        while(it.hasNext())
        {
            System.out.println(it.next());
        }        
    }
}

 4.集合的一些技巧

  (1)須要惟一嗎?

    須要:Set
    須要制定順序:
    須要: TreeSet
    不須要:HashSet
    可是想要一個和存儲一致的順序(有序):LinkedHashSet


    不須要:List
    須要頻繁增刪嗎?
    須要:LinkedList
    不須要:ArrayList

  (2)如何記錄每個容器的結構和所屬體系呢?

    看名字!

      List
        |--ArrayList
        |--LinkedList

      Set
        |--HashSet
        |--TreeSet

      後綴名就是該集合所屬的體系。

      前綴名就是該集合的數據結構。

      看到array:就要想到數組,就要想到查詢快,有角標.
      看到link:就要想到鏈表,就要想到增刪快,就要想要 add get remove+frist last的方法
      看到hash:就要想到哈希表,就要想到惟一性,就要想到元素須要覆蓋hashcode方法和equals方法。
      看到tree:就要想到二叉樹,就要想要排序,就要想到兩個接口Comparable,Comparator 。

      並且一般這些經常使用的集合容器都是不一樣步的。

相關文章
相關標籤/搜索