java基础之Map集合
# Map集合
## Map的存储特点
1. 以键值对的形式存放
 2. 键(key-K): 无序、无下标、元素不可重复
 3. 值(value-V):无序、无下标、元素可以重复
## 常用实现类
1. HashMap
    - JDK1.2    底层哈希表实现    线程不安全,效率高
 2. LinkedHashMap
    - JDK1.2    是HashMap的子类,底层哈希表实现    线程不安全,效率高
 3. TreeMap
    - JDK1.2    是SortedMap的实现类,底层红黑树实现    线程不安全,效率高
 4. Hashtable
    - JDK1.0    底层哈希表实现    线程安全,效率低
 5. Properties
    - JDK1.0    是Hashtable的子类,底层哈希表实现    线程安全,效率低
## 创建
建议使用多态
~~~java
 Map<键的泛型,值的泛型> 集合名=new 实现类名<>();
 ~~~
## 常用方法
1. V  put(K,V):往集合中添加一个键值对
    - 如果键已经存在,则进行值的覆盖
 2. int  size():获取集合元素个数
 3. boolean  containsKey(K):判断是否包含指定键
 4. boolean  containsValue(V):判断是否包含指定值
 5. V  get(K):根据键获取值
 6. V  remove(K):  根据键删除整个键值对
## 遍历
1. 键遍历:获取所有的键,遍历键,根据键获取值
- Set<K的泛型> keySet():获取所有的键存入Set集合返回
  
  
 Map<String, String> map = new HashMap<>();
           map.put("username", "zhangsan");
           map.put("tel", "13333333333");
           map.put("pwd", "123456");
           map.put("pwd", "789456");
           System.out.println("键遍历:");
           //先获取所有的键
           Set<String> set1 = map.keySet();
           //遍历Set
           Iterator<String> it = set1.iterator();
           while (it.hasNext()) {
               //接收遍历的键
               String key = it.next();
               System.out.println(key+"-"+map.get(key));
           } 
    
2. 值遍历:获取所有的值,遍历值
- Collection<V的泛型> values():获取所有的值存入Collection集合返回
 ~~~java
   //获取所有的值
           Collection<String> coll = map.values();
           //遍历所有的值
           for (String s : coll) {
               System.out.println(s);
           }
   ~~~ 
3. 键值对遍历: 获取所有的键值对对象, 遍历键值对
   - Set<Entry对象>  entrySet():  将集合键值对存入Entry对象,将所有Entry对象放入Set集合返回
    - Entry对象的表现形式:  `Map.Entry<K,V>`
    - 获取键: `Entry对象.getKey()`
    - 获取值:`Entry对象.getValue()`
 ~~~java
   //获取所有的Entry对象
           Set<Map.Entry<String, String>> set2 = map.entrySet();
           //遍历所有entry对象
           set2.forEach(entry->{
               System.out.println(entry.getKey()+"-"+entry.getValue());
           });
   ~~~ 
4. 自遍历forEach:
- forEach(BiConsumer接口实现类对象)
 ~~~java
   map.forEach(new BiConsumer<String, String>() {
               @Override
               public void accept(String key, String value) {
                   System.out.println(key+"-"+value);
               }
           });
           System.out.println("自遍历:(lambda)");
           map.forEach((k,v)-> System.out.println(k+"-"+v));
   ~~~ 
## 使用
1. 当哈希表的键为自定义类型时,必须重写类的hashCode和equals才能实现去重
 2. HashMap允许null值和null键
    - 最多存在一个null键,可以存在多个null值
 3. LinkedHashMap在HashMap的基础上可以保证元素存入和取出的顺序一致
 4. TreeMap可以根据键对元素进行默认的升序排序
    - 如果键为自定义类型,则必须书写排序规则,方式与TreeSet一致
    - 无法对null值进行排序(键不可为null)
 5. Hashtable不允许null值和null键
 6. Properties只能存放String类型
    - 不推荐使用多态
    - 不可添加泛型
    - 推荐优先使用独有内容
      - String V  getProperty(String K):  根据键获取值
      - setProperty(String k,String v):添加键值对
      - load(输入流):  根据流将配置文件内容读取到集合中
## 掌握
1. map的存储特点
 2. Map的常用实现类和特点
 3. Map的创建语法
 4. Map的遍历方式
 5. Map的使用