JavaSE第四十八讲:Map深入详解及遍历Map的两种实现手段

1. Map(映射)

   查看JDK Doc 文档,Map中的元素是以键值对的形式存在的,一个键最多只能对应一个值。Map中经常使用的实现类是HashMap,而HashMap中没有add()方法,所以往HashMap中添加元素是用 put(Object key, Object value); 方法添加。两个形式参数都是Object类型,所以可以往里面放任何对象。

package com.ahuier2;

import java.util.HashMap;

public class MapTest1 {
	public static void main(String[] args) {
		HashMap map = new HashMap();
		map.put("a", "zhangsan");
		map.put("b", "lisi");
		map.put("c", "wangwu");
		System.out.println(map);
	}
}
编译结果:

{b=lisi, c=wangwu, a=zhangsan}

【说明】:打印map这个引用,可以发现输出的结果是都是按 “key = value”形式打印的。HashMap和HashSet一样输出的元素是无序。

继续往里面put相同的键,不同的值,查看打印输出结果:

map.put("a", "wangwu");
编译结果:{b=lisi, c=wangwu, a=wangwu}

【说明】:可以看出后面put的值会将原有的值替换掉。


通过HashMap中的get(Object key);方法取相应键的值

package com.ahuier2;

import java.util.HashMap;

public class MapTest1 {
	public static void main(String[] args) {
		HashMap map = new HashMap();
		map.put("a", "zhangsan");
		map.put("b", "lisi");
		map.put("c", "wangwu");
		map.put("a", "zhaolou");	
	//	System.out.println(map);
		
		String value = (String)map.get("b");
		System.out.println(value);
		System.out.println("------------");
		String value2 = (String)map.get("e");
		System.out.println(value2);
	}
}
编译执行结果:

lisi
------------
null

【说明】:这边取的键 "e" 由于没有这个键,所以取出来为空,注意Null可以被人任何类型强制装换。

这边的程序总是知道对应的键,才打印出想对应的值,但是如果再不知道对应的键的情况下,如果知道HashMap中的键值信息呢?有两个方法,HashMap中的keySet()和values()方法,这两个方法要熟练,实际开发过程中很常见。


keySet
public Set<K> keySet()

Returns a Set view of the keys contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa[反之依然].

[返回一个包含在Map中的键的Set视图,这个视图被Map所维护,在map的改变都会反映到set中,反之依然]


values
public Collection<V> values()
Returns a Collection view of the values contained in this map. The collection is backed by the map, so changes to the map are reflected in the collection, and vice-versa.

[返回一个包含在Map中的键的Collection视图,这个视图被Map所维护,在map的改变都会反映到collection中,反之依然]


【注意】:这边为什么keySet()返回的是Set视图,而values()返回的是Collection视图呢?结合以下程序:

package com.ahuier2;

import java.util.HashMap;

public class HashMapTest2 {
	public static void main(String[] args) {
		HashMap map = new HashMap();
//		map.put("a", "zhangsan");
//		map.put("b", "zhangsan");
		String str = new String("zhangsan");
		map.put("a", str);
		map.put("b", str);
		System.out.println(map);
	}
}
编译执行结果:

{b=zhangsan, a=zhangsan}

【说明】:键"a" 和 键"b" 指向相同的对象。说明HashMap键值对中,键不可重复,值可以重复。结合这个程序就可以知道,因为键不可重复,Set中的元素也是不可重复,所以返回的同样是具有相同特性的Set视图,而值不可重复,collection中的元素也是可以重复,所以返回的同样是具有相同特性的collection视图。

Map的keySet()方法会返回key的集合,因为Map的键是不能重复的,因此keySet()方法的返回类型是Set;而Map的值是可以重复的,因此values()方法的返回类型是Collection,可以容纳重复的元素。 

返回到前面所讲,对于想要打印出Map中的每一组信息,利用keySet()方式得到key的信息的Set 集合,然后去遍历这个这个集合,取出每一个key,然后通过get方法就可以得到Map中的键值对的所有信息了,以下程序实现:

package com.ahuier2;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class MapTest3 {
	public static void main(String[] args) {
		HashMap map = new HashMap();
		map.put("a", "aa");
		map.put("b", "bb");
		map.put("c", "cc");
		map.put("d", "dd");
		map.put("e", "ee");
		
		Set set = map.keySet();
		for(Iterator ite = set.iterator(); ite.hasNext();){
			String key = (String)ite.next();
			String value = (String)map.get(key);
			System.out.println(key + "==" + value);
		}
	}
}
编译结果:

d==dd
e==ee
b==bb
c==cc
a==aa


定义main函数,在我们经常写程序的过程中都会定义main函数,如下所示:

	public static void main(String[] args) {
		System.out.println(args.length);
	}

编译结果:

0

(String[] args)表示通过命令行传递过来的参数放在字符串数组中String[],在没有传递任何参数的时候,数组长度为0.

package com.ahuier2;

public class MapTest4 {
	public static void main(String[] args) {
		for(int i = 0; i < args.length; i++){
			System.out.println(args[i]);
		}
	}
}
在Eclipse中实现命令行输入参数:

Run --> Run Configurations --> Java Application点击新建 --> Arguments选项卡。这里面有两个输入框:Program arguments :表示输入的参数[注意这边不同参数之间用空格隔开(例如:aa bb cc dd),如果一个参数中空格也包含,则可以用双引号标注,例如("aa bb" cc dd)]VM arguments: 表示给VM虚拟机指定内存。如48-1所示:

                                  图48-1

编译执行结果:

aa bb
cc
dd


写一个程序,从命令行中输入多个单词(比如:hello world hello welcome world welcome),统计各个单词出现的个数,用Map实现。

用HashMap实现思路如图所示:

程序如下:

如果一个单词第一次出现(即args[i]第一次出现时,),则直接放入map的key中,如果是第二次或者更多次的出现,则直接存在这个的单词key,将其对应的value取出加1再放入map的value中。

package com.ahuier2;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class MapTest4 {
	public static void main(String[] args) {

		HashMap map = new HashMap();
		
			//将用户输入的单词存入args[] 中,其中args[i]表示索引为 i 的单词
		for(int i = 0; i < args.length; i++){
			
				//判断这个单词的键不存在,则直接放入Map中。
			if(map.get(args[i]) == null){
				map.put(args[i], new Integer(1)); //值为1,注意不能直接写原生数据类型1,而是应该用包装类。
			}
			
				//否则,这个单词存在,则将单词key对应的value值取出加1再放入Map中。
			else{
				//	map.put(args[i], new Integer(((Integer)map.get(args[i])).intValue() + 1)); 可读性不好,分开写
				Integer in = (Integer)map.get(args[i]); //取出以前的值
				Integer value = new Integer(in.intValue() + 1); //将这个值加 1
				map.put(args[i], value);//将加1 后的值存入Map中
			}
		}
		
			//使用迭代器输出HashMap中的信息。
		Set set = map.keySet();
		for(Iterator iter = set.iterator(); iter.hasNext();){
			String key = (String)iter.next();
			Integer value = (Integer)map.get(key);
			System.out.println(key + " : " + value);
		}
	}
}

编译执行结果:

hello : 2
welcome : 2
world : 2



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值