java集合框架(黑馬程序員)

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

如何在java中存儲大量數據?我們想到的是java的集合,也叫容器。集合類都是繼承Collection接口的。所以我們首先分析Collection接口。Collection口中有很多方法,是其他類通用的,所以其他子框架一樣!

//collection都有兩個構造方法:1不帶參數的。2帶參數的且參數爲另一個同類集合
	public static void collectionDemo_1()
	{
		Collection<String> col = new ArrayList<String>();
		//Collection<String> col2 = new ArrayList<String>(col);
		col.add("hello");
		col.add("java");//用於增加一個元素。
		System.out.println(col.contains("java"));//用於測試是否包含該元素。
		//下面的代碼爲toarray的用法:轉化到一個數組中。
		String[] str = new String[col.size()];
		col.toArray(str);
		for(String s:str)
		System.out.println(s);
		
		col.clear();//用於清空所有元素。
		System.out.println(col.size());//size是測試集合的大小,返回個數!
	}

那麼還是有幾點要說:1.爲什麼用Collection作爲類型?這是面向接口編程,高手都是這麼玩的,呵呵。面向接口可以方便後續程序的通用性。假如我要修改ArrayList爲LinkedList那麼只修該處即可。十分方便!2.這些方法都是通用的,其他的集合中都是可用的!

下面來了解各個詳細的集合吧:

1ArrayList 那麼先看一下demo:

public static void collectionDemo_2()
	{
		List<String> mylist = new ArrayList<String>();
		mylist.add("i");
		mylist.add("you");
		mylist.add(1, "love");//這個方法有個重載,在index處添加element。
		mylist.set(2, "her");//該方法所作用是去替換元素!
		System.out.println(mylist.get(1));//得到元素!
		System.out.println(mylist.indexOf("love"));//找出下標,
		for(Iterator<String> it = mylist.iterator();it.hasNext();)
		{
			//it.remove();該方法可以移除取到元素!
			System.out.println(it.next());
		}
		//在Collection中都有iterator但是list接口下有ListIterator。以實現add和set
		for(ListIterator<String> it = mylist.listIterator();it.hasNext();)
		{   
			it.next();
			it.set("haha");
		}
		System.out.println(mylist);	
	}

依舊是代碼中告訴我們應該怎麼用ArrayList,其實相比較一下與Collection的區別,就是多了一個get,set的方法,細想一下爲什麼呢?其是ArrayList的底層結構就是數組,快捷的訪問與修改,那麼必然會有set與get了。增加了方便性!

另一點就是在Iterator了。list接口下增加了ListIterator。其中可以有set,add,和remove方便了程序的書寫!

2LinkedList的方法沒有什麼特殊的,就是多了幾個首尾元素的操作方法!

public static void collectionDemo_3()
	{
		LinkedList<String> mylist = new LinkedList<String>();
		mylist.add("shit");
		mylist.add("shut");
		mylist.add("up");
		mylist.addFirst("lin");//以前的方法在鏈表首尾增加元素!
		mylist.addLast("!");
		mylist.removeFirst();//以前的方法在鏈表的首尾刪除元素!
		mylist.removeLast();
		System.out.println(mylist.getFirst());
		System.out.println(mylist.getLast());
		//新的一些方法
		String str = mylist.peek();
		String str1 = mylist.peekFirst();//獲取list的首尾元素,但不刪除。
		String str2 = mylist.peekLast();//唯一的區別是當list爲空時返回null!
		
		String mystr = mylist.pollFirst();//獲取並移除該元素!
		String mystr1 = mylist.pollLast();
		
		for(Iterator<String> it = mylist.iterator();it.hasNext();)
		{
			System.out.println(it.next());
		}
	}
LinkedList的方法中,體現出了他的底層結構的特點:鏈表的操作,主要是對首尾元素的操作,因爲要作爲棧和隊列的體現。那麼如果要在首尾添加元素用:addFirst和addLast。刪除用:removeFrist和rermoveLast。要取出元素時候用:peekFrist和peekLast。或者pollFrist和polllast唯一的區別就是,你是取出該元素的時候是否要刪除該元素!

3Vector是一個不常用的東東,但他有一個特殊的迭代器:枚舉迭代器Enumeration

	public static void collectionDemo_4()
	{
		Vector<String> v = new Vector<String>();
		v.add("this");
		v.add("is");
		v.add("vector");
		for(Enumeration<String> en = v.elements();en.hasMoreElements();)
		{
			System.out.println(en.nextElement());
		}
	}
vector的enumeration迭代和iterator一樣。

上面就是幾個重要的list接口下的類ArrayList呢是不同步的。Vector是同步的。數據增長:當需要增長時,Vector默認增長爲原來一培,而ArrayList卻是原來的一半 。 

4hashSet

