import java.util.*;

public class MapTest {

    // HashMap中的key是无序且不可重复的?那么HashMap如何保证其key无序且不可重复呢?
    // 参见HasSet如何来保证数据无序且不可重复!因为HashSet就是用HashMap来实现的
    public static void testHashMap() {
        Map<String, String> map = new HashMap<String, String>();

        // 向Map集合中添加数据
        map.put("aa", "Hello1");
        map.put("dd", "Hello1");
        map.put("cc", "Hello2");
        map.put("tt", "Hello3");
        map.put("ff", "Hello7");
        map.put("aa", "NewHello1"); // 当key重复的时候,新的value会覆盖原来的value
        System.out.println("集合中数据的对数:" + map.size());

        // 从集合中查询数据
        System.out.println("集合中是否有key = dd ? " + map.containsKey("dd"));
        System.out.println("集合中是否有vlaue = Hello2 ? "
                + map.containsValue("Hello2"));

        System.out.println("=====================================");
        // 遍历集合
        // 方式1:取出集合中所有的vlaue,保存到一个Collection中
        Collection<String> coll = map.values();
        for (String value : coll) {
            System.out.println(value);
        }

        System.out.println("=====================================");
        // 方式2:取出集合中所有的key,保存到一个Set中(实际上是HashSet)
        Set<String> set = map.keySet();
        for (String key : set) {
            // 根据key取得value
            String value = map.get(key);
            System.out.println("key=" + key + " , value=" + value);
        }

        System.out.println("=====================================");
        // 方式3:取出集合中所有的Entry(Entry中一个key,一个value),保存到一个Set中
        Set<Map.Entry<String, String>> set1 = map.entrySet();
        Iterator<Map.Entry<String, String>> it1 = set1.iterator();
        while (it1.hasNext()) {
            Map.Entry<String, String> entry = it1.next();
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("key=" + key + " , value=" + value);
        }

        System.out.println("=====================================");

        // 从Map集合中删除数据.通过key来删除这对数据,返回的是该key对应的value
        String value = map.remove("cc");
        System.out.println("数据删除成功,返回的结果是:" + value);

        System.out.println("集合中数据的对数:" + map.size());
    }
    
    
    // TreeMap中key是不可重复但是可以排序的.那么TreeMap如何保证其key不可重复并且可以排序呢?
    // 参见TreeSet如何保证数据不可重复并且可以排序!因为TreeSet就是用TreeMap来实现的
    public static void testTreeMap() {
        Map<String, String> map = new TreeMap<String, String>();

        // 向Map集合中添加数据
        map.put("aa", "Hello1");
        map.put("dd", "Hello1");
        map.put("cc", "Hello2");
        map.put("tt", "Hello3");
        map.put("ff", "Hello7");
        map.put("aa", "NewHello1"); // 当key重复的时候,新的value会覆盖原来的value
        System.out.println("集合中数据的对数:" + map.size());

        // 从集合中查询数据
        System.out.println("集合中是否有key = dd ? " + map.containsKey("dd"));
        System.out.println("集合中是否有vlaue = Hello2 ? "
                + map.containsValue("Hello2"));

        System.out.println("=====================================");
        // 遍历集合
        // 方式1:取出集合中所有的vlaue,保存到一个Collection中
        Collection<String> coll = map.values();
        for (String value : coll) {
            System.out.println(value);
        }

        System.out.println("=====================================");
        // 方式2:取出集合中所有的key,保存到一个Set中(实际上是TreeSet)
        Set<String> set = map.keySet();
        for (String key : set) {
            // 根据key取得value
            String value = map.get(key);
            System.out.println("key=" + key + " , value=" + value);
        }

        System.out.println("=====================================");
        // 方式3:取出集合中所有的Entry(Entry中一个key,一个value),保存到一个Set中
        Set<Map.Entry<String, String>> set1 = map.entrySet();
        Iterator<Map.Entry<String, String>> it1 = set1.iterator();
        while (it1.hasNext()) {
            Map.Entry<String, String> entry = it1.next();
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("key=" + key + " , value=" + value);
        }

        System.out.println("=====================================");

        // 从Map集合中删除数据.通过key来删除这对数据,返回的是该key对应的value
        String value = map.remove("cc");
        System.out.println("数据删除成功,返回的结果是:" + value);

        System.out.println("集合中数据的对数:" + map.size());
    }

    
    
    public static void testHashtable() {
        Map<String, String> map = new Hashtable<String, String>();

        // 向Map集合中添加数据
        map.put("aa", "Hello1");
        map.put("dd", "Hello1");
        map.put("cc", "Hello2");
        map.put("tt", "Hello3");
        map.put("ff", "Hello7");
        map.put("aa", "NewHello1"); // 当key重复的时候,新的value会覆盖原来的value
        System.out.println("集合中数据的对数:" + map.size());

        // 从集合中查询数据
        System.out.println("集合中是否有key = dd ? " + map.containsKey("dd"));
        System.out.println("集合中是否有vlaue = Hello2 ? "
                + map.containsValue("Hello2"));

        System.out.println("=====================================");
        // 遍历集合
        // 方式1:取出集合中所有的vlaue,保存到一个Collection中
        Collection<String> coll = map.values();
        for (String value : coll) {
            System.out.println(value);
        }

        System.out.println("=====================================");
        // 方式2:取出集合中所有的key,保存到一个Set中(实际上是HashSet)
        Set<String> set = map.keySet();
        for (String key : set) {
            // 根据key取得value
            String value = map.get(key);
            System.out.println("key=" + key + " , value=" + value);
        }

        System.out.println("=====================================");
        // 方式3:取出集合中所有的Entry(Entry中一个key,一个value),保存到一个Set中
        Set<Map.Entry<String, String>> set1 = map.entrySet();
        Iterator<Map.Entry<String, String>> it1 = set1.iterator();
        while (it1.hasNext()) {
            Map.Entry<String, String> entry = it1.next();
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println("key=" + key + " , value=" + value);
        }

        System.out.println("=====================================");

        // 从Map集合中删除数据.通过key来删除这对数据,返回的是该key对应的value
        String value = map.remove("cc");
        System.out.println("数据删除成功,返回的结果是:" + value);

        System.out.println("集合中数据的对数:" + map.size());
    }
    
    public static void main(String[] args) {
        //testHashMap();
        //testTreeMap();
        testHashtable();
    }

}