泛型和hashmap,treemapcode
泛型的使用是在jdk5.0以後加入的,其做用是在編譯器編譯程序前給虛擬機規定當前對象能夠編譯經過的類型,若是傳進的是非指定的對象,那麼編譯器就會報錯,泛型在編譯經過以後不會在運行的程序上體現出來,至關於被擦除了。對象
首先,先介紹泛型在集合中對象加入時的應用。接口
1泛型在建立集合上的適用字符串
public class Demo{get
public static void main(String[] args){編譯器
TreeSet<String> ts=new TreeSet<String>();虛擬機
ts.add("abc");hash
ts.add("bcd");it
ts.add("cde");io
}
}
上面程序中在建立集合時就直接以<String> 定義了該集合只能加入字符串,這樣就能保證集合裏的都是同一類型的對象,這也每每是咱們建立集合時所但願看到的。其餘幾種集合泛型的應用都是一致的。
當有二個不一樣的集合須要往一個選擇器裏傳入數據時,而且傳入的數據類型是未知的,這時須要在接受對象的放上加上通配符:
代碼:
public void print(Collection<?> c){
for (Iterator<?> iterator = c.iterator(); iterator.hasNext();) {
System.out.println(iterator.next());
}
}
這時遍歷集合裏對象的方法,可接受不一樣類型集合的傳入數據
2泛型在使用選擇器時的應用
TreeSet<String> ts=new TreeSet<String>(new MyComparator());
這裏提一點,選擇器是在當對象沒有重寫compareTo方法,並且沒法重寫,或者咱們不想要對象已經重寫的compareTo方法,須要本身的時使用。
上面程序語句中就是在建立集合時加入了選擇器,而且加了泛型String,這樣選擇器就知道哪一種類型的對象能夠進來。這樣的操做能夠免去編寫選擇器時對象的強制轉型。
3泛型在類 方法 靜態方法上以及接口上的應用
類:
public class New1 {
public static void main(String[] args) {
New001<String> n=new New001<>();
n.print("nihao");
n.print(111);
}
}
class New001<Q>{
public void print(Q q){
System.out.println(q);
}
}
上面是New001是一個泛型類,類型爲Q變量,本類中並無規定泛型的具體類型,肯定是在建立對象的時候,New001<String>這裏就肯定了泛型的類型,下面傳進的數據類型只能是String類型。
方法和靜態方法:
public <M>void print02(M m){
System.out.println(m);
}
方法上的泛型主要應用在這樣的狀況下:當你的方法的類型是不肯定的,或者說和類上的類型不是一致的,就須要在方法上定義泛型。
靜態方法的泛型必須是定義在方法上,緣由是靜態方法隨着類的加載而加載,對象還沒建立以前類上的泛型還沒加載,若是靜態方法的泛型定義在類上,那麼靜態方法中傳入的對象就沒意義了。
HashMap和treeMap
hashMap的底層和hashset的底層是同樣的,惟一不一樣的是,hashmap裏的對象不是單一的對象,而是有一個鍵,一個值對應起來的形式存在集合裏。
關於hash集合中自定義對象hashcode和equals方法的重寫和hashmap是一致的,不作總結了。treeMap也是如此
這裏主要總結hashmap和treeMap主要方法上的使用
這二種集合的對象是不能直接從集合中迭代出來,遍歷對象的方式有二種。
第一種:將集合中鍵的值用keyset取出來放入一我的set集合中,再經過遍歷這個set集合獲得key對象的遍歷,再由get(key)來獲取到values的對象遍歷。
代碼體現:
TreeMap<String, Integer> tm=new TreeMap<String, Integer>();
tm.put("dai", 1);
tm.put("aong", 3);
tm.put("bng", 2);
Set<String> s=tm.keySet();
for (Iterator<String> iterator = s.iterator(); iterator.hasNext();) {
Object obj=iterator.next();
System.out.println(obj);
System.out.println(tm.get(obj));
}
第二種是須要用到treemap的方法entrySet,將包含映射關係的鍵值存入set集合,這裏的對象類型爲Map.entry,這是map的一個內部類,存入set集合的對象的類型書寫爲set<Map.entry<xxx,xxx>>,
代碼體現以下:
public class New1 {
public static void main(String[] args) {
Teacher01 t1=new Teacher01("張三", 11);
Teacher01 t2=new Teacher01("王五", 13);
Teacher01 t3=new Teacher01("李四", 12);
TreeMap<Teacher01, String> tm=new TreeMap<Teacher01, String>();
tm.put(t1, "上海");
tm.put(t2, "北極");
tm.put(t3, "城都");
Set<Map.Entry<Teacher01, String>> s=tm.entrySet();
for (Iterator<Entry<Teacher01, String>> iterator = s.iterator(); iterator.hasNext();) {
Entry<Teacher01, String> e=iterator.next();
System.out.println(e.getKey());
System.out.println(e.getValue());
}
}
}
Tacher01是一個實現comparable接口,重寫compareTo方法的類。
Hashmap和treemap的區別就在於底層的對象存放形式,方法上並無區別,只需將teacher01類重寫equals方法便可。