黑馬程式設計師-----泛型,Map集合
------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------
1.泛型初步
泛型:JDK1.5版本以後出現新特性。用於解決安全問題,是一個型別安全機制
好處
(1)將執行時期出現問題ClassCastException,轉移到了編譯時期。 方便於程式設計師解決問題。讓執行時問題減少,安全。
(2)避免了強制轉換麻煩。
什麼時候定義泛型類?
當類中要操作的引用資料型別不確定的時候,早期定義Object來完成擴充套件。現在定義泛型來完成擴充套件。
<span style="font-size:14px;">class GenericDemo { public static void main(String[] args) { ArrayList<String> al = new ArrayList<String>(); al.add("abc01"); al.add("abc0991"); al.add("abc014"); Iterator<String> it = al.iterator();//迭代器也得定義泛型 while(it.hasNext()) { String s = it.next();//不用強轉了 System.out.println(s+":"+s.length()); } } }</span>
2.泛型方法
泛型類定義的泛型,在整個類中有效。如果被方法使用,那麼泛型類的物件明確要操作的具體型別後,所有要操作的型別就已經固定了。為了讓不同方法可以操作不同型別,而且型別還不確定。那麼可以將泛型定義在方法上。
特殊之處:
靜態方法不可以訪問類上定義的泛型。如果靜態方法操作的應用資料型別不確定,可以將泛型定義在方法上
class Demo<T>//建立物件後才能明確這個T { public void show(T t) //泛型方法 { System.out.println("show:"+t); } public <Q> void print(Q q)//跟類的型別不一樣的方法 { System.out.println("print:"+q); } public static <W> void method(W t)//不寫泛型不行 //<W>寫在返回值型別前面,這是格式 { System.out.println("method:"+t); } } class GenericDemo4 { public static void main(String[] args) { Demo <String> d = new Demo<String>(); d.show("haha"); //d.show(4); 這個就不行了 d.print(5); //這個是能列印的不受類的影響 d.print("hehe"); Demo.method("hahahahha");//可以執行 } }
3.map概述
基本方法
新增。
put(K key, V value)
putAll(Map<? extends K,? extends V> m)
刪除。
clear()
remove(Object key)
判斷。
containsValue(Object value)
containsKey(Object key)
isEmpty()
獲取。
get(Object key)
size()
values()
set entrySet()
set keySet()
|--Hashtable:底層是雜湊表資料結構,不可以存入null鍵null值。該集合是執行緒同步的。jdk1.0.效率低。
|--HashMap:底層是雜湊表資料結構,允許使用 null 值和 null 鍵,該集合是不同步的。將hashtable替代,jdk1.2.效率高。
|--TreeMap:底層是二叉樹資料結構。執行緒不同步。可以用於給map集合中的鍵進行排序。
4.map的取出方式
(1)Set<k> keySet:將map中所有的鍵存入到Set集合。因為set具備迭代器。所有可以迭代方式取出所有的鍵,在根據get方法。獲取每一個鍵對應的值。
(2)Set<Map.Entry<k,v>> entrySet:將map集合中的對映關係存入到了set集合中,而這個關係的資料型別就是:Map.EntryEntry其實就是Map中的一個static內部介面。
為什麼要定義在內部呢?
因為只有有了Map集合,有了鍵值對,才會有鍵值的對映關係。關係屬於Map集合中的一個內部事物。而且該事物在直接訪問Map集合中的元素。
class MapDemo
{
public static void main(String[] args)
{
Map<String,String> map = new HashMap<String,String>();
map.put("02","zhangsan2");
map.put("03","zhangsan3");
map.put("01","zhangsan1");
map.put("04","zhangsan4");
//將Map集合中的對映關係取出。存入到Set集合中。
Set<Map.Entry<String,String>> entrySet = map.entrySet();
//用迭代器取Set集合中的對映關係
Iterator<Map.Entry<String,String>> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<String,String> me = it.next();
String key = me.getKey(); //取到鍵
String value = me.getValue(); //取到值
System.out.println(key+":"+value);
}
//下面這是另外一種方法先把所有的鍵放入Set集合
/*
//先獲取map集合的所有 鍵 的Set集合,keySet();
Set<String> keySet = map.keySet();
//有了Set集合。就可以獲取其迭代器。
Iterator<String> it = keySet.iterator();
while(it.hasNext())
{
String key = it.next();
//有了鍵可以通過map集合的get方法獲取其對應的值。
String value = map.get(key);
System.out.println("key:"+key+",value:"+value);
}
*/
}
}
5.map知識的擴充套件
用map集合裝下下面的內容。
"yureban" Student("01" "zhangsan");
"yureban" Student("02" "lisi");
"jiuyeban" "01" "wangwu";
"jiuyeban" "02" "zhaoliu";
一個學校有多個教室。每一個教室都有名稱。每個教室還都有學生物件
通過這個示例,要能夠對map集合元素的取出更加熟練
import java.util.*;
//這是個學生類
class Student
{
private String id;
private String name;
//一初始化就有id和name
Student(String id,String name)
{
this.id = id;
this.name = name;
}
//覆蓋toString有自己的列印方法
public String toString()
{
return id+":::"+name;
}
}
class MapDemo
{
public static void demo()
{
//建立一個對映,存入教室名,和教室裡學生的List集合
HashMap<String,List<Student>> czbk = new HashMap<String,List<Student>>();
//分別建立兩個教室集合存放學生
List<Student> reyu = new ArrayList<Student>();
List<Student> jiuye = new ArrayList<Student>();
czbk.put("yureban",reyu);
czbk.put("jiuyeban",jiuye);
reyu.add(new Student("01","zhagnsa"));
reyu.add(new Student("04","wangwu"));
jiuye.add(new Student("01","zhouqi"));
jiuye.add(new Student("02","zhaoli"));
//進行迭代,先將教室迭代出來
Iterator<String> it = czbk.keySet().iterator();
while(it.hasNext())
{
String roomName = it.next(); //這是key即教室名
//得到教室集合
List<Student> room = czbk.get(roomName);
System.out.println(roomName);
//呼叫方法迭代出學生
getInfos(room);
}
}
public static void getInfos(List<Student> list)
{
//迭代出每個學生物件
Iterator<Student> it = list.iterator();
while(it.hasNext())
{
Student s = it.next();
System.out.println(s);
}
}
}