Map的有序和無序實現類,與Map的排序

2021-09-07 16:49:28 字數 2028 閱讀 3570

1.hashmap、hashtable不是有序的;

2.treemap和linkedhashmap是有序的(treemap預設 key 公升序,linkedhashmap則記錄了插入順序)。

今天做統計時需要對x軸的地區按照地區**(areacode)進行排序,由於在構建xmldata使用的map來進行資料統計的,所以在統計過程中就需要對map進行排序。

在講解map排序之前,我們先來稍微了解下map。map是鍵值對的集合介面,它的實現類主要包括:hashmap,treemap,hashtable以及linkedhashmap等。其中這四者的區別如下(簡單介紹):

hashmap:我們最常用的map,它根據key的hashcode 值來儲存資料,根據key可以直接獲取它的value,同時它具有很快的訪問速度。hashmap最多隻允許一條記錄的key值為null(多條會覆蓋);允許多條記錄的value為 null。非同步的。

treemap: 能夠把它儲存的記錄根據key排序,預設是按公升序排序,也可以指定排序的比較器,當用iterator 遍歷treemap時,得到的記錄是排過序的。treemap不允許key的值為null。非同步的。

hashtable: 與 hashmap類似,不同的是:key和value的值均不允許為null;它支援執行緒的同步,即任一時刻只有乙個執行緒能寫hashtable,因此也導致了hashtale在寫入時會比較慢。

linkedhashmap: 儲存了記錄的插入順序,在用iterator遍歷linkedhashmap時,先得到的記錄肯定是先插入的.在遍歷的時候會比hashmap慢。key和value均允許為空,非同步的。

treemap預設是公升序的,如果我們需要改變排序方式,則需要使用比較器:comparator。

comparator可以對集合物件或者陣列進行排序的比較器介面,實現該介面的public compare(t o1,to2)方法即可實現排序,該方法主要是根據第乙個引數o1,小於、等於或者大於o2分別返回負整數、0或者正整數。如下:

public

class

treemaptest

});map.put("c", "ccccc");

map.put("a", "aaaaa");

map.put("b", "bbbbb");

map.put("d", "ddddd");

setkeyset =map.keyset();

iterator

iter =keyset.iterator();

while

(iter.hasnext())

}}

執行結果如下:

d:ddddd 

c:ccccc 

b:bbbbb 

a:aaaaa

上面例子是對根據treemap的key值來進行排序的,但是有時我們需要根據treemap的value來進行排序。對value排序我們就需要借助於collections的sort(listlist, comparator<? super t> c)方法,該方法根據指定比較器產生的順序對指定列表進行排序。但是有乙個前提條件,那就是所有的元素都必須能夠根據所提供的比較器來進行比較。如下:

public

class

treemaptest

});}

}}

執行結果

a:aaaaa 

b:bbbbb 

c:ccccc 

d:ddddd

我們都是hashmap的值是沒有順序的,他是按照key的hashcode來實現的。對於這個無序的hashmap我們要怎麼來實現排序呢?參照treemap的value排序,我們一樣的也可以實現hashmap的排序。

public

class

hashmaptest

});}

}}

執行結果

a:aaaaa 

b:bbbbb 

c:ccccc 

d:ddddd

kafka 的有序與無序

同時建立kafka生產者produce,kafka消費者consumer,其中我們的topic建立了3個分割槽,生產者傳送幾條資料,使用命令檢視消費。可以看到剛剛生產的這幾條資料,當我退出消費命令,重新使用消費者命令來消費資料時,看一下資料 這時候看到的資料時無序的,總結一點 單個分割槽 有序 全域...

kafka 的有序與無序

同時建立kafka生產者produce,kafka消費者consumer,其中我們的topic建立了3個分割槽,生產者傳送幾條資料,使用命令檢視消費。可以看到剛剛生產的這幾條資料,當我退出消費命令,重新使用消費者命令來消費資料時,看一下資料 這時候看到的資料時無序的,總結一點 單個分割槽 有序 全域...

有序廣播和無序廣播的區別

1.無序廣播 通過context.sendbroadcast 方法來傳送,它是完全非同步的。所有的receivers 接收器 的執行順序不確定,因此所有的receivers 接收器 接收broadcast的順序不確定。這種方式效率更高,但是broadcastreceiver無法使用setresult...