zoukankan      html  css  js  c++  java
  • java-Map接口

    一.Map接口

    Map接口下的集合与Collection接口下的集合,存储数据形式的不同:

    ①Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。

    ②Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。

    ③Collection中的集合称为单列集合,Map中的集合称为双列集合。

    ④Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

    ⑤Map中常用的集合为HashMap集合、LinkedHashMap集合。

    二.Map接口中常用集合

    HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

    LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

    注意:Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。

    三.Map接口中常用方法

    1.put方法:将指定的键与值对应起来,并添加到集合中

    方法返回值为键所对应的值

    ①使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;

    ②使用put方法时,若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。

    2.get方法:获取指定键(key)所对应的值(value)

    3.remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。

    //Map接口的方法演示
    public class MapDemo {
        public static void main(String[] args) {
            //创建Map对象
            Map<String, String> map = new HashMap<String,String>();
            //给map中添加元素
            map.put("星期一", "Monday");
            map.put("星期日", "Sunday");
            System.out.println(map); // {星期日=Sunday, 星期一=Monday}
    
            //当给Map中添加元素,会返回key对应的原来的value值,若key没有对应的值,返回null
            System.out.println(map.put("星期一", "Mon")); // Monday
            System.out.println(map); // {星期日=Sunday, 星期一=Mon}
    
            //根据指定的key获取对应的value
            String en = map.get("星期日");
            System.out.println(en); // Sunday
            
            //根据key删除元素,会返回key对应的value值
            String value = map.remove("星期日");
            System.out.println(value); // Sunday
            System.out.println(map); // {星期一=Mon}
        }
    }

    四.Map集合遍历键找值方法

    步骤:

    1.获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键

    2.遍历键的Set集合,得到每一个键

    3.根据键,获取键所对应的值

    public class MapDemo {
        public static void main(String[] args) {
            //创建Map对象
            Map<String, String> map = new HashMap<String,String>();
            //给map中添加元素
            map.put("邓超", "孙俪");
            map.put("李晨", "范冰冰");
    map.put("刘德华", "柳岩");
            //获取Map中的所有key
            Set<String> keySet = map.keySet();
            //遍历存放所有key的Set集合
            Iterator<String> it =keySet.iterator();
            while(it.hasNext()){
                //得到每一个key
                String key = it.next();
                //通过key获取对应的value
                String value = map.get(key);
                System.out.println(key+"="+value);
            }
        }
    }

    五.Entry键值对对象

    Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

    Entry是Map接口中提供的一个静态内部嵌套接口。

     

    getKey()方法:获取Entry对象中的键

    getValue()方法:获取Entry对象中的值

    entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。

    六.Map集合遍历键值对方式

    通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

    1.获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。

    2.遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象

    3.通过键值对(Entry)对象,获取Entry对象中的键与值。

    public class MapDemo {
        public static void main(String[] args) {
            //创建Map对象
            Map<String, String> map = new HashMap<String,String>();
            //给map中添加元素
            map.put("邓超", "孙俪");
            map.put("李晨", "范冰冰");
    map.put("刘德华", "柳岩");
            //获取Map中的所有key与value的对应关系
            Set<Map.Entry<String,String>> entrySet = map.entrySet();
            //遍历Set集合
            Iterator<Map.Entry<String,String>> it =entrySet.iterator();
            while(it.hasNext()){
                //得到每一对对应关系
                Map.Entry<String,String> entry = it.next();
                //通过每一对对应关系获取对应的key
                String key = entry.getKey();
                //通过每一对对应关系获取对应的value
                String value = entry.getValue();
                System.out.println(key+"="+value);
            }
        }
    }

    注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。

    七.HashMap存储自定义类型键值

    举例:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。

    //学生类
    public class Student {
        private String name;
        private int age;
    
        //编写构造方法
        //编写get,set方法
        //编写toString方法
    }
    //测试类
    public class HashMapTest {
        public static void main(String[] args) {
            //1,创建hashmap集合对象。
            Map<Student,String> map = new HashMap<Student,String>();
            
            //2,添加元素。
            map.put(new Student("lisi",28), "上海");
            map.put(new Student("wangwu",22), "北京");
            map.put(new Student("zhaoliu",24), "成都");
            map.put(new Student("zhouqi",25), "广州");
            map.put(new Student("wangwu",22), "南京");
            
            //3,取出元素。键找值方式
            Set<Student> keySet = map.keySet();
            for(Student key : keySet){
                String value = map.get(key);
                System.out.println(key.toString()+"....."+value);
            }
            
            //取出元素。键值对方式
            Set<Map.Entry<Student, String>> entrySet = map.entrySet();
            for (Map.Entry<Student, String> entry : entrySet) {
                Student key = entry.getKey();
                String value = entry.getValue();
                System.out.println(key.toString()+"....."+value);
            }
        }
    }

    当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法。

    如果要保证map中存放的key和取出的顺序一致,可以使用LinkedHashMap集合来存放。

    八.静态导入

    在导包的过程中我们可以直接导入静态部分,这样某个类的静态成员就可以直接使用了。

    import static XXX.YYY;   导入后YYY可直接使用。 
    //例如:Map.Entry的访问,简化后为Entry
    import static java.util.Map.Entry;
    public class HashMapTest {
        public static void main(String[] args) {
            //1,创建hashmap集合对象。
            Map<Student,String> map = new HashMap<Student,String>();
    
            //取出元素。键值对方式
            //Set<Map.Entry<Student, String>> entrySet = map.entrySet();
            Set<Entry<Student, String>> entrySet = map.entrySet();
    
            //for (Map.Entry<Student, String> entry : entrySet) {
            for (Entry<Student, String> entry : entrySet) {
                Student key = entry.getKey();
                String value = entry.getValue();
                System.out.println(key.toString()+"....."+value);
            }
        }
    }

    九.可变参数

    在JDK1.5之后,如果定义一个方法需要接受多个参数,并且多个参数类型一致,可以对其简化成如下格式:

    修饰符 返回值类型 方法名(参数类型... 形参名){  }

    这个书写完全等价与

    修饰符 返回值类型 方法名(参数类型[] 形参名){  }

    后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。

    jdk1.5以后。出现了简化操作。... 用在参数上,称之为可变参数。

    public class ParamDemo {
        public static void main(String[] args) {
            int[] arr = {21,89,32};
            int sum = add(arr);
            System.out.println(sum);
            sum = add(21,89,32);//可变参数调用形式
            System.out.println(sum);
            
        }
    
        //JDK1.5之后写法
        public static int add(int...arr){
            int sum = 0;
            for (int i = 0; i < arr.length; i++) {
                sum += arr[i];
            }
            return sum;
        }
    
        //原始写法
        /*
        public static int add(int[] arr) {
            int sum = 0;
            for (int i = 0; i < arr.length; i++) {
                sum += arr[i];
            }
            return sum;
        }
        */
    }

    上述add方法在同一个类中,只能存在一个。因为会发生调用的不确定性

    注意:如果在方法书写时,这个方法拥有多参数,参数中包含可变参数,可变参数一定要写在参数列表的末尾位置。

    十.Collections集合工具类

    public static <T> void sort(List<T> list) // 集合元素排序
    //排序前元素list集合元素 [33,11,77,55]
    Collections.sort( list );
    //排序后元素list集合元素 [11,33,55,77]
    public static void shuffle(List<?> list) //  集合元素存储位置打乱
    //list集合元素 [11,33,55,77]
    Collections.shuffle( list );
    //使用shuffle方法后,集合中的元素为[77,33,11,55],每次执行该方法,集合中存储的元素位置都会随机打乱

    十一.集合嵌套

    集合内容又是集合,如Collection集合嵌套、Collection集合与Map集合相互嵌套、Map集合嵌套

    ArrayList嵌套 ArrayList

    ArrayList< ArrayList<String> >
    Collection< ArrayList<Integer> >

    Map嵌套 ArrayList

    HashMap<String, ArrayList<Person>>
    ArrayList< HashMap<String, String>>

    Map集合嵌套

    HashMap<String, HashMap<String,String>>
    HashMap<String, HashMap<Person,String>>

    十二.集合继承体系的面向对象思想

     

    1.接口:用来明确所有集合中该具有的功能,相当于在定义集合功能标准;

    2.抽象类:把多个集合中功能实现方式相同的方法,抽取到抽象类实现,具体集合不再遍写,继承使用即可;

    3.具体类:继承抽象类,实现接口,重写所有抽象方法,达到具备指定功能的集合。每个具体集合类,根据自身的数据存储结构方式,对接口中的功能方法,进行不同方式的实现。

  • 相关阅读:
    在IE和Firfox获取keycode
    using global variable in android extends application
    using Broadcast Receivers to listen outgoing call in android note
    help me!virtual keyboard issue
    using iscroll.js and iscroll jquery plugin in android webview to scroll div and ajax load data.
    javascript:jquery.history.js使用方法
    【CSS核心概念】弹性盒子布局
    【Canvas学习笔记】基础篇(二)
    【JS核心概念】数据类型以及判断方法
    【问题记录】ElementUI上传组件使用beforeupload钩子校验失败时的问题处理
  • 原文地址:https://www.cnblogs.com/akiyama/p/10249873.html
Copyright © 2011-2022 走看看