------- 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的demopublic 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培訓、期待與您交流! ----------