java中Map常见用法

Map接口的用法

集合中Collection、Set、List接口都属于单值操作,即每次只能操作一个对象;Map与他们不同的是,每次操作的是一对对象,即二次偶对象,每个元素都以key-value的形式存储在集合中。

     1、Map接口定义:

public interface Map<K,V>:在Map上应用了泛型,必须同时设置好key和value的类型,其中Map中每一对key-value表示一个值。

     2、Map.Entry接口:

Map.Entry是Map内部定义的一个接口,用来保存key->value的内容。定义如下:

Public static interface Map.Entry<K,V>:Map.Entry使用static关键字声明的内部接口,此接口可以由外部通过“外部类.内部类”的形式直接调用。该接口常用方法如下:

方法

类型

描述

public Boolean equals(Object o)

普通

对象比较

public K getKey()

普通

取得key

public V getValue()

普通

取得value

public int hashCode()

普通

返回哈希码

public V setValue(V value)

普通

设置value的值

集合中,实际上是将key-value的数据保存在Map.Entry的实例之后,再在Map集合中插入的是一个Map.Entry的实例化对象。注意,在一般的Map操作中(例如,增加或取出数据等操作)不用管Map.Entry接口,但是将Map中的数据全部输出时就必须使用Map.Entry接口。

      3、Map接口常用子类:

HashMap:无序存放,新的操作类,key不允许重复。

Hashtable:无序存放,旧的操作类,key不允许重复。

TreeMap:有顺序,按集合中的key排序,key不允许重复。

WeakHashMap:弱引用的Map集合,当集合中的某些内容不再使用时清除无用的数据,使用gc进行回收。

IdentityHashMap:key可以重复的Map集合。

  * HashMap,本身是Map的子类,直接使用此类为Map接口实例化即可。相关实例,例如向集合中增加和取出内容。

package bugtree;

 

import java.util.Collection;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

 

public classdemo{

   

public staticvoidmain(String args[]) {

    Map<String, String> map=new HashMap<String, String>();//实例化一个HashMap对象

    map.put("baidu","https://www.baidu.com/");//增加内容

    map.put("360", "https://www.360.cn/");//增加内容

    map.put("souhu","http://www.sohu.com/");//增加内容

    //根据key取出value

    String var1=map.get("baidu");

    System.out.println("取出的内容是:"+var1);//输出Map

   

    //判断指定的keyvalue是否存在

    if (map.containsKey("baidu")){   //判断指定的key是否存在

        System.out.println("搜索的key存在");

    }else {

        System.out.println("搜索的key不存在");

    }

    if (map.containsValue("https://www.360.cn/")){   //判断指定的value是否存在

        System.out.println("搜索的value存在");

    }else {

        System.out.println("搜索的value不存在");

    }

   

    //输出全部的key

    Set<String> keys=map.keySet();//得到全部的key

    Iterator<String> iter=keys.iterator();//实例化Iterator

    System.out.println("全部的key");

    while(iter.hasNext()) {      //迭代输出全部的key

        String str=iter.next();  //取出集合的key

        System.out.println(str+"");

    }

   

    //取出全部的value

    Collection<String> values=map.values();//得到全部的value

    Iterator<String> iter1=values.iterator();//实例化Iterator

    System.out.println("全部的value");

    while (iter1.hasNext()) {

        String str=iter1.next();//取出value

        System.out.println(str+"");

       

    }

   

 

}

}

 

  *Hashtable:HashMap和Hashtable在操作上没有大的区别,但是有各自的特点:

序号

比较点

HashMap

Hashtable

1

推出时间

JDK1.2之后推出的,属于新的操作类

JDK1.1推出

2

性能

采用异步处理方式,性能更高

采用同步,性能较低

3

线程安全

属于非线程安全的操作类

属于线程安全的操作类

 *TreeMap:主要功能是按key排序,案例如下:

package bugtree;

 

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import java.util.TreeMap;

 

public classdemo{

public staticvoidmain(String args[]) {

    Map<String, String> map=new TreeMap<String, String>();//实例化一个TreeMap对象

    map.put("baidu","https://www.baidu.com/");//增加内容

    map.put("360", "https://www.360.cn/");//增加内容

    map.put("souhu","http://www.sohu.com/");//增加内容

   Set<String>keys=map.keySet();

   Iterator<String>iter=keys.iterator();

   while(iter.hasNext()){ //迭代输出

        String str=iter.next();

        System.out.println(str+"--"+map.get(str));

    }   

}

}

*WeakHashMap:之前讲解的Map子类中的数据都是使用强引用保存的,即里面的内容不管是否使用都始终在集合中保留,如果希望集合自动清理暂时不用的数据就使用WeakHashMap类。这样,当进行垃圾收集时会释放掉集合中的垃圾信息。

package bugtree;

 

import java.util.Map;

import java.util.WeakHashMap;

 

public classdemo{

public staticvoidmain(String args[]){

    Map<String,String> map;

    map=newWeakHashMap<String,String>();//实例化一个Map对象

    map.put(new String("baidu"),newString("https://www.baidu.com/"));//增加内容

    map.put(new String("360"), new String("https://www.360.cn/"));//增加内容

    System.gc();

    map.put(new String("souhu"),newString("http://www.sohu.com/"));//增加内容

   System.out.println("内容:"+map);        

}

}

