JavaSE學習筆記之-----集合


    一、什麼是集合

    二、Iterator 接口

    三、Set接口和List接口

    四、Comparable接口

    五、Map接口、泛型


一、什麼是集合

    我的理解是1、用來裝很多元素進去,便於管理,比如可以對其排序,添加刪除,元素查找起來很快等等;2、集合就是一個特殊的類,是實現了一些集合接口的特殊類,那既然是類,無非就是提供的方法比較針對集合的特點,但始終就是個類,這樣一來就很好理解什麼是集合了。

    Java中有幾類集合,各有特點,如下圖:



集合的根上的接口是Collection接口,然後有Set、List、和map。HashSet集合存儲的元素是沒有順序不可重複的,List是順序可以重複,而map裏面存放的是鍵值對(Key、Value)一個Key對應一個Value值。往Map裏面存元素的時候,如果Key值重複了,就會把該Key值對應的Value替換掉,所以Map當中也是沒有重複元素的。


注意:在做添加和刪除等方法的時候,元素對象必須要重寫Object的equals和hashCode方法,否則無法對對象進行比較。上例當中的String類和Integer類都已經重寫了equals和hashCode方法。

二、Iterator 接口

    所有實現了Collection接口的容器類都有一個叫做iterator的方法, 這個方法的返回值是一個對象,是Iterator類型的對象:

API文檔的描述(HashSet):





import java.util.*;
public class IteratorTest {
	public static void main(String[] args) {
		Name n1 = new Name("f1","h1");
		Name n2 = new Name("f2","h2");
		Name n3 = new Name("f3","h3");
		Set c1 = new HashSet();
		c1.add(n1);
		c1.add(n2);
		c1.add(n3);
		Iterator a = c1.iterator();
		System.out.println(c1);
		/****以下測試迭代器的刪除功能****/
		//每進行一次a.next,迭代器向右移動一個元素
		//迭代器的remove方法,是刪除現在迭代器所指向的元素(對象)
		while(a.hasNext()) {
			Name n = (Name)a.next();			
			if(n.getFirstName().equals("f2")) {
				a.remove();			
			}
		}	
		System.out.println(c1);
	}
}

class Name {
    private String firstName,lastName;
    public Name(String firstName, String lastName) {
        this.firstName = firstName; this.lastName = lastName;
    }
    public String getFirstName() {  return firstName;   }
    public String getLastName() {   return lastName;   }
    public String toString() {  return firstName + " " + lastName;  }
    
    public boolean equals(Object obj) {
	    if (obj instanceof Name) {
	        Name name = (Name) obj;
	        return (firstName.equals(name.firstName))
	            && (lastName.equals(name.lastName));
	    }
	    return super.equals(obj);
		}
		public int hashCode() {
		    return firstName.hashCode();
		}
				
}


三、Set接口和List接口






例子1:

import java.util.*;
public class ListTest {
	public static void main(String[] args) {
		List n1 = new LinkedList();
		for(int i=0;i<=5;i++) {
			n1.add("a"+i);
		}
		System.out.println(n1);
		n1.add(3,"a100");
		System.out.println(n1);
		n1.add(6,"a200");
		System.out.println(n1);
		System.out.print((String)n1.get(2)+" ");
		System.out.println(n1.indexOf("a3"));
		n1.remove(1);
		System.out.println(n1);
	}
}


例子2:

import java.util.*;
public class ListTest {
  public static void main(String[] args) {
    List n1 = new LinkedList();
    for(int i=0;i<=9;i++) {
      n1.add("a"+i);
    }
System.out.println(n1);
Collections.shuffle(n1);//隨機排序
System.out.println(n1);
Collections.reverse(n1);//逆序
System.out.println(n1);
Collections.sort(n1); //排序
System.out.println(n1);
System.out.println(Collections.binarySearch(n1,"a5"));//折半查找
}
}




四、Comparable接口

    所有可以進行排序的類,都實現了java.lang.Comparable接口,該接口當中只有一個方法:

    public int comparaTo(Object  obj);

    如果this對象與obj對象比較結果是相等的,返回0;this > obj ;返回正數;this < obj ;返回負數。

    實現了Comparable接口的類通過實現comparaTo方法從而確定該類對象的排序方式。

import java.util.*;

public class BasicContainer {
    public static void main(String[] args) {
        List c = new LinkedList();
        c.add(new Name("Karl","M"));
        c.add(new Name("Steven","Lee"));
        c.add(new Name("Tim","sar"));
        c.add(new Name("Leo","ok"));
        System.out.println(c);
        System.out.println();
        Collections.sort(c);
        System.out.println(c);
        
    }
}

class Name implements Comparable {
    private String firstName,lastName;
    public Name(String firstName, String lastName) {
        this.firstName = firstName; this.lastName = lastName;
    }
    public String getFirstName() {  return firstName;   }
    public String getLastName() {   return lastName;   }
    public String toString() {  return firstName + " " + lastName;  }
    
    public boolean equals(Object obj) {
	    if (obj instanceof Name) {
	        Name name = (Name) obj;
	        return (firstName.equals(name.firstName))
	            && (lastName.equals(name.lastName));
	    }
	    return super.equals(obj);
		}
		
		public int hashCode() {
		    return firstName.hashCode();
		}
			
		public int compareTo(Object o) {
        Name n = (Name)o;
        int lastCmp = 
            lastName.compareTo(n.lastName);
        return 
             (lastCmp!=0 ? lastCmp :
              firstName.compareTo(n.firstName));
    }
		
}


所實現的compareTo方法用來比較Name對象的大小,比較規則在具體實現裏面。


五、Map接口、泛型

    該接口是用來存儲鍵值對的(Key、Value),實現類包括HashMap、TreeMap等,鍵值不能重複。

import java.util.*;

public class MapTest {
	public static void main(String[] args) {
		Map<String,Integer> m1 = new HashMap<String,Integer>();
		Map<String,Integer> m2 = new HashMap<String,Integer>();
		m1.put("one", 1);
    m1.put("two", 2);
    m1.put("three", 3);
    m2.put("four", 4);
    m2.put("five", 5);
    m2.put("three", 3);
    System.out.println(m1);
    System.out.println(m1.size());
    System.out.println(m1.containsKey("one"));
    
		Map<String,Integer> m3 = new HashMap<String,Integer>(m1);
    System.out.println(m3);
    m3.putAll(m2);
    System.out.println(m3);
	}
}



    1、泛型。本來往容器裏面添加的元素只要是對象就可以了,但是這樣無法限制這個容器裏面不產生錯放的對象,比如,我這個容器時用來存放“狗”這個對象的,結果被放進一個“衣服”這個對象,如果不使用泛型的話,這個錯誤就不會被發現,(在編譯的時候不會被編譯器發現)而且每一次從容器裏面拿東西出來,都要進行類型的強制轉換才保險。泛型的使用方法很簡單,就是在接口和類後面添加尖括號<>,指明往容器裏面添加的對象的類型。在上例當中可以看到使用方法。

    2、在合適的時機自動打包解包

    本來添加鍵值後面的數字1、2、3等等,需要把數字封裝成對象才能添加到容器裏面,所以正常的方法,添加的時候應該是:Integer(1)、Integer(2)等等,但是現在寫程序不用這樣寫,直接寫1、2、3,編譯器會自動打包解包。

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