<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    天外的星星

    2012年3月20日 #

    JAVA集合類,容器類



    此文檔據(jù)說是改編而來,然而筆者也付出了辛勞。
    Java容器類Collection、List、ArrayList、Vector及map、HashTable、HashMap區(qū)別

     

    Collection是List和Set兩個(gè)接口的基接口

    List在Collection之上增加了"有序"

    Set在Collection之上增加了"唯一"

     

    而ArrayList是實(shí)現(xiàn)List的類...所以他是有序的.

    它里邊存放的元素在排列上存在一定的先后順序

     

    而且ArrayList是采用數(shù)組存放元素

    另一種List LinkedList采用的則是鏈表。

     

    Collection和Map接口之間的主要區(qū)別在于:Collection中存儲(chǔ)了一組對(duì)象,而Map存儲(chǔ)關(guān)鍵字/值對(duì)。

    在Map對(duì)象中,每一個(gè)關(guān)鍵字最多有一個(gè)關(guān)聯(lián)的值。

    Map:不能包括兩個(gè)相同的鍵,一個(gè)鍵最多能綁定一個(gè)值。null可以作為鍵,這樣的鍵只有一個(gè);可以有一個(gè)或多個(gè)鍵所對(duì)應(yīng)的

    值為null。當(dāng)get()方法返回null值時(shí),即可以表示Map中沒有該鍵,也可以表示該鍵所對(duì)應(yīng)的值為null。因此,在Map中不能由get()方法來判斷Map中是否存在某個(gè)鍵,而應(yīng)該用containsKey()方法來判斷。

    繼承Map的類有:HashMap,HashTable

    HashMap:Map的實(shí)現(xiàn)類,缺省情況下是非同步的,可以通過Map Collections.synchronizedMap(Map m)來達(dá)到線程同步

    HashTable:Dictionary的子類,缺省是線程同步的。不允許關(guān)鍵字或值為null

     

    當(dāng)元素的順序很重要時(shí)選用TreeMap,當(dāng)元素不必以特定的順序進(jìn)行存儲(chǔ)時(shí),使用HashMap。Hashtable的使用不被推薦,因?yàn)镠ashMap提供了所有類似的功能,并且速度更快。當(dāng)你需要在多線程環(huán)境下使用時(shí),HashMap也可以轉(zhuǎn)換為同步的。

     

    為什么要使用集合類

    當(dāng)你事先不知道要存放數(shù)據(jù)的個(gè)數(shù),或者你需要一種比數(shù)組下標(biāo)存取機(jī)制更靈活的方法時(shí),你就需要用到集合類。

     

    理解集合類

    集合類存放于java.util包中。

    集合類存放的都是對(duì)象的引用,而非對(duì)象本身,出于表達(dá)上的便利,我們稱集合中的對(duì)象就是指集合中對(duì)象的引用(reference)。

    集合類型主要有3種:set(集)、list(列表)和map(映射)。

     

    (1)集 Set):口袋

    集(set)是最簡(jiǎn)單的一種集合,它的對(duì)象不按特定方式排序,只是簡(jiǎn)單的把對(duì)象加入集合中,就像往口袋里放東西。

    對(duì)集中成員的訪問和操作是通過集中對(duì)象的引用進(jìn)行的,所以集中不能有重復(fù)對(duì)象。

    集也有多種變體,可以實(shí)現(xiàn)排序等功能,如TreeSet,它把對(duì)象添加到集中的操作將變?yōu)榘凑漳撤N比較規(guī)則將其插入到有序的對(duì)象序列中。它實(shí)現(xiàn)的是SortedSet接口,也就是加入了對(duì)象比較的方法。通過對(duì)集中的對(duì)象迭代,我們可以得到一個(gè)升序的對(duì)象集合。

     

    (2)列表 List):列表

    列表的主要特征是其對(duì)象以線性方式存儲(chǔ),沒有特定順序,只有一個(gè)開頭和一個(gè)結(jié)尾,當(dāng)然,它與根本沒有順序的集是不同的。

    列表在數(shù)據(jù)結(jié)構(gòu)中分別表現(xiàn)為:數(shù)組和向量、鏈表、堆棧、隊(duì)列。

    關(guān)于實(shí)現(xiàn)列表的集合類,是我們?nèi)粘9ぷ髦薪?jīng)常用到的,將在后邊的筆記詳細(xì)介紹。

     

    (3)映射 Map):鍵值對(duì)

    映射與集或列表有明顯區(qū)別,映射中每個(gè)項(xiàng)都是成對(duì)的。映射中存儲(chǔ)的每個(gè)對(duì)象都有一個(gè)相關(guān)的關(guān)鍵字(Key)對(duì)象,關(guān)鍵字決定了對(duì)象在映射中的存儲(chǔ)位置,檢索對(duì)象時(shí)必須提供相應(yīng)的關(guān)鍵字,就像在字典中查單詞一樣。關(guān)鍵字應(yīng)該是唯一的。

    關(guān)鍵字本身并不能決定對(duì)象的存儲(chǔ)位置,它需要對(duì)過一種散列(hashing)技術(shù)來處理,產(chǎn)生一個(gè)被稱作散列碼(hash code)的整數(shù)值,散列碼通常用作一個(gè)偏置量,該偏置量是相對(duì)于分配給映射的內(nèi)存區(qū)域起始位置的,由此確定關(guān)鍵字/對(duì)象對(duì)的存儲(chǔ)位置。理想情況下,散列處理應(yīng)該產(chǎn)生給定范圍內(nèi)均勻分布的值,而且每個(gè)關(guān)鍵字應(yīng)得到不同的散列碼。

     

    集合類簡(jiǎn)介

    java.util中共有13個(gè)類可用于管理集合對(duì)象,它們支持集、列表或映射等集合,以下是這些類的簡(jiǎn)單介紹

     

    HashSet: 使用HashMap的一個(gè)集的實(shí)現(xiàn)。雖然集定義成無序,但必須存在某種方法能相當(dāng)高效地找到一個(gè)對(duì)象。使用一個(gè)HashMap對(duì)象實(shí)現(xiàn)集的存儲(chǔ)和檢索操作是在固定時(shí)間內(nèi)實(shí)現(xiàn)的.

    TreeSet: 在集中以升序?qū)?duì)象排序的集的實(shí)現(xiàn)。這意味著從一個(gè)TreeSet對(duì)象獲得第一個(gè)迭代器將按升序提供對(duì)象。TreeSet類使用了一個(gè)TreeMap.

    列表

    Vector: 實(shí)現(xiàn)一個(gè)類似數(shù)組一樣的表,自動(dòng)增加容量來容納你所需的元素。使用下標(biāo)存儲(chǔ)和檢索對(duì)象就象在一個(gè)標(biāo)準(zhǔn)的數(shù)組中一樣。你也可以用一個(gè)迭代器從一個(gè)Vector中檢索對(duì)象。Vector是唯一的同步容器類??當(dāng)兩個(gè)或多個(gè)線程同時(shí)訪問時(shí)也是性能良好的。(同步的含義:即同時(shí)只能一個(gè)進(jìn)程訪問,其他等待

    Stack: 這個(gè)類從Vector派生而來,并且增加了方法實(shí)現(xiàn)棧??一種后進(jìn)先出的存儲(chǔ)結(jié)構(gòu)。

    LinkedList: 實(shí)現(xiàn)一個(gè)鏈表。由這個(gè)類定義的鏈表也可以像棧或隊(duì)列一樣被使用。

    ArrayList: 實(shí)現(xiàn)一個(gè)數(shù)組,它的規(guī)模可變并且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步。

    映射:

    HashTable: 實(shí)現(xiàn)一個(gè)映象,所有的鍵必須非空。為了能高效的工作,定義鍵的類必須實(shí)現(xiàn)hashcode()方法和equal()方法。這個(gè)類是前面java實(shí)現(xiàn)的一個(gè)繼承,并且通常能在實(shí)現(xiàn)映象的其他類中更好的使用。

    HashMap: 實(shí)現(xiàn)一個(gè)映象,允許存儲(chǔ)空對(duì)象,而且允許鍵是空(由于鍵必須是唯一的,當(dāng)然只能有一個(gè))。

    WeakHashMap: 實(shí)現(xiàn)這樣一個(gè)映象:通常如果一個(gè)鍵對(duì)一個(gè)對(duì)象而言不再被引用,鍵/對(duì)象對(duì)將被舍棄。這與HashMap形成對(duì)照,映象中的鍵維持鍵/對(duì)象對(duì)的生命周期,盡管使用映象的程序不再有對(duì)鍵的引用,并且因此不能檢索對(duì)象。

    TreeMap: 實(shí)現(xiàn)這樣一個(gè)映象,對(duì)象是按鍵升序排列的。

     

    下圖是集合類所實(shí)現(xiàn)的接口之間的關(guān)系:

    Set和List都是由公共接口Collection擴(kuò)展而來,所以它們都可以使用一個(gè)類型為Collection的變量來引用。這就意味著任何列表或集構(gòu)成的集合都可以用這種方式引用,只有映射類除外(但也不是完全排除在外,因?yàn)榭梢詮挠成浍@得一個(gè)列表。)所以說,把一個(gè)列表或集傳遞給方法的標(biāo)準(zhǔn)途徑是使用Collection類型的參數(shù)。

     

    List接口

      List是有序的Collection,使用此接口能夠精確的控制每個(gè)元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標(biāo))來訪問List中的元素,這類似于Java的數(shù)組。

    和下面要提到的Set不同,List允許有相同的元素。

      除了具有Collection接口必備的iterator()方法外,List還提供一個(gè)listIterator()方法,返回一個(gè)ListIterator接口,和標(biāo)準(zhǔn)的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。

      實(shí)現(xiàn)List接口的常用類有LinkedList,ArrayList,Vector和Stack。

    ArrayList

      ArrayList實(shí)現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒有同步。

    size,isEmpty,get,set方法運(yùn)行時(shí)間為常數(shù)。但是add方法開銷為分?jǐn)偟某?shù),添加n個(gè)元素需要O(n)的時(shí)間。其他的方法運(yùn)行時(shí)間為線性。

      每個(gè)ArrayList實(shí)例都有一個(gè)容量(Capacity),即用于存儲(chǔ)元素的數(shù)組的大小。這個(gè)容量可隨著不斷添加新元素而自動(dòng)增加,但是增長(zhǎng)算法并沒有定義。ArrayList當(dāng)需要插入大量元素時(shí),在插入前可以調(diào)用ensureCapacity方法來增加ArrayList的容量以提高插入效率。

      和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。

    Map接口

      請(qǐng)注意,Map沒有繼承Collection接口,Map提供key到value的映射。一個(gè)Map中不能包含相同的key,每個(gè)key只能映射一個(gè)value。Map接口提供3種集合的視圖,Map的內(nèi)容可以被當(dāng)作一組key集合,一組value集合,或者一組key-value映射。

    HashMap

      HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即null value和null key。,但是將HashMap視為Collection時(shí)(values()方法可返回Collection),其迭代子操作時(shí)間開銷和HashMap的容量成比例。因此,如果迭代操作的性能相當(dāng)重要的話,不要將HashMap的初始化容量設(shè)得過高,或者load factor過低。

    ----------------------------------------------------------------------------

    1.-------------------->

    List是接口,List特性就是有序,會(huì)確保以一定的順序保存元素.

    ArrayList是它的實(shí)現(xiàn)類,是一個(gè)用數(shù)組實(shí)現(xiàn)的List.

    Map是接口,Map特性就是根據(jù)一個(gè)對(duì)象查找對(duì)象.

    HashMap是它的實(shí)現(xiàn)類,HashMap用hash表實(shí)現(xiàn)的Map,就是利用對(duì)象的hashcode(hashcode()是Object的方法)進(jìn)行快速Hash散列查找.(關(guān)于散列查找,可以參看<<數(shù)據(jù)結(jié)構(gòu)>>)

    2.-------------------->

    一般情況下,如果沒有必要,推薦代碼只同List,Map接口打交道.

    比如:List list = new ArrayList();

    這樣做的原因是list就相當(dāng)于是一個(gè)泛型的實(shí)現(xiàn),如果想改變list的類型,只需要:

    List list = new LinkedList();//LinkedList也是List的實(shí)現(xiàn)類,也是ArrayList的兄弟類

    這樣,就不需要修改其它代碼,這就是接口編程的優(yōu)雅之處.

    另外的例子就是,在類的方法中,如下聲明:

    private void doMyAction(List list){}

    這樣這個(gè)方法能處理所有實(shí)現(xiàn)了List接口的類,一定程度上實(shí)現(xiàn)了泛型函數(shù).

    3.--------------------->

    如果開發(fā)的時(shí)候覺得ArrayList,HashMap的性能不能滿足你的需要,可以通過實(shí)現(xiàn)List,Map(或者Collection)來定制你的自定義類

    posted @ 2012-03-20 09:47 天外的星星 閱讀(2180) | 評(píng)論 (1)編輯 收藏

    Windows下配置JAVA和Tomcat環(huán)境變量

    1. 關(guān)于環(huán)境變量:
      1. Windows 7)右鍵點(diǎn)擊桌面的計(jì)算機(jī),選擇屬性,點(diǎn)擊左側(cè)的高級(jí)系統(tǒng)設(shè)置,打開系統(tǒng)屬性設(shè)置框,點(diǎn)擊最下面的環(huán)境變量,即可打開環(huán)境變量設(shè)置對(duì)話框。
      1. 環(huán)境變量包括系統(tǒng)變量和用戶變量,如果配置在用戶變量,則該環(huán)境變量?jī)H對(duì)當(dāng)前用戶生效,如果配置為系統(tǒng)變量,則對(duì)所有用戶生效,其他應(yīng)再無區(qū)別。
      2. 環(huán)境變量里面,我們用兩個(gè)比較特殊的環(huán)境變量,一個(gè)是PATH,一個(gè)是CLASSPATH,配置在PATH里面的路徑,可以直接在命令提示符下面執(zhí)行路徑對(duì)應(yīng)的文件或文件夾下的exebat等命令進(jìn)行運(yùn)行,如:

    我們將你的JDK目錄(如D:\JAVA\JDK1.7.0\bin)加入環(huán)境變量,則該變量下面有例如java.exe ,javac.exe等文件。我們可以在命令提示符下面進(jìn)行如java,javac等命令。

    另外一個(gè)CLASSPATH,這里暫時(shí)不說。

    1. 在環(huán)境變量配置里面引用環(huán)境變量可以用如下格式:

    %變量名%

    1. 英文的句號(hào)即點(diǎn)(.)表示任何當(dāng)前路徑。
    1. Java環(huán)境變量配置:
      1. 配置JAVA_HOME(格式為變量名=變量值[示例值]):

    JAVA_HOME = 你的JDK的目錄[D:\Java\jdk1.7.0]

    1. 配置JRE_HOME(可選)

    JRE_HOME =  你的JRE的目錄[D:\Java\jdk1.7.0\jre]

    1. PATH配置:

    在系統(tǒng)變量中查找PATH變量,如果沒有則新建,如果有的話,雙擊打開,在已有的變量值后面添加,各個(gè)變量配置值之間用英文的分號(hào)(;)隔開,需要添加以下幾個(gè)變量值:

    PATH = %JAVA_HOME%\bin

    PATH = %JRE_HOME%\bin  (可選)

    1. 配置CLASSPATH

    CLASSPATH = D:\Java\jdk1.7.0\lib\dt.jar

    1. TOMCAT的配置:
      1. 配置CATALINA_HOME

    CATALINA_HOME = 你的TOMCAT的目錄[D:\Develop\apache-tomcat-7.0.2]

    1. 配置PATH

    PATH=%CATALINA_HOME%\bin

    1. 測(cè)試:

    開始”->;“運(yùn)行”,鍵入“cmd”(這里做測(cè)試);

    可以鍵入命令“java -version”,“java”,“javac”幾個(gè)命令,出現(xiàn)畫面,說明環(huán)境變量配置成功;

    posted @ 2012-03-20 09:42 天外的星星 閱讀(3344) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題  

    My Links

    Blog Stats

    常用鏈接

    留言簿

    隨筆檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: a级毛片免费高清视频| 亚洲heyzo专区无码综合| a级成人毛片免费图片| 亚洲精品国产日韩无码AV永久免费网| 亚洲乱码av中文一区二区| 我想看一级毛片免费的| 国产色在线|亚洲| 亚洲成aⅴ人片在线观| 最近最好最新2019中文字幕免费| 免费高清av一区二区三区| 亚洲一区二区三区在线观看网站| 四虎影院在线免费播放| 美女视频黄频a免费大全视频| 免费国产在线观看老王影院| 中国国产高清免费av片| 久久亚洲伊人中字综合精品| 1000部夫妻午夜免费| 亚洲女女女同性video| 亚洲欧洲一区二区三区| 免费毛片在线看不用播放器 | 久久WWW免费人成人片| 亚洲乱码日产精品一二三| 亚洲欧洲中文日韩av乱码| 一级毛片在线免费观看| 99亚偷拍自图区亚洲| 亚洲国产成人精品91久久久| 中文字幕乱码一区二区免费| 亚洲a级片在线观看| 无码专区一va亚洲v专区在线 | 91免费国产精品| 亚洲精品无码av中文字幕| 亚洲精品黄色视频在线观看免费资源| a成人毛片免费观看| 亚洲AV无码乱码麻豆精品国产| 四虎影视永久免费观看网址| 男人都懂www深夜免费网站| 亚洲成熟丰满熟妇高潮XXXXX| 国产亚洲高清不卡在线观看| 德国女人一级毛片免费| 日韩精品无码免费专区午夜 | 99久久免费国产精精品|