*IdentityHashMap:key可以重复的Map集合,HashMap操作重复的key值会覆盖之前的内容,但是IdentityHashMap不会覆盖。

   packagebugtree;

 

import java.util.IdentityHashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import java.util.WeakHashMap;

 

import javax.print.attribute.standard.Media;

 

public classdemo{

public staticvoidmain(String args[]){

    Map<String,String> map;

    map=new IdentityHashMap<String,String>();//实例化一个Map对象

    map.put(new String("baidu"),newString("https://www.baidu.com/"));//增加内容

    map.put(new String("baidu"),newString("https://www.baidu.com/"));//增加内容

    map.put(new String("souhu"),newString("http://www.sohu.com/"));//增加内容

    Set<Map.Entry<String,String>> allSet=null;

    allSet=map.entrySet();

    Iterator<Map.Entry<String,String>> iter=null;//声明Iterator

    iter=allSet.iterator();

    while (iter.hasNext()) {

        Map.Entry<String,String> w=iter.next();

        System.out.println(w.getKey()+"-->"+w.getValue());

    }       

}

}

    *

 

 

### JavaMap 集合的使用 在 Java 的集合框架中,`Map` 是一种存储键值对的数据结构。它通过唯一的键来映射对应的值,不允许存在重复的键。常见的 `Map` 实现类有 `HashMap`、`TreeMap` 和 `LinkedHashMap`。 #### 基本用法 下面是一个简单的例子展示如何创建并操作一个 `Map`: ```java import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { // 创建一个 HashMap 并初始化一些数据 Map<String, Double> map = new HashMap<>(); map.put("蜘蛛精", 169.8); map.put("紫霞", 165.8); map.put("至尊宝", 169.5); map.put("牛魔王", 183.6); // 输出整个 Map System.out.println(map); // 遍历 Map 的键值对 for (Map.Entry<String, Double> entry : map.entrySet()) { String key = entry.getKey(); double value = entry.getValue(); System.out.println(key + " ===>" + value); } } } ``` 上述代码展示了如何向 `Map` 添加元素以及遍历其内容[^1]。 --- ### JavaMap 集合的排序方法 对于 `Map` 集合来说,默认情况下并不保证按键或值的顺序排列。如果需要对其进行排序,则可以通过以下几种方式实现。 #### 方法一:基于 `TreeMap` 进行自然排序或自定义排序 `TreeMap` 可以自动按照键的自然顺序或者指定比较器进行排序。以下是按键升序和降序的例子: ```java import java.util.*; public class TreeMapExample { public static void main(String[] args) { Map<String, Double> unsortedMap = new HashMap<>(); unsortedMap.put("蜘蛛精", 169.8); unsortedMap.put("紫霞", 165.8); unsortedMap.put("至尊宝", 169.5); unsortedMap.put("牛魔王", 183.6); // 升序排序 Map<String, Double> sortedAscMap = new TreeMap<>(unsortedMap); System.out.println("升序排序:" + sortedAscMap); // 降序排序 Map<String, Double> sortedDescMap = new TreeMap<>( (k1, k2) -> k2.compareTo(k1)); sortedDescMap.putAll(unsortedMap); System.out.println("降序排序:" + sortedDescMap); } } ``` 此方法适用于仅需按键排序的情况[^2]。 --- #### 方法二:基于 `ArrayList` 和 `Collections.sort()` 对键或值排序 可以先将 `Map` 转换为列表形式,再利用 `Comparator` 定义排序逻辑。下面是分别针对键和值排序的示例: ```java import java.util.*; import java.util.stream.Collectors; public class SortByKeyOrValue { public static void main(String[] args) { Map<String, Double> map = new HashMap<>(); map.put("蜘蛛精", 169.8); map.put("紫霞", 165.8); map.put("至尊宝", 169.5); map.put("牛魔王", 183.6); // 按键排序 List<Map.Entry<String, Double>> sortByKey = new ArrayList<>(map.entrySet()); Collections.sort(sortByKey, Comparator.comparing(e -> e.getKey())); System.out.println("按键排序:" + sortByKey.stream() .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue))); // 按值排序 List<Map.Entry<String, Double>> sortByName = new ArrayList<>(map.entrySet()); Collections.sort(sortByName, Comparator.comparing(e -> e.getValue())); System.out.println("按值排序:" + sortByName.stream() .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue))); } } ``` 这种方法提供了更大的灵活性,允许开发者自由定制排序规则[^3]。 --- #### 方法三:基于流式 API (`Stream`) 排序 借助于 Java 8 提供的流式处理能力,也可以轻松完成排序任务。这里给出一个典型的案例: ```java import java.util.*; import java.util.stream.Collectors; public class StreamSortExample { public static void main(String[] args) { Map<String, Double> map = new HashMap<>(); map.put("蜘蛛精", 169.8); map.put("紫霞", 165.8); map.put("至尊宝", 169.5); map.put("牛魔王", 183.6); LinkedHashMap<String, Double> result = map.entrySet() .stream() .sorted(Map.Entry.<String, Double>comparingByValue()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); System.out.println(result); } } ``` 这段代码实现了根据值从小到大排序的功能,并保持了插入顺序[^4]。 --- ### 总结 以上介绍了三种不同的 `Map` 排序方案,分别是基于 `TreeMap` 自然/逆序排序、基于 `List` 手动排序以及采用流式 API 处理的方式。每种都有各自的适用场景,在实际开发过程中可以根据需求灵活选用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值