1、為什么使用集合框架
當我們并不知道程序運行時會需要多少對象,或者需要更復(fù)雜方式存儲對象——可以使用java集合框架
2、Java集合框架包含的內(nèi)容
接口:(父類)Collection接口下包含List(子類 )接口和Set(子類)接口 L
ist接口下又包含(ArrayList集合實現(xiàn)類和LinkedList集合實現(xiàn)類
) Set接口下又包含(HashSet集合實現(xiàn)類和TreeSet集合實現(xiàn)類)
接口:(父類)Map接口下包含(HashMap集合實現(xiàn)類和TreeMap 集合實現(xiàn)類)
*Collections接口提供了對集合進行排序、 遍歷等多種算法實現(xiàn) *Java集合框架為我們提供了一套性能優(yōu)良、使用方便的接口和類,它們位于java.util包中
Collection 接口存儲一組不唯一,無序的對象
List 接口存儲一組不唯一,有序(插入順序)的對象
Set 接口存儲一組唯一,無序的對象 Map接口存儲一組鍵值對象,提供key到value的映射
ArrayList集合和LinkedList集合的優(yōu)點
1、ArrayList實現(xiàn)了長度可變的數(shù)組,在內(nèi)存中分配連續(xù)的空間。遍歷元素和隨機訪問元素的效率比較高
2、LinkedList采用鏈表存儲方式。插入、刪除元素時效率比較高
List接口提供相應(yīng)方法remove()、contains(),直接使用即可
ist接口常用方法 :
boolean add(Object o) 在列表的末尾順序添加元素,起始索引位置從0開始
void add(int index,Object o)在指定的索引位置添加元素。索引位置必須介于0和列表中元素個數(shù)之間
int size() 返回列表中的元素個數(shù)
Object get(int index) 返回指定索引位置處的元素。取出的元素是Object類型,使用前需要進行強制類型轉(zhuǎn)換
boolean contains(Object o)判斷列表中是否存在指定元素
boolean remove(Object o)從列表中刪除元素
Objectremove(int index)從列表中刪除指定位置元素,起始索引位置從0開始
LinkedList的特殊方法
voidaddFirst(Object o)在列表的首部添加元素
voidaddLast(Object o)在列表的末尾添加元素
ObjectgetFirst() 返回列表中的第一個元素
ObjectgetLast() 返回列表中的最后一個元素
ObjectremoveFirst() 刪除并返回列表中的第一個元素
ObjectremoveLast() 刪除并返回列表中的最后一個元素
Map接口常用方法:
Object put(Object key, Object val)以“鍵-值對”的方式進行存儲
Object get (Object key)根據(jù)鍵返回相關(guān)聯(lián)的值,如果不存在指定的鍵,返回null
Object remove (Object key)刪除由指定的鍵映射的“鍵-值對”
int size()返回元素個數(shù)
Set keySet ()返回鍵的集合
Collection values ()返回值的集合
booleancontainsKey (Object key)如果存在由指定的鍵映射的“鍵-值對”,返回true
Vector和ArrayList的異同:
實現(xiàn)原理相同,功能相同,很多情況下可以互用兩者的主要區(qū)別如下
Vector線程安全,ArrayList重速度輕安全,線程非安全長度需增長時,Vector默認增長一倍,ArrayList增長50%
Hashtable和HashMap的異同:
實現(xiàn)原理相同,功能相同,在很多情況下可以互用
兩者的主要區(qū)別如下
Hashtable繼承Dictionary類,HashMap實現(xiàn)Map接口
Hashtable線程安全, HashMap線程非安全
Hashtable不允許null值,HashMap允許null值
迭代器Iterator
方法1:通過for循環(huán)和get()方法配合實現(xiàn)遍歷
方法2:通過迭代器Iterator實現(xiàn)遍歷 所有集合接口和類都沒有提供相應(yīng)遍歷方法,而是由Iterator實現(xiàn)集合遍歷 Collection 接口的iterate()方法返回一個Iterator,然后通過Iterator接口的兩個方法可實現(xiàn)遍歷
boolean hasNext(): 判斷是否存在另一個可訪問的元素
Object next(): 返回要訪問的下一個元素
泛型集合: 把任何類型對象通過add(Object obj) 放入List中,認為只是Object類型 通過get(int index) 取出List中元素時必須進行強制類型轉(zhuǎn)換,繁瑣而且容易出現(xiàn)異常 使用Map的put(Object key, Object value)和get (Object key)存取對象時存在同樣問題 使用Iterator的next()方法獲取元素時存在同樣問題
JDK5.0中通過引入泛型有效的解決了這個問題 JDK5.0使用泛型改寫了集合框架中的所有接口和類
2、Collection框架中實現(xiàn)比較,要實現(xiàn)什么接口?
答案:Comparable/Comparator
3、ArrayList和Vector的區(qū)別?
答案:這兩個類都實現(xiàn)了List接口,都是有序集合,即集合中的元素的位置是有順序的,可以按位置索引號取出某個元素,并且其中的數(shù)據(jù)是允許重復(fù)的,相當于一種動態(tài)的數(shù)組。
ArrayList與Vector的區(qū)別,這主要包括兩個方面:
(1)同步性: Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好是使用ArrayList,因為它不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好是使用Vector,因為不需要我們自己再去考慮和編寫線程安全的代碼。
(2)數(shù)據(jù)增長: ArrayList與Vector都有一個初始的容量大小,當存儲進它們里面的元素的個數(shù)超過了容量時,就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時,不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數(shù)在內(nèi)存空間利用與程序效率之間要取得一定的平衡。Vector默認增長為原來兩倍,而ArrayList的增長策略在文檔中沒有明確規(guī)定(從源代碼看到的是增長為原來的1.5倍)。
ArrayList與Vector都可以設(shè)置初始的空間大小,Vector還可以設(shè)置增長的空間大小,而ArrayList沒有提供設(shè)置增長空間的方法。
4、HashMap和Hashtable的區(qū)別?
答案:HashMap是Hashtable的輕量級實現(xiàn),都實現(xiàn)了Map接口。 主要區(qū)別在于HashMap允許空的鍵和值,而Hashtable不允許。 HashMap是非線程安全的,而HashTable是線程安全的。因此在只有一個線程訪問的情況下,效率要高于Hashtable。 HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。因為contains方法容易讓人引起誤解。 Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類,是Java1.2引進的Map接口的一個實現(xiàn)。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。
5、List 和 Map 區(qū)別?
答案:一個是存儲單列數(shù)據(jù)的集合,另一個是存儲鍵值對的雙列數(shù)據(jù)的集合,List中存儲的數(shù)據(jù)是有順序,并且允許重復(fù);Map中存儲的數(shù)據(jù)是沒有順序的,其鍵是不能重復(fù)的,它的值是可以有重復(fù)的。
6、List, Set, Map是否實現(xiàn)Collection接口?
答案:List,Set是,Map不是。
7、List、Map、Set三個接口,存取元素時,各有什么特點?
答案:List 以特定次序來持有元素,可有重復(fù)元素。
Set 無法擁有重復(fù)元素,內(nèi)部排序。
Map 保存key-value值,key不能重復(fù)、value可重復(fù)。
8、兩個對象值相同x.equals(y) == true,但卻可有不同的hash code,這句話對不對?
答案:對。 如果對象要保存在HashSet或HashMap中,它們的equals相等,那么它們的hashCode值就必須相等。 如果不是要保存在HashSet或HashMap,則與hashCode沒有什么關(guān)系了,這時候hashCode不等是可以的,例如ArrayList存儲的對象就不用實現(xiàn)hashCode,當然,我們沒有理由不實現(xiàn),通常都會去實現(xiàn)的。
9、說出一些常用的類,包,接口,請各舉5個?
常用的類:BufferedReader BufferedWriter FileReader FileWirter String Integer java.util.Date,System,Class,List ,HashMap
常用的包:java.lang java.io java.util java.sql ,javax.servlet,org.apache.strtuts.action,org.hibernate
常用的接口:Remote List Map Document NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、session(Hibernate),HttpSession
新聞熱點
疑難解答