『壹』 java中List、Set、Map介面之間的區別和聯系
List 用於遍歷一個數組時效率最高;比如在循環顯示所有信息時經常用到;
Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象;雖然Set同List都實現了Collection介面,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。 Map 就是鍵值對map(鍵,值),鍵是Sting 類型 值是Object (對象類型),所以在知道某條信息的一項時查詢其他項就用該方法,效率最高!(以上個人見解!)
詳細:數組和其它容器的區別主要有三方面:效率,類型,和保存基本類型的能力.在Java中,數組是一種效率很高的存儲和隨機訪問對象引用序列的方式.數組是一 個簡單的線性序列,因此訪問速度很快,但也損失了其它一些特性.創建一個數組對象後,大小就固定了,如果空間不夠,通常是再創建一個數組,然後把舊數組中 的所有引用移到新數組中.數組可可以保存基本類型,容器不行.
容器類不以具體的類型來處理對象,而是將所有的對象都以Object類型來處理,所以我們可以只創建一個容器,任意的Java對象都可以放進去.容器類可 以使用包裝類(Integer,Double等),以便把基本類型放入其中. List Set Map 都可以自動調整容量,數組不能.
Collection表示一組對象,這些對象也稱為collection的元素。一些 collection允許有重復的元素,而另一些則不允許。一些collection是有序的,而另一些則是無序的。JDK中不提供此介面的任何直接實 現,它提供更具體的子介面(如 Set 和 List)實現.
Map 將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多隻能映射一個值.Map 介面提供三種collection視圖,允許以鍵集、值集合或鍵值映射關系集的形式查看某個映射的內容。某些映射實現可明確保證其順序,如 TreeMap(有序) 類;某些映射實現則不保證順序,如 HashMap(無序) 類。Map可以像數組那樣擴展成多維數組,只要把每個值也做成一個Map就行了.
Collection和Map是Java容器中的兩種基本類型. 區別在於容器中每個位置保存的元素個數.Collection每個位置只能保存一個元素,包括List和Set.其中List以進入的順序保存一組元素; 而Set中的元素不能重復.ArrayList是一種List,HashSet是一種Set,將元素添加入任意Collection都可以使用add() 方法.Map保存的是健值對.使用put()為Map添加元素,它需要一個健和一個值作參數.
ArrayList和LinkedList都實現了List介面,ArrayList底層由數組支持LinkedList由雙向鏈表支持,因此,如果經常在表中插入或刪除元素LinkedList比較適合,如果經常查詢ArrayList比較適合.
Set的實現有TreeSet,HashSet,LinkedHashSet,HashSet查詢速度最快,LinkedHashSet保持元素插入次序,TreeSet基於TreeMap,生成一個總是處於排序狀態的Set.
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Vector : 基於Array的List,其實就是封裝了Array所不具備的一些功能方便我們使用,它不可能走入Array的限制。性能也就不可能超越Array。所以,在可能的情況下,我們要多運用Array。另外很重要的一點就是Vector「sychronized」的,這個也是Vector和ArrayList的唯一的區別。
ArrayList:同Vector一樣是一個基於Array上的鏈表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector優越一些,但是當運行到多線程環境中時,可需要自己在管理線程的同步問題。
LinkedList:LinkedList不同於前面兩種List,它不是基於Array的,所以不受Array性能的限制。它每一個節點(Node)都包含兩方面的內容:1.節點本身的數據(data);2.下一個節點的信息(nextNode)。所以當對LinkedList做添加,刪除動作的時候就不用像基於Array的List一樣,必須進行大量的數據移動。只要更改nextNode的相關信息就可以實現了。這就是LinkedList的優勢。
List總結:
1. 所有的List中只能容納單個不同類型的對象組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList(鏈表)適合添加,刪除操作。
HashSet:雖然Set同List都實現了Collection介面,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的存儲方式是把HashMap中的Key作為Set的對應存儲項。看看HashSet的add(Object obj)方法的實現就可以一目瞭然了。
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
這個也是為什麼在Set中不能像在List中一樣有重復的項的根本原因,因為HashMap的key是不能有重復的。
LinkedHashSet:HashSet的一個子類,一個鏈表。
TreeSet:SortedSet的子類,它不同於HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實現的。
Set總結:
1. Set實現的基礎是Map(HashMap);
2. Set中的元素是不能重復的,如果使用add(Object obj)方法添加已經存在的對象,則會覆蓋前面的對象;
http://user.qzone.qq.com/530536333/blog/1283866146
List介面對Collection進行了簡單的擴充,它的具體實現類常用的有ArrayList和LinkedList。你可以將任何東西放到一個List容器中,並在需要時從中取出。ArrayList從其命名中可以看出它是一種類似數組的形式進行存儲,因此它的隨機訪問速度極快,而LinkedList的內部實現是鏈表,它適合於在鏈表中間需要頻繁進行插入和刪除操作。在具體應用時可以根據需要自由選擇。前面說的Iterator只能對容器進行向前遍歷,而ListIterator則繼承了Iterator的思想,並提供了對List進行雙向遍歷的方法。
Set介面也是Collection的一種擴展,而與List不同的時,在Set中的對象元素不能重復,也就是說你不能把同樣的東西兩次放入同一個Set容器中。它的常用具體實現有HashSet和TreeSet類。HashSet能快速定位一個元素,但是你放到HashSet中的對象需要實現hashCode()方法,它使用了前面說過的哈希碼的演算法。而TreeSet則將放入其中的元素按序存放,這就要求你放入其中的對象是可排序的,這就用到了集合框架提供的另外兩個實用類Comparable和Comparator。一個類是可排序的,它就應該實現Comparable介面。有時多個類具有相同的排序演算法,那就不需要在每分別重復定義相同的排序演算法,只要實現Comparator介面即可。集合框架中還有兩個很實用的公用類:Collections和Arrays。Collections提供了對一個Collection容器進行諸如排序、復制、查找和填充等一些非常有用的方法,Arrays則是對一個數組進行類似的操作。
Map是一種把鍵對象和值對象進行關聯的容器,而一個值對象又可以是一個Map,依次類推,這樣就可形成一個多級映射。對於鍵對象來說,像Set一樣,一個Map容器中的鍵對象不允許重復,這是為了保持查找結果的一致性;如果有兩個鍵對象一樣,那你想得到那個鍵對象所對應的值對象時就有問題了,可能你得到的並不是你想的那個值對象,結果會造成混亂,所以鍵的唯一性很重要,也是符合集合的性質的。當然在使用過程中,某個鍵所對應的值對象可能會發生變化,這時會按照最後一次修改的值對象與鍵對應。對於值對象則沒有唯一性的要求。你可以將任意多個鍵都映射到一個值對象上,這不會發生任何問題(不過對你的使用卻可能會造成不便,你不知道你得到的到底是那一個鍵所對應的值對象)。Map有兩種比較常用的實現:HashMap和TreeMap。HashMap也用到了哈希碼的演算法,以便快速查找一個鍵,TreeMap則是對鍵按序存放,因此它便有一些擴展的方法,比如firstKey(),lastKey()等,你還可以從TreeMap中指定一個范圍以取得其子Map。鍵和值的關聯很簡單,用pub(Object key,Object value)方法即可將一個鍵與一個值對象相關聯。用get(Object key)可得到與此key對象所對應的值對象。
『貳』 java中抽象類和介面的區別
抽象類是用來捕捉子類的抄通用特性的 。它不能被實例化,只能被用作子類的超類。抽象類是被用來創建繼承層級里子類的模板。
介面是抽象方法的集合。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。介面只是一種形式,介面自身不能做任何事情。
(2)java介面的性質擴展閱讀:
抽象類往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。
通常在編程語句中用 abstract 修飾的類是抽象類。在C++中,含有純虛擬函數的類稱為抽象類,它不能生成對象;在java中,含有抽象方法的類稱為抽象類,同樣不能生成對象。
抽象類是不完整的,它只能用作基類。在面向對象方法中,抽象類主要用來進行類型隱藏和充當全局變數的角色。
『叄』 java開發的項目中模塊、包、類、介面的關系是什麼
讓我談談流程為導向,面向對象,這是兩個思想流派,他們是能夠實現的能力,使用該程序來完成一件事。
唯一的思維方式是不一樣的。
面向過程的一件事,一個項目分解成一個函數的小功能。
面向對象的事情,作為一個小對象或這些對象之間的相互關系組成的一個小部分組成,構成了整個項目。
一切是一個面向對象的思想的對象,我,你,他也是。
「類」是一個抽象的對象,或進行了總結。例如,你可以為人類總結。
整體而言,類是抽象的虛擬對象是有生命的東西。
是一個類,我你他是對象。
一般的面向對象編程方法,設計一個類,然後創建一個這個類的對象。
經過這個對象的相關業務。
點:操作的對象,對象不要緊經營。
這里談談如何設計一個類,
類有一些封裝的性質和功能。
面向過程的思想,程序通常是一個函數,這些函數的相互調用。
形成一個完整的方案來解決問題。其基本結構是:
函數()
{
......;
}
函數的兩()
{
......;
}
......
主要功能()
{
......;
}
?
?
然而,在面向對象的思想是包在一起,形成一個類。
類
{
?函數A()
?{
?......;
?}
功能二()
?{
?......;
?}
?......
}
?
?
產生一個對象,那麼這個類:從類的類名學生
方法是生成對象:學生S1;
在這里,s1是一個對象,它生產的對象可以是相關的操作。
操作方法,如:S1是函數();
等等。在這篇文章中的具體細節就不說了只說想。
這是普通的一點是,在具體實施過程中的類,然後生成一個對象,該對象來調用相關的操作。
如果在面向過程的功能封裝成類,然後對象的操作。
A類包,它通常作為一個模塊,其他類型的呼叫需要的時候。
類是一個抽象的,抽象的東西一些共同的特點,總結提出的公共部分的包一起。
包,已經上面說的,裝在一個容器內的一些性質和功能。
在這里,我用一個游戲來解釋:
假設我們想成為游戲內打怪的游戲類似,簡單,怪不要打,只有玩的人。
他的血液不斷減少,直至死亡。
所有的怪物在抽象的共同特點,所以我們得到了一個類:怪物
級怪物
{
??炭怪物名稱;
?血液;
?怪物(怪物N,血列印)/ *構造函數* /
?{
怪物的名字嗎?=怪物名稱n;
?血=血N;
?}
毒打功能(?)
?{
?血液減少;
?}
?判斷功能()
?{
?(血== 0)
?輸出(「你贏了!」);
?}
?玩游戲()
?{
?(血> 0)
?{
?毒打函數();
??判斷函數();
?}
?}
}
?
在這樣一個怪物類屬性的定義:怪物名稱,血液和功能:結構毆打,確定
根據這種情況,可以產生一個對象。
一個類可以有任意數量的對象,區分這些對象,取決於構造函數。
讓我們繼續寫我們的計劃
主要的主要功能
無效的主要()
{
/ ******對象產生****** /?
?怪物怪物(「狼來了」,5000);
?怪物怪物(「老虎」,8000);
怪物怪物(「蛇」,3000);
開始我們的游戲?/ **為了幾個對象** /
?怪物玩游戲();
?怪物玩游戲();
?怪物玩游戲();
}
?
然後主要的功能,我們已經建立了三個對象,它們共享一個類。
可以看到,類相當於一個組件,模塊,我們需要建立它的對象,將是能夠實現他的功率封裝
可以。
這是面向對象的優點,可重復使用,不必每一個用於重寫。
盡管如此,感覺,還是沒有說明白,真的有點只能意味著說不出的感覺。
事實上,如果這本書,真正認真寫了一些東西,他們可以理解,感到無形的。