Map 集合详解HashMap_TreeMap_LinkedHashMap

Map接口的实现类有HashMap TreeMap LinkedHashMap

HashMap:一般情况下,使用HashMap插入、删除、定位元素。底层实现链表加数组

TreeMap:按自然规律大小顺序或自定义顺序遍历,使用TreeMap 。底层实现二叉树

LinkedHashMap:按照添加的顺序输出,不进行大小排序。底层实现双向链表是HashMap的子类

Eg: Maplinkedhashmap = new LinkedHashMa();

Map treemap =new TreeMap ();

linkedhashmap.put(“2”,”ab”);

linkedhashmap.put(“1”,”cd”);

treemap.put(“2”,”ab”);

treemap.put(“1”,”cd”);

遍历linkedhashmap的时候,先遍历到的key是2,因为2是先放进去的

遍历treemap的时候,先遍历到的key是1,因为是按顺序升序排列

线程安全性

HashMap TreeMapLinkedHashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null,不支持线程同步,即任一时刻可以有多个线程同时写HashMap,会导致数据的不一致性。如果需要同步,使用Collections的synchronizedMap来包装一下使HashMap具有同步的能力

Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。

实现Map同步的写法: 

Map<String String> map = Collections.synchronizedMap(new LinkedHashMap(<String String));

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map; 
public class TestLinkedHashMap {
  public static void main(String args[])
  {
   System.out.println("*************************LinkedHashMap*************");
   Map<Integer,String> map = new LinkedHashMap<Integer,String>();
   map.put(6, "apple");
   map.put(3, "banana");
   map.put(2,"pear");
   
   for (Iterator it =  map.keySet().iterator();it.hasNext();)
   {
    Object key = it.next();
    System.out.println( key+"="+ map.get(key));
   }
   
   System.out.println("*************************HashMap*************");
   Map<Integer,String> map1 = new  HashMap<Integer,String>();
   map1.put(6, "apple");
   map1.put(3, "banana");
   map1.put(2,"pear");
   
   for (Iterator it =  map1.keySet().iterator();it.hasNext();)
   {
    Object key = it.next();
    System.out.println( key+"="+ map1.get(key));
   }
  }
}
运行结果如下:
*************************LinkedHashMap*************
6=apple
3=banana
2=pear
*************************HashMap**************************
2=pear
6=apple
3=banana
分析:LinkedHashmap 的特点是put进去的对象位置未发生变化,而HashMap会发生变化.

常用方法

Objectput(Object key,  Object value):

将互相关联的一个关键字和一个值放入该映射,如果关键字已存在,那么与此关键字相关联的新值将取代旧值,返回关键字的旧值。如果关键字原先并不存在,返回null

Objectremove(Object key):     从映射中删除与key相关的值

voidclear():    删除所有映射

voidputAll(Map t):    将来自特定映射的所有元素添加给该映射

Objectget(Object key):

获取与关键字key相关的值,并返回与关键字key相关的对象,如没有找到key,返回null

booleancontainKey(object key)

booleancontainValue(object value)

booleanisEmpty()

intsize

视图操作

Set keySet()   返回映射中所有关键字的视图集 Set keys = Map.keySet()

Collectionvalues()  返回映射中所有值的视图集

SetentrySet()   返回Map.Entry对象的视图集,即映射中的关键值/对

Map.Entry类

Map的entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键值/对

通过这个集合的迭代器,您可以获得每一个条目(唯一获取方式)的键或值并对值进行更改。当条目通过迭代器返回后,除非是迭代器自身的remove()方法或者迭代器返回的条目的setValue()方法,其余对源Map外部的修改都会导致此条目集变得无效,同时产生条目行为未定义。
  (1) Object getKey(): 返回条目的关键字
  (2) Object getValue(): 返回条目的值
  (3) Object setValue(Objectvalue): 将相关映像中的值改为value,并且返回旧值

例子:java代码
Map<String,Integer> map=new HashMap<String,Integer>();   
map.put("1", 1);   
map.put("2", 2);   
map.put("3", 3);   
map.put("3", 3);       
Iterator itor=map.entrySet().iterator();   
while(itor.hasNext()){   
  Map.Entry<String,Integer> entry=(Map.Entry<String,Integer>)itor.next();   
  System.out.println("key="+entry.getKey().toString());   
  System.out.println("values="+entry.getValue().toString());   
}   
Map<Integer,String> map = new LinkedHashMap<Integer,String>();
 map.put(1, "星期一");
map.put(2, "星期二");
 map.put(3, "星期三");
 map.put(4, "星期四");
 map.put(5, "星期五");
map.put(6, "星期六");
map.put(7, "星期日");
 for(Map.Entry<Integer, String> entry: map.entrySet()) {
System.out.print(entry.getKey() + ":" + entry.getValue() + "\t");
 }
 
輸出結果:
1:星期一 2:星期二 3:星期三 4:星期四 5:星期五 6:星期六 7:星期日



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值