自從有了范型,Java的容器操作便利了不少,但因?yàn)檫€存在int,float這里原始數(shù)據(jù)類型而磨合得還不夠好.
例如下面的這個(gè)小例子:
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("1",1);
System.out.println(map.get("2"));
實(shí)際上map中并沒(méi)有鍵為"2"的值,不過(guò)代碼運(yùn)行正常,輸出為
null
現(xiàn)在來(lái)做一點(diǎn)小改動(dòng),
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("1",1);
int i=map.get("2");
System.out.println(i);
注意到只是用中間變量i暫時(shí)存放了一下取出的值,這個(gè)時(shí)候就會(huì)報(bào)錯(cuò)啦:
Exception in thread "main" java.lang.NullPointerException
仔細(xì)想想倒也覺(jué)得錯(cuò)得在理,因?yàn)椴淮嬖诘膶?duì)象可以以null來(lái)表示,但不存在的數(shù)字在Java中卻沒(méi)有對(duì)應(yīng)的表示(例如Ruby中就有NAN,表示這不是一個(gè)數(shù)字)。乍看之下好像也沒(méi)什么大不了,但是這樣的小缺陷使得在Java編程中想像一般類型一樣的來(lái)使用數(shù)字和容器變得不太可能,如果用一個(gè)容器來(lái)做數(shù)字的存取,則只能在取之前很小心的先查看使用的鍵值對(duì)是否已經(jīng)在容器中,而不能像一般對(duì)象的存取那樣,直接取出,通過(guò)結(jié)果來(lái)判斷罷了。
發(fā)現(xiàn)這個(gè)小紕漏僅在偶然間,JDK的文檔我看得不多,也許SUN的工程師早就在哪里提醒過(guò)大家了吧,只是我孤陋寡聞而已,大家看著玩玩。