黑馬程序員_Java集合-Collection接口

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

所謂的集合就是指 一個長度可以變化的類似於(或等於)數組的東西。

 Collection<T>接口有兩個子接口:List<T>和Set<T>

1.List

 List接口及其子類最大的特點就是允許元素重複。

·  List接口中最常見的三個子類:

      ArrayList<E>  此類最最常用。

      Vector<E>

      LinkedList<E>

ArrayList<E>

常用方法舉例:

1.add()增加元素

import java.util.*;

public class ArrayListDemo {

    public static void main(String[] args){

       List<String> array = new ArrayList<String>();

       array.add("Hello World");  // 在最後增加元素

       array.add("世界,你好!");

       array.add("Hello World");

       array.add(0,"cxy");   //在指定位置增加元素  下標從0開始

       System.out.println(array);  // ArrayList類已經重寫了toString方法

    }

}

   2.remove()刪除元素

  import java.util.*;

public class ArrayListDemo {

    public static void main(String[] args){

       List<String> array = new ArrayList<String>();

       array.add("Hello World"); 

       array.add("世界,你好!");

       array.add("Hello World");

       array.remove(2);  // 指定位置刪除  下標從0開始

       array.remove("世界,你好!");  //指定元素刪除

       array.clear();  //刪除所有元素

       System.out.println(array);  

    }

}

  

  ·  使用remove()方法刪除元素時  會拿指定的元素依次從集合第一個元素開始比較 如果比較的結果相同 可就刪除該元素。 比較的時候會調用equals()方法

·  因爲在String類中重寫了此方法 所以可以找到併成功刪除。

·  但是如果是用戶自定義類的匿名對象在沒有重寫equals()方法的前提下 就無法刪除這個匿名對象了。

equals()方法的重寫:

  public class Person {

    private String name;

    private int age;

    public Person(String name, int age){

       this.name = name;

       this.age =age;

    }

    public boolean equals(Object obj){

       if(this == obj)

           return true;

       if(!(obj instanceof Person))

           return false;

       Person temp = (Person) obj;

       if(this.name.equals(temp.name) && this.age == temp.age)

           return true;

       return false;

    }

這樣就可以把person的對象刪除了。
3.get()得到指定下標的元素:

import java.util.*;

public class ArrayListDemo {

    public static void main(String[] args){

       List<String> array = new ArrayList<String>();

       array.add("Hello World"); 

       array.add("世界,你好!");

       array.add("Hello World");

       for(int i=0; i<array.size(); i++)  // size()得到當前集合中元素個數

           System.out.print(array.get(i)+"、");  //獲得指定位置上的元素

    }

}

4.toArray()轉成數組:

import java.util.*;

public class ArrayListDemo {

    public static void main(String[] args){

       List<String> array = new ArrayList<String>();

       array.add("Hello World"); 

       array.add("世界,你好!");

       array.add("Hello World");

//轉換成指定數據類型的數組

       String[] str = array.toArray(new String[]{});

       for(String s : str)

           System.out.print(s+"  <-->  ");

    }

}

Vector<E>
Vector<E>的用法和ArrayList<E>用法一樣,他們的區別在於Vector<E>是線程安全的。  

所謂的線程安全就是指所有的方法都是用synchronized修飾。

使用此關鍵字修飾的方法同一時間只能被一個線程訪問 其他線程必須等待 因此就造成程序執行時間較長的缺點。  正因爲此 才說Vector類效率低 且是同步操作。 只有在一些對安全性要求高的場合下才考慮使用Vector類。

 

LinkedList<E>

LinkedList<E> 類表示一個鏈表類。 它實現了Queue< E >接口。

用法舉例:

import java.util.LinkedList;

public class LinkedListDemo {

    public static void main(String[] args){

       LinkedList<String> line = new LinkedList<String>();

       line.add("No.1");   //在表尾增加元素

       line.add(0,"No.2"); //在指定位置增加元素

       line.push("No.5");     //在表頭增加元素

       line.addFirst("No.3"); //在表頭增加元素

       line.addLast("No.4");  //在表尾增加元素

       System.out.println(line);

       System.out.println("只查看錶頭:"+line.getFirst());

       System.out.println("查看並刪除表頭:"+line.pop());

       System.out.println("只查看錶頭:"+line.peek());

       System.out.println("只查看錶尾:"+line.getLast());

       System.out.println("查看並刪除表尾:"

+line.remove(line.size()-1));

       String[] array = line.toArray(new String[]{});

       for(String str : array)

           System.out.print(str+"  ");

    }

}

  

ArrayList其實代表一個數組 數據存儲在一片連續的空間。 數據量小時使用此類。

LinkedList是代表鏈表 數據分散存儲在內存中的各個角落。 數據量稍大時使用此類。
 Set<E>接口
·  set接口及其子類最大的特點就是不允許元素重複。

·  set接口中最常見的兩個子類:

    1. HashSet< E > :無序排列 但是可以高速存取。

  2. TreeSet< E > : 自動排序。

 

HashSet<E>

如果想完整的使用HashSet<E>類 那麼最少要重寫equals()和hashCode()方法。

重寫hashCode()  用於獲得元素的存儲位置。

重寫equals() 用於在兩個元素的位置相同的時候 比較兩個元素是否相等。

  

範例:重寫hashCode().

    public int hashCode(){

       return this.name.hashCode()*age-age/100;

    }

內容胡亂寫就可以,前提是兩個不同對象的hashCode返回值不同就可以。

HashSet的一個特性:元素存儲位置是由元素的hash碼來確定的。它是無序存放的。

 

TreeSet< E >

和HashSet相比,此類多了一個自動排序的功能。 

但是 TreeSet的自動排序功能是有條件的:

    TreeSet<T> 中的 T 必須是實現了Comparable<T> 接口。

  否則 程序運行時拋異常。

範例:在Person類中實現Comparable<T>接口並重寫方法。

public int compareTo(Person arg0) {

       if(this.age>arg0.age)

           return 1;

       else if(this.age<arg0.age)

           return -1;

       else{

           return this.name.compareTo(arg0.name);

       }

    }

  

如果compareTo()方法返回0 則意味着正在比較的2個對象相等。

 而兩個對象相等在Set中是不允許出現的。

因此 重寫compareTo()方法時 要將對象的所有字段都進行比較。

要保證只有在兩個對象的各個屬性的值都相同的情況下才返回0。否則就返回1或-1。

 

集合的輸出

範例1:Iterator遍歷集合

import java.util.*;

public class Demo{

    public static void main(String[] args){

       Collection<String> array = new ArrayList<String>();

       array.add("No.45");

       array.add("No.15");

       array.add("No.23");

       array.add("No.14");

       array.add("No.65");

       array.add("No.12");

       Iterator<String> iter = array.iterator();

       while(iter.hasNext()){

           System.out.println(iter.next());

       }

    }

}

範例2:使用foreach遍歷集合

import java.util.*;

public class Demo{

    public static void main(String[] args){

       List<String> array = new ArrayList<String>();

       array.add("No.45");

       array.add("No.15");

       array.add("No.65");

       for(String str : array)

           System.out.println("☆"+str+"☆");

    }

}


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

詳細請查看:http://edu.csdn.net/heima

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