日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 容器排序_Java攻略第四章 容器类、排序

發(fā)布時間:2023/12/20 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 容器排序_Java攻略第四章 容器类、排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面就是Java小世界的出口,是不是心中涌起莫名的沖動,想要一步跳出門去?這種心情可以理解,因為你還沒有遇到真正的怪物。喂,不要急!在你即將跳出門去的剎那,最好還是看一下這個小東西!

可不要小看它!它在Java世界內扮演了重要角色,這就是容器類。首先,容器類是一個統(tǒng)稱,它包含了許多實用類。它們是真正的“類”如其名,顯而易見的功能是包含其它Java元素。當然,容器功能只是它們的基本屬性,你要睜大眼睛,仔細研究它們附加的魔法屬性。如果能熟練使用這些附加的屬性,那我就不再阻攔你,你大可以飛出門去,即使以后可能跌個頭破血流,絕保不會有性命之虞。

嗯,等我把它們全部撿出來。它們一般在java.util包里。先看Collection,它只是一個接口類,定義了容器類的基本屬性。下面再來看看這些:Array、List、Map和Set。Array,即數組,并不是一個Java類,就是說,你不會找到叫Array的類,但它確實存在于Java世界內。數組的特色就是:訪問指定索引元素的速度較快,但插入和刪除指定元素就比較費勁,而且它是定長的。如果你想使用它,可以這樣聲明:數據類型[] 數組變量名稱。例如你想要一個int類型的數組,那你只要這樣呼喊:

int[] iArray;

喊完后,JVM就知道你需要一個int類型的,名字叫“iArray”的數組。然后你需要再喊出你期望數組容器有多大,就像這樣:

iArray = new int[6];

好了,你現在有了一個可以裝下6個int元素的數組容器。你可以存放,也可以取出int元素:

iArray[0] = 5;

int temp = iArray[5];

對于數組來說,要注意的是:JVM是根據索引來訪問數組容器內的元素,并且索引是從0開始編號的。就拿剛才我們創(chuàng)建的數組容器,訪問第六個元素的喊法是這樣的:

iArray[5];

并不存在iArray[6]這個元素。如果你不小心喊出了iArray[6],JVM會因為你的貪婪而生氣的。

接下來我們來看看List。List有許多種類。比較常見的有ArrayList、LinkedList、Stack、Vector。ArrayList、LinkedList、Stack、Vector雖然同為List類型容器,但各有各的特殊屬性。比如ArrayList,它其實是數組外面粘貼了一些List枝葉,所以它像數組一樣,訪問指定索引元素的速度較快,但插入和刪除指定元素就比較費勁。Vector具有同步屬性,不需額外步驟,就支持并發(fā)訪問。LinkedList具有鏈表的屬性,一般來說它和ArrayList屬性相反,它的插入和刪除速度較快,但訪問特定索引元素的速度較慢。Stack,就如它的名字,它具有棧的屬性,提供在一端壓入元素、彈出元素的功能。所有List類型的容器和數組比起來,最顯著的區(qū)別是:List是變長的。你沒有必要告訴JVM你需要多大尺寸的List,JVM會盡量滿足你的收集欲望。不過你要格外小心,如果一不小心撐壞了JVM的肚皮,遭受打擊的可不是JVM,而是你!

如果我們需要一個List容器,我們可以這樣呼喊:List 容器名稱。的例如:

List appleList;

如果你希望獲取一個特定類型的List,你要指明它具體的類型,例如:

ArrayList appleList;

此時JVM會收到你的請求,但JVM并沒有準備好容器,你要接著呼喊:

appleList = new

ArrayList();

這樣JVM會準備好一個ArrayList類型的容器。然后你可以直接使用容器自帶的add、remove等魔法向List容器內插入、刪除元素,也可以使用get(int index)魔法獲取指定索引的元素。

現在輪到Map容器了。Map同樣也有許多種類。常見的有HashMap、Hashtable、LinkedHashMap和TreeMap。它們共同的屬性是提供Key-Value映射。你可以提供一個Key,獲取對應的Value。要說不同的屬性,HashMap、Hashtable是Map的哈希表版本,這個決定了HashMap、Hashtable容器的容量是虛高的,也就是說,實際存放100個元素的容器,外表看上去像個容量超過100的胖子,具體胖到什么程度,要看容器的心情。如果預期存放的元素不多,這通常不是什么問題。LinkedHashMap同時具有哈希表和一些鏈表的屬性,它在內部維護一個雙向鏈表,鏈表內包含所有存放的元素。通過特殊的構造方法來創(chuàng)建這種類型的Map,該Map內鏈表的鏈接順序就是最后訪問其元素的順序,即從近期訪問最少到近期訪問最多的順序(訪問順序)。所以這種Map很適合構建 LRU 緩存。TreeMap呢,它具有紅黑樹的屬性,所以TreeMap內的元素都是有序排列的,排序依據是Key值,或者使用指定的比較器Comparator決定,而且它的容量不是虛高的。

