Map

HashMap 

Map 是键值对集合。其中key列就是一个集合,key不能重复,但是value可以重复。 HashMap、TreeMap和Hashtable是Map的三个主要的实现类。 HashTable 是线程安全的,不能存储 null 值 HashMap 不是线程安全的,可以存储 null 值


HashMap 的父类是AbstractMap    并且不能包含重复键,但可以包含重复值
允许键值都为null,方法允许key==null,     方法并没有对value进行任何调用,所以允许为null  ,并且还是无序   方法是非同步的
非线程安全的    执行效率比hashtable快


Hashtable
 继承Dictiionary     方法是同步的      方法不允许value==null      方法调用了key的hashCode方法,如果key==null,会抛出空指针异常
线程安全的   无序






hashmap hashtable
线程不安全 线程安全
允许有null的键和值 不允许有null的键和值
效率高一点、 效率稍低
方法不是Synchronize的要提供外同步 方法是是Synchronize的
有containsvalue和containsKey方法 有contains方法方法
HashMap 是Java1.2 引进的Map interface 的一个实现 Hashtable 继承于Dictionary 类
HashMap是Hashtable的轻量级实现 Hashtable 比HashMap 要旧




ConcurrentHashMap  是线程安全的,并且是无序的


ConcurrentSkipListMap是线程安全的,并且是有序的


所有键值对 — 参见 entrySet()
所有键 — 参见 keySet()
有值 — 参见 values()




TreeMap

TreeMap  是有序的,非同步的     keyIterator()的作用是返回顺序的KEY的集合,descendingKeyIterator()的作用是返回逆序的KEY的集合。

TreeMap的默认是升序的,如果要降序就要改方法




实例



遍历Map的四种方法
public static void testMap(){

Map<String, String> map = new HashMap<String, String>();
map.put("1", "value1");
map.put("2", "value2");
map.put("3", "value3");

//第一种:普遍使用,二次取值
System.out.println("通过Map.keySet遍历key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}

通过Map.keySet遍历key和value:
key= 3 and value= value3
key= 2 and value= value2
key= 1 and value= value1




//第二种
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}


通过Map.entrySet使用iterator遍历key和value:
key= 3 and value= value3
key= 2 and value= value2
key= 1 and value= value1



/ /第三种:推荐,尤其是容量大时
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}

通过Map.entrySet遍历key和value
key= 3 and value= value3
key= 2 and value= value2
key= 1 and value= value1




//第四种
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}


通过Map.values()遍历所有的value,但不能遍历key
value= value3
value= value2
value= value1
}


测试HashMap
public static void testHashMap(){
HashMap<String, String> hashmap=new HashMap<String, String>();
hashmap.put("张三", "value1");
hashmap.put("李四", "value3");
hashmap.put("哈哈", "value2");
for (String key : hashmap.keySet()) {
System.out.println("key= "+ key + " and value= " + hashmap.get(key));
}
}
key= 哈哈 and value= value2
key= 张三 and value= value1
key= 李四 and value= value3   (无序)







对map排序时用 
实例如下
ArrayList<RankingData> sortList=new ArrayList<RankingData>();
sortList.addAll(typeMap.values());
//给排行榜做排序
 Collections.sort(sortList,     new RankCompartor()(这个里面写下面的方法)       ); @Override
 for (int i = 0; i < sortList.size(); i++) {
RankingData rankBean = sortList.get(i);    
if(rankBean==null)
{
 continue;
}
  rankBean.setState((byte)1);
ankBean.setRankNum(i+1);
 }




就是这个方法//new RankCompartor()
public class RankCompartor implements Comparator<RankingData>{


@Override
/**传入俩个玩家的信息进行比较*/
public int compare(RankingData o1, RankingData o2) {
//降序排列
if(o2.getRankingCount()>o1.getRankingCount()){
return 1;
}

return 0;
}


}


使用 Map按key进行排序    还要在声明一个类
public static void main(String[] args) {


Map<String, String> map = new TreeMap<String, String>();


map.put("a", "kfc");
map.put("g", "wnba");
map.put("c", "nba");
map.put("z", "cba");


Map<String, String> resultMap = sortMapByKey(map); //按Key进行排序


for (Map.Entry<String, String> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());      a kfc        c nba       g wnba          z cba
}
}

/**
* 使用 Map按key进行排序
* @param map
* @return
*/
public static Map<String, String> sortMapByKey(Map<String, String> map) {
if (map == null || map.isEmpty()) {
return null;
}


Map<String, String> sortMap = new TreeMap<String, String>(
new MapKeyComparator());


sortMap.putAll(map);


return sortMap;
}
这个就是上面要声明的类
public class MapKeyComparator implements Comparator<String> {



@Override
public int compare(String str1, String str2) {

return str1.compareTo(str2);
}
}










按照value进行排序
public class Testing {  
  
    public static void main(String[] args) {  
  
        HashMap<String,Double> map = new HashMap<String,Double>();  
        ValueComparator bvc =  new ValueComparator(map);  
        TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc);  
  
        map.put("A",99.5);  
        map.put("B",67.4);  
        map.put("C",67.4);  
        map.put("D",67.3);  
  
        System.out.println("unsorted map: "+map);  
  
        sorted_map.putAll(map);  
  
        System.out.println("results: "+sorted_map);  
    }  
}  
  
class ValueComparator implements Comparator<String> {  
  
    Map<String, Double> base;  
    public ValueComparator(Map<String, Double> base) {  
        this.base = base;  
    }  
  


    public int compare(String a, String b) {  
        if (base.get(a) >= base.get(b)) {  
            return -1;  
        } else {  
            return 1;  
        } 
    }  
}


map排序


String 是字符串,它的比较用compareTo方法,它从第一位开始比较,如果遇到不同的字符,则马上返回这两个字符的ascii值差值..返回值是int类型


int跟int的比较不能用compareTo方法,直接用大于(>) 小于(<) 或者 等于(==) 不等于(!=)来比较即可


compare to 方法比较的是两个字符串的大小,先把int型变量转换成String再进行比较  String.valueOf()方法








package test;


import java.util.Comparator;
import java.util.Map;


/**
 * 按照value进行排序
 * xutengteng
 * 2016-9-22
 */
public class ValueComparator implements Comparator<String>{




    Map<String, Double> base;  
    public ValueComparator(Map<String, Double> base) {  
        this.base = base;  
    }  
  
//    /**按照降序排序*/
//    public int compare(String a, String b) {  
//        if (base.get(a) >= base.get(b)) {  
//            return -1;  
//        } else {  
//            return 1;  
//        } 
//    } 
排序前: {D=67.3, A=99.5, B=67.4, C=67.4}
排序后{A=99.5, C=67.4, B=67.4, D=67.3}


    /**按照升序排序*/
    public int compare(String a, String b) {  
        if (base.get(a) <= base.get(b)) {  
            return -1;  
        } else {  
            return 1;  
        } 
    } 
排序前: {D=67.3, A=99.5, B=67.4, C=67.4}
排序后{D=67.3, C=67.4, B=67.4, A=99.5}
}










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值