public static void collectionDemo_5()
	{
		HashSet<person> hc = new HashSet<person>();
		hc.add(new person("lisi",33));
		hc.add(new person("wangwu",22));
		hc.add(new person("zhaoliu",11));
		for(Iterator<person> it = hc.iterator();it.hasNext();)
		{
			System.out.println(it.next());
		}
	}
}
class person
{
	private String name;
	private int age;
	person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public String toString()
	{
		return name+""+age;
	}
	public int hashCode()
	{
		return 60*age;
	}
	public boolean equals(Object obj)
	{
		person p = (person)obj;
		if(p.name.equals(name)&&(p.age == age) )
		return true;
		else return false;
	}
}
關於HashSet沒有什麼特殊的東西,就是set的作用是哈希表爲底層的,他主要就是不可以存儲同一個元素或者對象!所以一個對象進入檢查時,要首先看他的hashcode,然後再比較equals方法。關於覆蓋不覆蓋就要看你的代碼了。隨機應變!

5.TreeSet也是有set集合來的,所以喲加入了主要是排序功能!

我們擴展一下剛纔的person讓他繼承implments comparable接口那麼就可以比較兩個對象了,而且comparable接口也是作爲TreeSet集合傳入的必要接口!所以在實現compareTo(Object o)

	public int compareTo(Object o) {
		person p = (person)o;
		if(p.age > age)
			return 1;
		else if (p.age == age)
 		return 0;
		else 
			return -1;
	}
所以有了TreeSet的demo
public static void collectionDemo_6()
	{
		TreeSet<person> ts = new TreeSet<person>(new mycompare());
		ts.add(new person("zhansannn",11));
		ts.add(new person("lisi",22));
		ts.add(new person("wangwu",14));
		ts.add(new person("zhaoliu",18));
		for(Iterator<person> it = ts.iterator();it.hasNext();)
		{
			System.out.println(it.next());
		}
	}
作爲上面的方法,重要的是結論,在會用你的compareTo的方法比較對象。所以會有按年齡排序。那麼又有了一個需求,如果你的類不讓你implments但是你又要進行比較器compartor的使用!也就是說你要有一個比較器類,implments compartor接口。所以覆蓋compare(Object o1,ObjectO2)

class mycompare implements Comparator
{

	@Override
	public int compare(Object o1, Object o2) {
		person p1 = (person)o1;
		person p2 = (person)o2;
		if(p1.name.length() > p2.name.length())
		return 1;
		else if(p1.name.length() < p2.name.length())
			return -1;
		else return 0;
	}
	
}
所以關鍵是排序問題的話,你就可以用TreeSet集合了!所以到目前爲止,你要了解結合的每個作用,然後再活學活用!

6.Map的主要是HashMap,HashTable,TreeMap爲重點其中:

HashMap:哈希表數據結構,爲同步的,不允許存儲null的鍵值對。

HashTable:哈希表數據結構,爲不同步的,允許存儲null的鍵值對。

TreeMap:二叉樹數據結構,線程不同步,可以給map中的鍵排序。

	public static void collectionDemo_7()
	{
		HashMap<String,String>  hm = new HashMap<String,String>();
		hm.put("en", "11");//map中特有的添加方法。
		hm.put("cn", "33");
		hm.put("kt", "22");
		System.out.println(hm.containsKey("cn"));//是否包含該鍵
		System.out.println(hm.get("en"));//通過鍵的來獲取值。
		System.out.println(hm.values());//獲取所有的值得映射表
		hm.clear();//清空,清空一個用remove
		System.out.println(hm.size());//獲取鍵值對的個數
	}
但是我們始終沒有迭代器來迭代,於是我們看到Set keySet();返回一個存儲鍵的Set集合。於是

		Set<String> s = hm.keySet();
		for(Iterator<String> it = s.iterator();it.hasNext();)
		{
			System.out.println(it.next());
		}

通過Set遍歷,你還可以在裏面通過get()來獲取值;所以keyset可以滿足你的需要!

另外Map集合還提供了entrySet來提供全部邏輯映射的訪問!

public static void collectionDemo_8()
	{
		HashMap<String,String>  hm = new HashMap<String,String>();
		hm.put("en", "11");//map中特有的添加方法。
		hm.put("cn", "33");
		hm.put("kt", "22");
		Set<Map.Entry<String, String>> ens = hm.entrySet();
		for(Iterator<Map.Entry<String, String>> it = ens.iterator();it.hasNext();)
		{
			Map.Entry<String, String> s = it.next();
			System.out.println(s.getValue()+"----"+s.getKey());
		}
	}
由於返回值爲Map.Entry<k,v>的對象所以,你必須去用getKey和getValue才能獲得鍵值對!

上述就是集合類的東西,要活學活用!


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







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