㈠ java中幾種Map在什麼情況下使用,並簡單介紹原因及原理
一、Map用於保存具有映射關系的數據,Map里保存著兩組數據:key和value,它們都可以使任何引用類型的數據,但key不能重復。所以通過指定的key就可以取出對應的value。Map介面定義了如下常用的方法:
1、void clear():刪除Map中所以鍵值對。
2、boolean containsKey(Object key):查詢Map中是否包含指定key,如果包含則返回true。
3、boolean containsValue(Object value):查詢Map中是否包含指定value,如果包含則返回true。
4、Set entrySet():返回Map中所包含的鍵值對所組成的Set集合,每個集合元素都是Map.Entry對象(Entry是Map的內部類)。
5、Object get(Object key):返回指定key所對應的value,如Map中不包含key則返回null。
6、boolean isEmpty():查詢Map是否為空,如果空則返回true。
7、Set keySet():返回該Map中所有key所組成的set集合。
8、Object put(Object key,Object value):添加一個鍵值對,如果已有一個相同的key值則新的鍵值對覆蓋舊的鍵值對。
9、void putAll(Map m):將指定Map中的鍵值對復制到Map中。
10、Object remove(Object key):刪除指定key所對應的鍵值對,返回可以所關聯的value,如果key不存在,返回null。
11、int size():返回該Map里的鍵值對的個數。
12、Collection values():返回該Map里所有value組成的Collection。
Map中包含一個內部類:Entry。該類封裝了一個鍵值對,它包含了三個方法:
1、Object getKey():返回該Entry里包含的key值。
2、Object getValeu():返回該Entry里包含的value值。
3、Object setValue(V value):設置該Entry里包含的value值,並返回新設置的value值。
二、HashMap和Hashtable實現類:
1、HashMap與HashTable的區別:
1) 同步性:Hashtable是同步的,這個類中的一些方法保證了Hashtable中的對象是線程安全的。而HashMap則是非同步的,因此HashMap中的對象並不是線程安全的。因為同步的要求會影響執行的效率,所以如果你不需要線程安全的集合那麼使用HashMap是一個很好的選擇,這樣可以避免由於同步帶來的不必要的性能開銷,從而提高效率。
2) 值:HashMap可以讓你將空值作為一個表的條目的key或value,但是Hashtable是不能放入空值的。HashMap最多隻有一個key值為null,但可以有無數多個value值為null。
2、性能:HashMap的性能最好,HashTable的性能是最差(因為它是同步的)
3、注意:
1)用作key的對象必須實現hashCode和equals方法。
2)不能保證其中的鍵值對的順序
3)盡量不要使用可變對象作為它們的key值。
三、LinkedHashMap:
它的父類是HashMap,使用雙向鏈表來維護鍵值對的次序,迭代順序與鍵值對的插入順序保持一致。LinkedHashMap需要維護元素的插入順序,so性能略低於HashMap,但在迭代訪問元素時有很好的性能,因為它是以鏈表來維護內部順序。
四、TreeMap:
Map介面派生了一個SortMap子介面,SortMap的實現類為TreeMap。TreeMap也是基於紅黑樹對所有的key進行排序,有兩種排序方式:自然排序和定製排序。Treemap的key以TreeSet的形式存儲,對key的要求與TreeSet對元素的要求基本一致。
1、Map.Entry firstEntry():返回最小key所對應的鍵值對,如Map為空,則返回null。
2、Object firstKey():返回最小key,如果為空,則返回null。
3、Map.Entry lastEntry():返回最大key所對應的鍵值對,如Map為空,則返回null。
4、Object lastKey():返回最大key,如果為空,則返回null。
5、Map.Entry higherEntry(Object key):返回位於key後一位的鍵值對,如果為空,則返回null。
6、Map.Entry lowerEntry(Object key):返回位於key前一位的鍵值對,如果為空,則返回null。
7、Object lowerKey(Object key):返回位於key前一位key值,如果為空,則返回null。
8、NavigableMap subMap(Object fromKey,boolean fromlnclusive,Object toKey,boolean toInciusive):返回該Map的子Map,其key范圍從fromKey到toKey。
9、SortMap subMap(Object fromKey,Object toKey );返回該Map的子Map,其key范圍從fromkey(包括)到tokey(不包括)。
10、SortMap tailMap(Object fromkey ,boolean inclusive):返回該Map的子Map,其key范圍大於fromkey(是否包括取決於第二個參數)的所有key。
11、 SortMap headMap(Object tokey ,boolean inclusive):返回該Map的子Map,其key范圍小於tokey(是否包括取決於第二個參數)的所有key。
五、WeakHashMap:
WeakHashMap與HashMap的用法基本相同,區別在於:後者的key保留對象的強引用,即只要HashMap對象不被銷毀,其對象所有key所引用的對象不會被垃圾回收,HashMap也不會自動刪除這些key所對應的鍵值對對象。但WeakHashMap的key所引用的對象沒有被其他強引用變數所引用,則這些key所引用的對象可能被回收。WeakHashMap中的每個key對象保存了實際對象的弱引用,當回收了該key所對應的實際對象後,WeakHashMap會自動刪除該key所對應的鍵值對。
六、IdentityHashMap類:
IdentityHashMap與HashMap基本相似,只是當兩個key嚴格相等時,即key1==key2時,它才認為兩個key是相等的 。IdentityHashMap也允許使用null,但不保證鍵值對之間的順序。
七、EnumMap類:
1、EnumMap中所有key都必須是單個枚舉類的枚舉值,創建EnumMap時必須顯示或隱式指定它對應的枚舉類。
2、EnumMap根據key的自然順序,即枚舉值在枚舉類中定義的順序,來維護鍵值對的次序。
3、EnumMap不允許使用null作為key值,但value可以。
㈡ java中Map集合如何修改裡面的Key值
修改map的key但是不改變該key對應的value值,可以使用
map.put("key2",map.remove("key1"));
比如:
map.put("key1","value1");--此時:key1--value1
map.put("key2",map.remove("key1"));--此時 :key2--value1
㈢ 怎麼刪除hashmap中所有key
HashMap的結構是<key, value>
想要移除某個元素,只要移除某個key下面的value即可。
如:
package yii.com;
import java.util.*;
public class HashMapDemo {
public static void main(String args[]) {
// 構造hashmap
HashMap newmap = new HashMap();
// 給hashmap賦值
newmap.put(1, "tutorials");
newmap.put(2, "point");
newmap.put(3, "is best");
System.out.println("Values before remove: "+ newmap);
// 移除key為2的value
newmap.remove(2);
System.out.println("Values after remove: "+ newmap);
}
}
㈣ JAVA中的List里的Map 如何去除重復的Key
「可以利用Map的key不重復特性: 遍歷List,遍歷過程中將List中取出的值作為key保存到一個臨時的Map中,Map的value可以自己隨意設定。 注意,在保存到Map之前,使用map.get("key")從Map中獲取對應是數據,判斷是否為null即可判斷該List中的值是否...」
㈤ java ee問題,我用map.remove()方法不能刪除元素
大致看了下目前的情況,我估計你大概沒理解MAP的數據結構,map是一種以key value形式保存數據的結構,你用的remove方法接收的參數是指map的key值,我懷疑你的這個bid並不是map的key值,而是value值,理由就是map.containsKey(bid);這句話的結果是false,所以你不能直接調用remove方法刪除,只能遍歷map比較value值:
Iterator it = map.keySet().iterator();
if(it.hasNext()){
Object o = it.next();
if(bid.equals(o)){
it.remove();
}
}
這樣應該可以了,不過這不是最好的辦法,你應該去看看數據進入map的時候是如何保存的,調用這個delete方法的時候應該傳過來的是這個map當時存放的key,這樣才比較高效
㈥ 怎麼樣刪除map中指定值為value所有元素
祝:學習進步!
㈦ JAVA中HashMap如何刪除元素
HashMap刪除元素根據其遍歷方式一般有兩種方法,實例演示如下:
一、採用foreach模式,適用於不需要修改HashMap內元素的遍歷,只需要獲取元素的鍵/值的情況。
1、遍歷如下:
原因在於,迭代器遍歷時,每一次調用 next() 函數,至多隻能對容器修改一次。上面的代碼則進行了兩次修改:一次添加,一次刪除。
㈧ java map 的用法
map是個介面
用都是用HasMap等實現Map介面的類
創建:Map<String,String> map = new HashMap<String,String>();
插入元素:map.put("1","a");
移除元素: map.remove("1");
清空: map.clear();
具體參照java API
java.uitl.HashMap
㈨ 在java集合HashMap中如何替換某一個鍵值
這個我暫時也沒找到好的方法,只能是遍歷一次整個hashmap,記錄所要替換的value所屬的key,然後將之刪除,根據其key重新put進一個新的值。示例代碼如下(把hashmap集合中的值為USA 的記錄替換 成「US」):
publicstaticvoidmain(String[]args){
//被替換的key和value
intreplace_key=-1;//暫時不知道值USA所在的key,賦默認值-1
//新的key和value
intnew_key;
Stringnew_value="US";
HashMap<Integer,String>countries=newHashMap<Integer,String>();
countries.put(1,"China");
countries.put(2,"USA");
countries.put(3,"Australia");
//替換之前遍歷一次hashmap,順便記錄一下要替換的值「USA」所在的key
System.out.println("------替換前-------------");
Iterator<Entry<Integer,String>>iterator=countries.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<Integer,String>entry=iterator.next();
Integerkey=entry.getKey();
Stringvalue=entry.getValue();
if(value.equals("USA")){
replace_key=key;
}
System.out.println(key+":"+value);
}
//開始替換,把key為2的值USA替換成US;
if(replace_key!=-1){
countries.remove(replace_key);
countries.put(replace_key,new_value);
}
//遍歷新的hashmap看看成功替換否
System.out.println("--------替換後---------------");
Iterator<Entry<Integer,String>>iterator2=countries.entrySet().iterator();
while(iterator2.hasNext()){
Map.Entry<Integer,String>entry=iterator2.next();
Integerkey=entry.getKey();
Stringvalue=entry.getValue();
System.out.println(key+":"+value);
}
}
運行效果:
㈩ 在線等,急。Java中如何通過key值把LinkedHashMap中的Value刪除
entries.remove(Object o) 這是直接刪除對象的,傳key進去沒有用,你可以debug一下remove返回肯定是false。
可以直接從map中直接把id刪掉,map.remove(id)
publicvoiddelete(intid){
map.remove(id);
}
這樣處理效率比較高,時間復雜度O(n)。或者可以這樣
publicvoiddelete(intid){
map.keySet().remove(id);
}