Java笔记 - Map集合

Map集合使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值。Map也被称为双列集合,对应的Collection集合是单列集合。

  • Map集合的常用方法:

Map< K, V>
1. 添加
V put(K key,V value):返回前一个和key关联的值,如果没有返回null。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值
2. 删除
void clear():清空Map集合
V remove(Object key):根据指定的key移除这个键值对,如果不存在key,返回null。
3. 判断
boolean containsKey(Object key):是否包含key
boolean containsValue(Object value):是否包含value
boolean isEmpty():Map集合是否为空,为空则返回true。
4. 获取
V get(Object key):返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
int size():获取键值对的个数
Collection< V> values():返回此映射中包含的值的 Collection 视图。就是说返回一个包含Map集合中的值的Collection集合。

    public static void main(String[] args){
        Map<Integer, String> map = new HashMap<Integer, String>();
        map.put(5,"zhangsan");
        map.put(3,"wangwu");
        map.put(2,"zhangsan");
        map.put(6,"zhaoliu");

        Collection<String> values = map.values();

        Iterator<String> it2 = values.iterator();
        while(it2.hasNext()){
            System.out.println(it2.next());
        }
}

输出结果:
zhangsan
wangwu
zhangsan
zhaoliu

  • Map集合取出元素的方法:

1. keySet
Collection集合中有迭代器,可以使用迭代器来取出Collection集合中的元素,但是Map集合中没有迭代器。通过keySet方法获取Map集合中所有的键所在的Set集合,再通过Set的迭代器获取到每一个键对应的值。

public static void main(String[] args){
    Map<Integer, String> map = new HashMap<Integer, String>();
    keySet(map);
}

public static void keySet(Map<Integer, String> map){
    map.put(5,"zhangsan");
    map.put(3,"wangwu");
    map.put(2,"zhangsan");
    map.put(6,"zhaoliu");

    Set<Integer> ks = map.keySet();
    Iterator<Integer> it = ks.iterator();
    while(it.hasNext()){
        Integer key = it.next();
        String value = map.get(key);
        System.out.println(key+"...."+value);
    }
}

输出结果:
2….zhangsan
3….wangwu
5….zhangsan
6….zhaoliu

2. entrySet
通过Map集合中的方法Set< Map.Entry< K,V>> entrySet()返回此映射中包含的映射关系的 Set 视图。该方法将Map集合中键与值的映射关系作为对象存储到Set集合中,Set集合中元素的类型就是Map.Entry类型的。
Map.Entry< K,V>是一个接口,表示映射项(键-值对)。接口中包含两个方法getKey()和getValue()分别返回对应的键和值。

public static void main(String[] args){
    Map<Integer, String> map = new HashMap<Integer, String>();
    entrySet(map);
}

public static void entrySet(Map<Integer, String> map){
    map.put(5,"zhangsan");
    map.put(3,"wangwu");
    map.put(2,"zhangsan");
    map.put(6,"zhaoliu");

    Set<Map.Entry<Integer, String>> entrySet =map.entrySet();
    Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
    while (it.hasNext()) {
        Map.Entry<Integer, String> en = it.next();
        Integer key = en.getKey();
        String value = en.getValue();
        System.out.println(key+".........."+value);
    }
}

输出结果:
2……….zhangsan
3……….wangwu
5……….zhangsan
6……….zhaoliu

  • Map集合常用子类

1. HashTable
HashTable的内部结构是哈希表,是同步的。HashTable不允许null作为键,也不允许null作为值。
HashTable在JDK1.0就已经出现了,当时还没有集合框架,没有Map集合。所以在当时单列集合就是Vector,双列集合就是HashTabel。
HashTable有一个十分重要的子类就是Properties类。它用来存储键值对型的配置文件信息。

2. HashMap

关于HashMap详解参见:http://alex09.iteye.com/blog/539545
下面直接举例说明:

public static void main(String[] args){
    HashMap<Student,String> hm = new HashMap<Student,String>();
    hm.put(new Student("lisi",23),"北京");
    hm.put(new Student("zhaoliu",24),"上海");
    hm.put(new Student("xiaoqiang",31),"沈阳");
    hm.put(new Student("wangcai",28),"大连");
    hm.put(new Student("zhaoliu",24),"铁岭");

    Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
    Iterator<Map.Entry<Student,String>> it = entrySet.iterator();
    while(it.hasNext()){
        Map.Entry<Student,String> en = it.next();
        Student key = en.getKey();
        String value = en.getValue();
        System.out.println(key.getName()+":"+key.getAge()+"---"+value);
    }
}

public class Person {

    private String name;
    private int age;
    //此处省略构造函数,get、set方法,hashCode方法,equals方法,toString方法
}

public class Student extends Person{
    public Student() {
        super();    
    }
    public Student(String name, int age) {
        super(name, age);   
    }
    public String toString() {
        return "Student:"+getName()+":"+getAge();
    }
}

输出结果:
wangcai:28—大连
lisi:38—北京
zhaoliu:24—铁岭
xiaoqiang:31—沈阳
zhaoliu:24—上海

3. TreeMap
原理参见:http://blog.csdn.net/chenssy/article/details/26668941
举例说明:

public static void main(String[] args) {
    TreeMap<Student,String> tm = new TreeMap<Student,String>(new ComparatorByName());

    tm.put(new Student("lisi",38),"北京");
    tm.put(new Student("zhaoliu",24),"上海");
    tm.put(new Student("xiaoqiang",31),"沈阳");
    tm.put(new Student("wangcai",28),"大连");
    tm.put(new Student("zhaoliu",24),"铁岭");

    Iterator<Map.Entry<Student, String>> it = tm.entrySet().iterator();
    while(it.hasNext()){
        Map.Entry<Student,String> me = it.next();
        Student key = me.getKey();
        String value = me.getValue();
        System.out.println(key.getName()+":"+key.getAge()+"---"+value);
    }   
}

输出结果:
lisi:38—北京
wangcai:28—大连
xiaoqiang:31—沈阳
zhaoliu:24—铁岭

4. LinkedHashMap
LinkedHashMap由哈希表和链接列表实现,是有序的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值