首页 > 代码库 > Java学习笔记_24_Map接口

Java学习笔记_24_Map接口

24.Map接口:

 Map接口定义了存储“键(key)-值(value)映射对”的方法,Map中不能有重复的“键”,

 Map实现类中储存的”键-值“映射对是通过键来唯一标识的,Map底层的”键“使用Set来存放的,

 所以Map中的映射对的”键”对应的类必须重写hashCode()和equals()方法, 

 常用String作为Map的“键”。

 

 Map的添加、删除操作:

 · Object put(Object key, Object value): 将相互关联的“键-值”存入该映像,如果该关键字已经存在,

   那么与此关键字相关的新值将取代就值,否则返回null。

 · Object remove(Object key): 根据指定的键,把“键-值”从Map中移除。

 · void putAll(Map t): 将来自特定映像的所有元素添加到该映像。

 · Void clear(): 从映像中删除所有的映像。

 

 Map中元素的查询操作:

 · Object get(Object key): 获得与关键字key相关的值,并且返回与关键字key相关的对象,

   如果未找到,返回null。

 · boolean containsKey(Object key): 判断映像中是否存在关键字key。

 · Boolean containsValue(Object value): 判断映像中是否存在value。

 · int size(): 返回当前映像中的数量。

 · boolean isEmpty(): 判断映像是否为空。

 

 Map中元素视图方法:

 · Set keySet(): 返回映像中所有关键字的视图set集,同时还可以从视图中删除“键-值”对,

   但不能添加“键-值”对。

 · Collectio values(): 返回映像中所有值得视图集,同时还可以从视图中删除“键-值”对,

   但不能添加“键-值”对。

 · Set entrySet(): 返回映像中的“键-值”对,同时还可以以从视图中删除“键-值”对,

   但不能添加“键-值”对。

 

1>实现类HashMap:

 HashMap是使用频率最高的一个容器,它内部对“键”用Set进行三列存放,所以根据“键”去取“值”得效率高,

 并且它允许使用null 值和null键,但不能保证映射的书序。

 

下面是HashMap相关用法的例子:

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

public class HashMapTest {

	public static void main(String[] args) {
		// 声明一个HashMap对象
		HashMap<String, String> hmp = new HashMap<String, String>();
		
		// 向hmp中添加“key - value”对
		hmp.put("1", "d");
		hmp.put("0", "c");
		hmp.put("3", "a");
		hmp.put("2", "b");
		hmp.put("5", "e");
		hmp.put("4", "g");
		
		// 输出“key - value”对
		System.out.println("HashMap: \n<K, V>");
		System.out.println("\n显示“key-value”对: ");
		System.out.println(hmp);
		
		// 删除“key - value”对
		hmp.remove("3");
		hmp.remove("2");
		System.out.println("\n显示删除“key-value“后的”键-值“对: ");
		System.out.println(hmp);
		
		//由key获取value
		System.out.println("\n由key取得对应value: ");
		System.out.println("4=" + hmp.get("4"));
		
		// 获取全部键值,它的返回类型是Set
		Set<String> set = hmp.keySet();
		
		//判断是否存在关键字key
		System.out.println("\n判断是否存在指定key:");
		System.out.println("是否存在key7:" + hmp.containsKey("7"));
		
		//判断是否存在指定value
		System.out.println("\n判断是否存在指定value:");
		System.out.println("是否存在key4"+hmp.containsValue("g"));
		
		//判断容器是否为空
		System.out.println("\n容器是否为空:" + hmp.isEmpty());
		
		//输出容器的容量
		System.out.println("\n输出容器的容量:" + hmp.size());
		
		// 生成一个 迭代器
		Iterator<String> it = set.iterator();
		// 使用键生成的迭代器输出所有”键-值“对的值
		System.out.println("\n输出值: ");
		while (it.hasNext()) {
			System.out.print(hmp.get(it.next()) + ";");
		}
	}
}

输出结果:

HashMap: 

<K, V>

显示“key-value”对: 

{3=a, 2=b, 1=d, 0=c, 5=e, 4=g}

显示删除“key-value“后的”键-值“对: 

{1=d, 0=c, 5=e, 4=g}

