有道雲筆記 連接:
http://note.youdao.com/noteshare?id=62c062e791c11bc0e2a1e65fe4440696
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下可忽略:
一個圖,一個類,三個知識點,六個接口
多態,三個必要條件:繼承(實現)、方法重寫、父類引用指向子類對象
HashTable和Vector也是容器,老舊基本不用。使用時內部是鎖定的,效率低。
上圖,List是有序可重複集。什麼叫重複?
嚴格說,兩個對象不可能重複。儘管有時兩個對象中的數據值相等,但這些值是分別存在於堆中的,棧中存的對象引用也就不能相等(不會指向同一個內存地址)。==只在兩個對象的引用相等時才爲true,非常嚴格。
本章指的重複,只要兩個對象equals(),就算重複。
boolean contains(Object o),也是看equals(),相等了就算包含。
上圖,注意到boolean remove(Object o )方法是有參的,即不手動遍歷集合,即可把集合中某元素刪除。
上圖,用父類的引用初始化(指向)子類的對象,而不是ArrayList c = new ArrayList(),目的是:增加靈活性。這個對象c,將不能使用ArrayList特有的方法。這樣,在某時程序員發現c用LinkedList比ArrayList更合適時,只需改成Connection c = new LinkedList。
另外,Connection不能存基礎數據類型,只能用包裝類;但是支持將字符串作爲String對象直接存進去。
上圖,c.remove(new Integer(100))返回true,而c.remove(new Name(“f1”,”li”))返回false。因爲Name沒有重寫equals()方法,刪除時比較的是==(引用是否相等)。
上圖,hashCode是什麼? hashCode跟該對象的內存地址有關,非常適合做索引。兩個對象可以有相等的hashCode,這就需要重寫hashCode()方法。讓相等對象的hashCode相等,是因爲若一個對象作爲Map中的Key,索引的時候按的是Key對象的hashCode。
另外,例子中返回的是一個String的hashCode()方法。這是因爲String已經重寫了hashCode(),保證了相等即hashCode相等。
eg:Collection c = new ArrayList();
Iterator it = c.iterator();
上例,Iterator it = c.iterator() 體現了一種多態。Iterator接口只有三個方法;Collection的具體實現類(ArrayList等)都要重寫iterator()方法,返回的是一個Iterator接口的實現類,具體對應是Arraylist,裏面被重寫的三個方法是ArrayList具體的怎麼實現迭代;c.iterator()返回的迭代器是Iterator接口的具體實現類,當然可以用父類的引用指向子類對象,即Iterator it = c.iterator()。
上圖,在迭代過程中,只能用迭代器對象的remove(),而不能用集合類的remove(Object o)方法。原因是,迭代過程中,迭代器對當前迭代元素進行了“鎖定”。
上圖,增強的for循環:最大的(唯一)優點是,遍歷數組或集合語法簡便,適合於遍歷並打印集合內容。缺點有兩個:遍歷數組時,for( int i : arr ){ ...... },無法知道遍歷到當前元素的下標;遍歷集合時,不能刪除當前遍歷元素,這是因爲增強for循環內部機制是Iterator,跟其一樣會鎖定當前元素。
什麼時候用泛型?
API中查一查,類在聲明時加泛型的就可以在使用它時用泛型,聲明時沒泛型的不能用。