集合详解(四):Map

一、Map
(一)Map概述
1、Map集合:将键映射到值的对象。
1)一个映射不能包含重复的键;
2)每个键最多只能映射到一个值。  
2、Map集合和Collection集合的区别
1)Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对 。
2)Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)
3、注意: 
1)Map集合的数据结构只针对键有效,跟值无关 ,HashMap,TreeMap。 
2)Collection集合的数据结构是针对元素有效 。
(二)功能
1、添加功能
1)V put(K key,V value):添加元素。这个其实还有另一个功能
  • 如果键是第一次存储,就直接存储元素,返回null 
  • 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值 
2、删除功能
1)void clear():移除所有的键值对元素
2)V remove(Object key):根据键删除键值对元素,并把值返回
3、判断功能 (有意思)
1)boolean containsKey(Object key):判断集合是否包含指定的键
2)boolean containsValue(Object value):判断集合是否包含指定的值
3)boolean isEmpty():判断集合是否为空
4、长度功能 
  int size():返回集合中的键值对的对数
5、获取功能
1)基本方法:
  • Set<Map.Entry<K,V>> entrySet():遍历获取
  • V get(Object key):根据键获取值
  • Set<K> keySet():获取集合中所有键的集合
  • Collection<V> values():获取集合中所有值的集合 
2)遍历Map的方法
  • 方法1:先拿到所有的key,然后遍历获取所有的value
    • keySet()
    • get(Object key)
  • 方法2:先拿到所有的键值对,然后遍历,获取每一个键值对对象-Entry(推荐)。
    • entrySet()
    • Map.Entry
3)图解
4)具体代码
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;">	/*
	 * Map集合的遍历。
	 * 方法1:先拿到所有的key,然后遍历获取所有的value
	 * 方法2:先拿到所有的键值对,然后遍历,获取每一个键和值(推荐)
	 * 
	 */
	public void test3(){
		
		// 创建集合对象
		Map<String, String> map = new HashMap<String, String>();

		// 创建元素并添加到集合
		map.put("杨过", "小龙女");
		map.put("郭靖", "黄蓉");
		map.put("杨康", "穆念慈");
		map.put("陈玄风", "梅超风");

		
		// 方法1:获取所有的键,然后根据键获取值(键找值)
		Set<String> set = map.keySet();
		// 遍历键的集合,获取得到每一个键
		for (String key : set) {
			// 根据键去找值
			String value = map.get(key);
			System.out.println(key + "---" + value);
		}
		
		// 方法2: 直接拿到所有的键值
		Set<Map.Entry<String, String>> entrySet = map.entrySet();//拿到键值的Set集合
		for (Map.Entry<String, String> entry : entrySet) {//遍历集合,拿到每一对的键值
			System.out.println(entry.getKey() + ":" + entry.getValue());
		}
		
		// 方法2: 直接拿到所有的键值
		for (Map.Entry<String, String> entry : map.entrySet()) {
			System.out.println("key= " + entry.getKey() + " and value= "
					+ entry.getValue());
		}
	}
</span></span>

 
二、HashMap
1、概述:
1)HashMap是基于哈希表的Map接口实现。
2)哈希表的作用是用来保证键的唯一性的,即键是唯一的,值是可重复的。
2、Hashtable和HashMap的区别? 
1)Hashtable:线程安全,效率低。不允许null键和null值
2)HashMap:线程不安全,效率高。允许null键和null值
<span style="font-size:18px;">		// hm.put(null, "world"); //NullPointerException
		// hm.put("java", null); // NullPointerException</span>
3、实例:键的唯一性
<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;">	/*
	 * HashMap:是基于哈希表的Map接口实现。
	 * 哈希表的作用是用来保证键的唯一性的。
	 * 
	 * HashMap<String,String>
	 * 键:String
	 * 值:String
	 */
	public void test1(){

		// 创建集合对象
		HashMap<String, String> hm = new HashMap<String, String>();

		// 创建元素并添加元素
		// String key1 = "it001";
		// String value1 = "马云";
		// hm.put(key1, value1);

		hm.put("it001", "马云");
		hm.put("it003", "马化腾");
		hm.put("it004", "乔布斯");
		hm.put("it005", "张朝阳");
		hm.put("it002", "裘伯君"); // wps
		hm.put("it001", "比尔盖茨");

		// 遍历
		Set<String> set = hm.keySet();
		for (String key : set) {
			String value = hm.get(key);
			System.out.println(key + "---" + value);
		}
	
	}</span></span>

 
三、LinkedHashMap
1、特性:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
1)由哈希表保证键的唯一性
2)由链表保证键盘的有序(存储和取出的顺序一致)
2、实例:
<span style="font-size:18px;">/*
 * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
 * 由哈希表保证键的唯一性
 * 由链表保证键盘的有序(存储和取出的顺序一致)
 */
public class LinkedHashMapDemo {
	public static void main(String[] args) {
		// 创建集合对象
		LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();

		// 创建并添加元素
		hm.put("2345", "hello");
		hm.put("1234", "world");
		hm.put("3456", "java");
		hm.put("1234", "javaee");
		hm.put("3456", "android");

		// 遍历
		Set<String> set = hm.keySet();
		for (String key : set) {
			String value = hm.get(key);
			System.out.println(key + "---" + value);
		}
	}
}
</span>
 
四、TreeMap
1、TreeMap:是基于红黑树的Map接口的实现。
2、实现:需要排序比较接口同TreeSet
3、实例:"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果
<span style="font-size:18px;">	/*
	 * 需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
	 * 
	 * 分析:
	 * 		A:定义一个字符串(可以改进为键盘录入)
	 * 		B:定义一个TreeMap集合
	 * 			键:Character
	 * 			值:Integer
	 * 		C:把字符串转换为字符数组
	 * 		D:遍历字符数组,得到每一个字符
	 * 		E:拿刚才得到的字符作为键到集合中去找值,看返回值
	 * 			是null:说明该键不存在,就把该字符作为键,1作为值存储
	 * 			不是null:说明该键存在,就把值加1,然后重写存储该键和值
	 * 		F:定义字符串缓冲区变量
	 * 		G:遍历集合,得到键和值,进行按照要求拼接
	 * 		H:把字符串缓冲区转换为字符串输出
	 * 
	 */
	public void test3() {
		
		String line = "aababcabcdabcde";
		
		// 定义一个字符串(可以改进为键盘录入)
//		Scanner sc = new Scanner(System.in);
//		System.out.println("请输入一个字符串:");
//		String line = sc.nextLine();

		// 定义一个TreeMap集合
		TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
		
		//把字符串转换为字符数组
		char[] chs = line.toCharArray();
		
		//遍历字符数组,得到每一个字符
		for(char ch : chs){
			//拿刚才得到的字符作为键到集合中去找值,看返回值
			Integer i =  tm.get(ch);
			
			//是null:说明该键不存在,就把该字符作为键,1作为值存储
			if(i == null){
				tm.put(ch, 1);
			}else {
				//不是null:说明该键存在,就把值加1,然后重写存储该键和值
				i++;
				tm.put(ch,i);
			}
		}
		
		//定义字符串缓冲区变量
		StringBuilder sb=  new StringBuilder();
		
		//遍历集合,得到键和值,进行按照要求拼接
		Set<Character> set = tm.keySet();
		for(Character key : set){
			Integer value = tm.get(key);
			sb.append(key).append("(").append(value).append(")");
		}
		
		//把字符串缓冲区转换为字符串输出
		String result = sb.toString();
		System.out.println("result:"+result);
		
	}</span>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值