如果我們需要Map容器,我們可以這樣呼喊:Map 容器名稱。例如:

Map appleMap;

如果你希望獲取一個特定類型的Map,你要指明它具體的類型,例如:

HashMap appleList;

此時JVM會收到你的請求,但JVM并沒有準備好容器,你要接著呼喊:

appleMap = new

HashMap();

然后我們可以存放元素,

appleMap.put(“red”,redApple);

也可以取出元素,

appleMap.get(“red”);

甚至我們可以先看看容器內是否有指定的元素:

appleMap.containsKey(“red”);

最后是Set。和Map相似,可以把Set看作是退化為List的Map,或者是Key與Value相同的Map。它的常見類型有HashSet、LinkedHashSet、TreeSet。它們之間的區(qū)別可以參考Map。我一直沒怎么用過Set類型容器,總是使用Map容器來模仿Set容器。Set容器在這種情況下比較實用:希望維護一個沒有重復元素的List。

好了,常見的容器都挑揀出來了。對于容器來說,比較常見的操作就是遍歷其中所有元素。要完成這項魔法,我們可以利用容器的Iterator屬性。比如對于剛才的appleList,我們可以這樣遍歷其中元素:

for(Iterator iter =

appleList.iterator();iter.hasNext();){

Object apple =

iter.next();

//處理 apple

}

其實對于Array、List和Set來說,你可以這樣遍歷:

for(Apple apple :

appleList){

//處理 apple

}

Map是比較特殊的容器,它的遍歷是通過遍歷其keySet,然后由key獲取Value這種方式實現,例如我們的appleMap:

for(Iterator iter =

appleMap.keySet().iterator();iter.hasNext();){

Object key =

iter.next();

Object apple =

appleMap.get(key);

//處理 apple

}

如果覺得這樣有些繞彎,可以這樣做:

for(Iterator iter =

appleMap.entrySet().iterator();iter.hasNext();){

Map.Entry entry =

(Map.Entry)iter.next();

Object key =

entry.getKey();

Object apple =

entry.getValue();

//處理 apple

}

對于遍歷來說,我們需要記住的是,遍歷一般是不保證順序的,即前后兩次遍歷容器內的元素,很可能是以不同的順序遍歷。但LinkedHashMap、TreeMap、LinkedHashSet、TreeSet是保證遍歷順序的。對于Array和List來說,你完全可以用指定索引的方式,強制遍歷順序。例如:

for(int i =0; i<

appleList.size();i++){

Object apple =

appleList.get(i);

//處理 apple

}

有了容器,我們可以方便的存放元素。加入我們希望對容器內的元素排序該怎么辦呢?不用急,Java世界內已經存在這樣的魔法。我們可以用java.util包內的Arrays對數組進行排序,也可以使用Collections對List進行排序。同樣,Map的keySet是Set類型容器,values是Collection類型容器,都可以轉為List類型容器,當然可以用Collections魔法對其keySet和values排序。最后一點,說到排序,總是有個排序的規(guī)則吧。如果我們想指定排序規(guī)則該怎么辦呢?這些都不用擔心,Arrays和Collections內已經有對應的魔法,其中的關鍵是:我們需要提供排序規(guī)則實例,即Comparaor類型的元素。比如我們剛才創(chuàng)建的appleList,假定其中保存的是我們自定義的Apple類型對象,這個對象內有一個新鮮度屬性:life,如果我們想要按照Apple的新鮮度對appleList內的所有Apple元素排序,那么我們先實現一個比較器對象:

class AppleComparator implements

Comparator{

public int compare(Apple appleA, Apple appleB) {

int cp = 0; //新鮮度一樣

if(appleA.getLife>appleB.getLife){

cp = 1; //appleA新鮮

}

if(appleA.getLife>appleB.getLife){

cp = -1; //appleB新鮮

}

return cp;

}

}

然后我們使用Collections內的魔法:

Collections.sort(appleList,new

AppleComparator());

這樣AppleList內元素就是按新鮮度排序好的。

關于容器的奧妙就講這么多吧,這只是其中很少的部分,剩下的就需要你自己去發(fā)掘了。另外,對于上述涉及的容器,一般來說不適合并發(fā)訪問。如果希望并發(fā)訪問容器及容器內元素,請到java.util.concurrent包內找對應類型的并發(fā)版本容器。

好了,現在你可以跳出這個大門了。

總結

以上是生活随笔為你收集整理的java 容器排序_Java攻略第四章 容器类、排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。