java笔记18 Map集合

1.      Map集合

Map<K,V>(双列集合)

key  value

该集合存储键值对,一对一对存在而且要保证键的唯一性

1、添加

                 put(Kkey, V value) 

                 添加相同键的时候,后来值会覆盖原来的值,打印put方法,会返回被覆盖的值

                 putAll(Map<?extends K,? extends V> m)

2、删除

                 voidclear()

                 remove(Objectkey)  

3、判断

                 booleancontainsKey(Object key)

                 containsValue(Objectvalue)

                 isEmpty() 

4、获取

                 get(Objectkey)

                 size()

                 values()

                 Set<Map.Entry<K,V>>entrySet() 

                 keySet()

import java.util.*;
public class H_01Map {
    public static void main(String[] args) {
        Map<String,String> map=new HashMap<String,String>();
        //添加元素
        map.put("001", "zhangsan");
        map.put("002", "lisi");
        map.put("003", "wangwu");
        map.put(null, null);//可以存入null
        sop("containsKey:"+map.containsKey("001"));
        sop("remove:"+map.remove("002"));//输出remove:lisi
        sop(map);//{null=null, 001=zhangsan, 003=wangwu}
        sop("get:"+map.get("001"));//get:zhangsan
        //可以通过get方法的返回值来判断一个键是否存在,返回null不存在
        sop("get:"+map.get(null));
       
        //获取map集合中所有的值
        Collection<String> coll=map.values();
        sop(coll);//[null, zhangsan, wangwu]
        sop(map);//{null=null, 001=zhangsan, 003=wangwu}
    }
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}

 

2.       Map结构

        |--Hashtable:底层是哈希表数据结构,不可以存入null键,null值,该集合是线程同步的。jdk1.0 效率低

                  |--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。

         |--HashMap:底层是哈希表数据结构,可以存入null键,null值,该集合是线程不同步的。jdk1.2 效率高

         |--TreeMap:底层是二叉树数据结构。线程不同步。按照键值排序

                Set底层就是使用了Map方法

        

3.      Map集合的打印方法

3.1 方法一:获取Key得到Set集合(Key是唯一的)

         将map中所有的键存入到Set集合,Set集合具有迭代器

        可以用迭代方式去除所有的键,再根据get方法,获取每一个键对应的值。

        Map集合的取出原理:将Map集合转成set集合,再通过迭代器取出

     Set<Integer> keyset=map.keySet();
       
        for(Iterator<Integer> it=keyset.iterator();it.hasNext();)
        {
            Integer key=it.next();
            //有了键就可以获取对应的值
            String value=map.get(key);
            sop("key:"+key+",value:"+value);
        }

 

3.2 方法二:获取映射关系集合

Set<Map.Entry<K,V>>entrySet

        将Map集合中的映射关系存入到了set集合中,而这个关系的类型就是Map.Entry<K,V>

        Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口

         内部结构模型        

interface Map<K,V>
{
    public static interface Entry<K,V>
    {
        public  abstract Object getKey();
        public abstract Object getValue();
    }
}
class HashMap<K,V> implements Map<K,V>
{
    class Ha<K,V> implements Map.Entry<K,V>
    {
        public   Object getKey(){ return key;};
        public   Object getValue(){return  value;}
    }
}

 

打印方法

  //entrySet方法:将Map集合中的映射关系取出,存入到Set集合中。
        Set<Map.Entry<Integer, String>> entrySet=map.entrySet();
        for(Iterator<Map.Entry<Integer, String>> it=entrySet.iterator();it.hasNext();)
        {
            Map.Entry<Integer, String>  entry=it.next();
            Integer key=entry.getKey();
            String value=entry.getValue();
            sop("key:"+key+",value:"+value);
        }

 

4.      Map练习

 

/*
    需求
    学生属性:姓名 年龄
    注意:相同姓名和年龄视为同一个学生
    保证学生的唯一性
   
    1、描述学生
        封装属性
            提供get set 方法
        构造函数
        实现比较方法
        复写hashcode equals
    2、定义map容器 将学生作为键  地址作为值存入
    3、获取map集合中的元素
 */
import java.util.*;
public class H_06MapPractice {
    public static void main(String[] args) {
        HashMap<Student,String> hm=new HashMap<Student,String>();
        hm.put(new Student("张三",21), "北京");
        hm.put(new Student("李四",23), "上海");
        hm.put(new Student("钱六",25), "武汉");
        hm.put(new Student("王五",22), "广州");
       
        //第一种取出方式  keyset
        Set<Student> keyset=hm.keySet();       
        for(Iterator<Student> it=keyset.iterator();it.hasNext();)
        {
            Student stu=it.next();
            String add=hm.get(stu);
            System.out.println(stu+"...."+add);//直接打印stu要复写toString方法
        }
       
        //第二种取出方式entrySet
        Set<Map.Entry<Student, String>> entrySet=hm.entrySet();
        for(Iterator<Map.Entry<Student, String>> it=entrySet.iterator();it.hasNext();)
        {
            Map.Entry<Student, String>  entry=it.next();
            Student stu=entry.getKey();
            String add=entry.getValue();
            System.out.println(stu+"........"+add);//直接打印stu要复写toString方法
        }      
    }
}
class Student implements Comparable<Student>//接口是able 自定义比较器是parator
{
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    private String name;
    private int age;
    Student(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    public boolean equals(Object obj) {
        if (!(obj instanceof Student))
            throw new ClassCastException("类型不匹配");
        Student stu = (Student) obj;       
        return this.name.equals(stu.name)&& this.age==stu.age;
    }
    public int compareTo(Student s)
    {
        int num=new Integer(this.age).compareTo(new Integer(s.age));
        if(num==0)
            return this.name.compareTo(s.name);
        return num;
    }
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }  
}

结果:(两种方式)

Student [name=钱六,age=25]....武汉

Student [name=王五,age=22]....广州

Student [name=李四,age=23]....上海

Student [name=张三,age=21]....北京

Student [name=钱六,age=25]........武汉

Student [name=王五,age=22]........广州

Student [name=李四,age=23]........上海

Student [name=张三,age=21]........北京

扩展:Map的嵌套

import java.util.*;
import java.util.Map.Entry;
public class H_09MapExtra {
    public static void main(String[] args) {
        HashMap<String,HashMap<String,String>> czbk=new HashMap<String,HashMap<String,String>>();
        HashMap<String,String> yure=new HashMap<String,String>();
        yure.put("01", "haha");
        yure.put("02", "lisi");
       
        HashMap<String,String> jiuye=new HashMap<String,String>();
        jiuye.put("01", "hehe");
        jiuye.put("02", "lis22");
       
        czbk.put("预热班", yure);
        czbk.put("就业班",jiuye);
       
        Set<Map.Entry<String, HashMap<String, String>>> entrySet=czbk.entrySet();
        Iterator<Map.Entry<String, HashMap<String, String>>> it=entrySet.iterator();
        while(it.hasNext())
        {
            Map.Entry<String, HashMap<String, String>> me=it.next();
            String banji=me.getKey();
            System.out.println(banji);
            HashMap<String, String> hm=me.getValue();
           
            Iterator<Map.Entry<String, String>> it2=hm.entrySet().iterator();
            while(it2.hasNext())
            {
                Map.Entry<String, String>  me2=it2.next();
                String id=me2.getKey();
                String name=me2.getValue();
                System.out.println(id+"----"+name);            
            }          
        }      
    }
}
 

结果

就业班

01----hehe

02----lis22

预热班

01----haha

02----lisi

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值