Map集合

1 Map父接口

特点:存储一对数据(Key-Value),无序、无下标,键不可重复,值可重复。

定义public interface Map<K,V>

方法

int size();//集合大小
boolean isEmpty();//是否为空
boolean containsKey(Object key);//是否包含key
boolean containsValue(Object value);//是否包含value
V put(K key,V value)   //将对象存入到集合中,关联键值。key重复则覆盖原值。
Object get(Object key) //根据键获取对应的值
V remove(Object key); //删除key 返回对应的值
void clear(); //清空集合
Set<K> keySet()        //返回所有的key
Collection<V> values() //返回包含所有值的Collection
Set<Map.Entry<K,V>> entrySet() //返回此映射中包含的映射关系的 Set 视图。 

2 HashMap

2.1 HashMap的定义

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 --jdk1.6 api

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

2.2 HashMap使用

/**
 * Map集合的使用
 * 特点:存储键值对;键不可以重复,值可以重复;无序
 * HashMap:
 *  jdk1.2版本,线程不安全,运行效率快;允许用null作为key或是value
 */
public class Map1 {
    public static void main(String[] args) {

        //创建集合
        Map<String,String> map = new HashMap<>();

        //添加元素
        map.put("cn","中国");
        map.put("uk","英国");
        map.put("usa","美国");
        map.put("cn","zhongguo");//已经存在键为"cn"的值了,会把原来的值覆盖掉
        map.put(null,"日本");//存放null键值
        map.put("ckk",null);
        System.out.println(map);

        //判断
        System.out.println(map.containsKey("cn"));//判断是否存在key
        System.out.println(map.containsValue("中国"));//判断是否存在value


        //删除元素
//        String usa = map.remove("usa");//会返回删除key所对应的value,key不存在返回null
//        System.out.println("删除了:"+usa);
//        boolean removed = map.remove("uk", "英国");//会返回是否删除成功
//        System.out.println("删除成功:"+removed);

        //遍历
        //方法一 获取key的set集合,使用迭代器
//        Set<String> keySet = map.keySet();
//        Iterator<String> keyIterator = keySet.iterator();
//        while (keyIterator.hasNext()){
//            String key = keyIterator.next();
//            String value = map.get(key);
//            System.out.println(key+"---"+value);
//        }

        //方法二 获取key的set集合,使用增强for
//        Set<String> keySet = map.keySet();
//        for (String key : keySet) {
//            System.out.println(key+"---"+map.get(key));
//        }

        //方法三 获取map的Entry组成的Set集合,然后使用迭代器遍历
//        Set<Map2.Entry<String, String>> entrySet = map.entrySet();
//        Iterator<Map2.Entry<String, String>> entryIterator = entrySet.iterator();
//        while (entryIterator.hasNext()){
//            Map2.Entry<String, String> entry = entryIterator.next();
//            String key = entry.getKey();
//            String value = entry.getValue();
//            System.out.println(key+"---"+value);
//        }

        //方法四 获取map的Entry组成的Set集合,然后使用迭代器遍历
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for (Map.Entry<String, String> entry : entrySet) {
            String key = entry.getKey();
            String value = entry.getValue();
            System.out.println(key+"---"+value);
        }

    }
}

运行结果

{usa=美国, uk=英国, cn=zhongguo}
true
false
usa---美国
uk---英国
cn---zhongguo

HashMap判断重复的方式和HashSet是一样的,都是判断元素(key)的hashCodeequals是否相同。存入HashMap的key要重写这两个方法。

3 Hashtable(不使用)

jdk1.0版本,线程安全,运行效率慢;不允许null作为key或是value

4 Properties

Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。

5 TreeMap

实现了SortedMap接口(是Map的子接口),可以对key自动排序。
TreeMap的key要实现Comparable接口,为了排序。

/**
 * TreeMap的使用
 * 存储结构:红黑树
 */
public class Map2 {
    public static void main(String[] args) {
        //创建集合
        Map<Student,String> stringMap = new TreeMap<>();

        //添加元素
        Student s1 = new Student("王二",100);
        Student s2 = new Student("张三",101);
        Student s3 = new Student("李四",102);
        stringMap.put(s1,"北京");
        stringMap.put(s2,"上海");
        stringMap.put(s3,"天津");
        stringMap.put(s3,"aa");
        System.out.println(stringMap);

    }
}

Student类

public class Student implements Comparable<Student>{
    private String name;
    private int stuNo;

    //getter、setter、构造器、toString

    @Override
    public int compareTo(Student o) {
        return this.stuNo-o.stuNo;
    }
}

运行结果

{Student{name='王二', stuNo=100}=北京, Student{name='张三', stuNo=101}=上海, Student{name='李四', stuNo=102}=aa}

HashMap HashTable TreeMap区别

HashMap HashTable TreeMap
同步
key有序
null key只能有一个null
value可以多个null
都不能为null key不能为null
value可以多个null
posted @ 2020-10-12 13:48  雨中遐想  阅读(75)  评论(0编辑  收藏  举报