由key取得对应value: 

4=g

判断是否存在指定key:

是否存在key7:false

判断是否存在指定value:

是否存在key4:true

容器是否为空:false

输出容器的容量:4

输出值: 

d;c;e;g;

可以看出“键 - 值”对的输出顺序和输出的顺序是不同的。

 

2>实现类LinkedHashMap:

 LilkedHashMap类是hashMap的子类,它可以依照插入的书序来排列元素,增、删、改效率比较高。


下面为LinkedHashMap的例子:

 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Set;
 import java.util.Map;

 public class HashMapTest {

	public static void main(String[] args) {
		//声明一个LinkedHashMap对象
		Map<Integer, String> lhmp = newLinkedHashMap
   <Integer, String>();
		//想lhmp中添加“键 - 值”对
		lhmp.put(1, "a");
		lhmp.put(0, "c");
		lhmp.put(3, "a");
		lhmp.put(2, "b");
		//输出“键 - 值”对
		System.out.println("LinkedHashMap: \n<K, V>");
		System.out.println(lhmp);
		//获取全部键值,它的返回类型是Set
		Set<Integer> set = lhmp.keySet();
		//生成一个 迭代器
		Iterator<Integer> it = set.iterator();
		//使用键生成的迭代器输出所有”键-值“对的值
		System.out.println("<V>");
		while (it.hasNext()) {
			System.out.print(lhmp.get(it.next()) + ";");
		}
	}
 }

输出结果:

 <K, V>

 {1=a, 0=c, 3=a, 2=b}

 <V>

 a;c;a;b;

 

 可以看出“键 - 值”的输入顺序和输出顺序是完全对应的。如果在映射中重新插入键,则插入书序不受影响。

 

3>实现类TreeMap:

 存放入TreeMap中的“键 - 值”对的“键”必须是可排序的。

 

下面通过例子演示TreeMap的相关用法:

import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 public class TreeMapTest {
	public static void main(String[] args) {
		//声明一个TreeMap对象
		Map<String, String> tmp = new TreeMap<String, String>();	
		//向lhmp中添加“键 - 值”对
		lhmp.put(1, "a");
		lhmp.put(0, "c");
		lhmp.put(3, "a");
		lhmp.put(2, "b");
		//输出“键 - 值”对
        System.out.println("TreeMap: \n<K, V>");		   
        System.out.println(tmp);
       System.out.println("输出容器的大小: " + tmp.size());
		//获取全部键值,它的返回类型是Set
		Set<String> set = tmp.keySet();
		//生成一个 迭代器
		Iterator<String> it = set.iterator();
		//使用键生成的迭代器输出所有”键-值“对的值
		System.out.println("<V>");
		while (it.hasNext()) {
			System.out.print(tmp.get(it.next()) + ";");
		}
	}
 }

输出结果:

LinkedHashMap: 

<K, V>

{0=c, 1=a, 2=b, 3=a}

输出容器的大小: 4

<V>

c;a;b;a;

 

在TreeMap中“键”必须是可排序的,在内部存储时会按“键”的序列存储,输出相同。

 

4>实现类Properties:

 Properties类表示了持久的属性集,它可以保存在流中或从流中加载。且其存放的“键 - 值”对都是字符串,

 在存取时应使用setProperties(String key, String value)方法和getProperty(String key)方法。

 

 下面是Properties类的演示例子:

 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;

 public class TreeMapTest {

	public static void main(String[] args) {
         //获取文件并读入到输入流
		InputStream is = (InputStream) Thread.currentThread()
				.getContextClassLoader()
				.getResourceAsStream("config.properties");
		// 创建属性集对象
		Properties prop = new Properties();
		try {
			// 从流中加载数据
			prop.load(is);
		} catch (IOException e) {
			e.printStackTrace();
		}		
        // 获取name属性
		String name = prop.getProperty("name");
		System.out.println("name = " + name);
		//获取password属性
		String pwd = prop.getProperty("password");
		System.out.println("password = " + pwd);
	}
 } 

输出结果:

 name = spilit

 password = abc123

 

 在src中建立Fiel文档config.properties:

 #Key=value

 name=spilit

 password=abc123