zoukankan      html  css  js  c++  java
  • day14

    一、Map集合

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

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

    *Map中不能包含重复的键,值可以重复,每个键对应一个值。

    1.1Map常用子类

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

    **LinkedHashSet<K,V>**HashSet下的子类,存储数据采用哈希表+链表结构。通过链表结构可以保证元素的存取一致性。

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

    Map接口中定义了很多方法,常用的如下:
    
    * `public V put(K key, V value)`:  把指定的键与指定的值添加到Map集合中。
    * `public V remove(Object key)`: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
    * `public V get(Object key)` 根据指定的键,在Map集合中获取对应的值。
    * `boolean containsKey(Object key)  ` 判断集合中是否包含指定的键。
    * `public Set<K> keySet()`: 获取Map集合中所有的键,存储到Set集合中。
    * `public Set<Map.Entry<K,V>> entrySet()`: 获取到Map集合中所有的键值对对象的集合(Set集合)。

    tips:

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

    >

    > 若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。 

    遍历集合方法

    步骤:

    1. 获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示:`keyset()`

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

    3. 根据键,获取键所对应的值。方法提示:`get(K key)`

     Set<String> keys = map.keySet();
            // 遍历键集 得到 每一个键
            for (String key : keys) {
                  //key  就是键
                //获取对应值
                String value = map.get(key);
                System.out.println(key+"的CP是:"+value);
            }  

    Entry键值对对象遍历

    我们已经知道,`Map`中存放的是两种对象,一种称为**key**(),一种称为**value**(),它们在在`Map`中是一一对应关系,这一对对象又称做`Map`中的一个`Entry()``Entry`将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历`Map`集合时,就可以从每一个键值对(`Entry`)对象中获取对应的键与对应的值。

     既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:

    * `public K getKey()`:获取Entry对象中的键。

    * `public V getValue()`:获取Entry对象中的值。

    Map集合中也提供了获取所有Entry对象的方法:

    * `public Set<Map.Entry<K,V>> entrySet()`: 获取到Map集合中所有的键值对对象的集合(Set集合)

    Map集合遍历键值对方式

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

    操作步骤:

    1.  获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示:`entrySet()`

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

    3.  通过键值对(Entry)对象,获取Entry对象中的键与值。  方法提示:`getkey() getValue()` 

    // 获取 所有的 entry对象  entrySet
            Set<Entry<String,String>> entrySet = map.entrySet();
    
            // 遍历得到每一个entry对象
            for (Entry<String, String> entry : entrySet) {
                   // 解析 
                String key = entry.getKey();
                String value = entry.getValue();  
                System.out.println(key+"的CP是:"+value);
            }

    》tips:Map集合不能使用迭代器或者foreach进行遍历。但是转成Set之后局可以使用了。

    》tips:

    * 当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCodeequals方法(如果忘记,请回顾HashSet存放自定义对象)

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

    LinkedHashMap方法基本一致,但其中元素有序。

    JDK9后添加了几种集合工厂方法,更方便创建少量元素的集合

    Set<String> str1=Set.of("a","b","c");  
            //str1.add("c");这里编译的时候不会错,但是执行的时候会报错,因为是不可变的集合  
            System.out.println(str1);  
            Map<String,Integer> str2=Map.of("a",1,"b",2);  
            System.out.println(str2);  
            List<String> str3=List.of("a","b");  
            System.out.println(str3);  

    需要注意以下两点:

    > 1:of()方法只是MapListSet这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如    HashSetArrayList等待;

    >

    > 2:返回的集合是不可变的;

  • 相关阅读:
    121.买卖股票 求最大收益1 Best Time to Buy and Sell Stock
    409.求最长回文串的长度 LongestPalindrome
    202.快乐数 Happy Number
    459.(KMP)求字符串是否由模式重复构成 Repeated Substring Pattern
    326.是否为3的平方根 IsPowerOfThree
    231.是否为2的平方根 IsPowerOfTwo
    461.求两个数字转成二进制后的“汉明距离” Hamming Distance
    206.反转单链表 Reverse Linked List
    448. 数组中缺少的元素 Find All Numbers Disappeared in an Array
    常见表单元素处理
  • 原文地址:https://www.cnblogs.com/hsRick/p/11347981.html
Copyright © 2011-2022 走看看