黑马程序员java笔记之一-----Map集合

简介: Map集合:该集合存储键值对。一对一对往里存,而且要保证键的唯一性             1.  添加:                put(k key,v value)                putAll(Map

Map集合:该集合存储键值对。一对一对往里存,而且要保证键的唯一性

            1.  添加:
                put(k key,v value)
                putAll(Map<? extends k,?extends v>m)  从指定映射中将所有映射关系复制到此映射中(可选操作)。

            2.  删除
                 clear()
                 remove(Object key)
            3. 判断
                 containsValue(Object value)
                 containKey(Object key)
                 isEmpty()
            4.获取
                 get(Object key)
                 size()
                 value()  从指定映射中将所有映射关系复制到此映射中(可选操作)。

                Map
                 |---Hashtable
                                 此类实现一个哈希表,该哈希表将映射到相应的值。不可以存入null值和null键。jdk1.0,效率高
                                 为了成功地在哈希表中存储和获取对象,用作键的对象必须实现hashCode方法和equals方法.

                                   从Java 2 平台 v1.2起,此类就被改进以实现Map 接口,使它成为 Java Collections Framework

                                 中的一个成员。不像新的 collection 实现,Hashtable 是同步的,底层是哈希表数据结构。

                  |---HashMap 底层表示哈希表数据结构,允许使用null值和null值,该集合是不同步的。
                  |---TreeMap :底层是二叉树结构。线程不同步。可以用于给map集合中的键进行排序。
                               和set比较:Set底层就是使用了Map集合。

[java]  view plaincopy
  1. <span style="font-size:18px;">import java.io.ObjectOutputStream.PutField;  
  2. import java.util.Collection;  
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. public class MapTest {  
  7.     public static void main(String[] args){  
  8.         Map<String, String> map=new HashMap<String, String>();  
  9.         //添加元素,如果出现相同的键,那么后添加的值会覆盖原有键对应值,并put方法会返回被覆盖的值。  
  10.         System.out.println("map:"+map.put("01""zhang"));  
  11.         System.out.println("map:"+map.put("01""wsufn"));  
  12.         map.put("02""li");  
  13.         map.put("03""sun");  
  14.         map.put(null"hehe");  
  15.         map.put(nullnull);//  
  16.         map.put(null,"woish");  
  17.         map.put("04"null);  
  18.         map.put("05"null);//只允许存在一个null键,可以存在一个或多个null值  
  19.         System.out.println(map.containsKey("01"));  
  20.         System.out.println("get:"+map.get("03"));  
  21.         //可以通过get方法的返回值来判断一个键是否存在  
  22.         System.out.println(map);  
  23.         Collection<String> coll=map.values();  
  24.         // Collection<V> values() 返回此映射所包含的值的 Collection 视图。  
  25.         System.out.println(coll);  
  26.     }  
  27.   
  28. }</span>  

map集合的两种取出方式:
       一、Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
         所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
     

[java]  view plaincopy
  1. <span style="font-size:18px;">  Map集合的取出原理:将map集合转成set集合。再通过迭代器取出。  
  2.        public class MapTest {  
  3.            public static void main(String[] args){  
  4.                Map<String, String> map=new HashMap<String, String>();  
  5.                map.put("02""li");  
  6.                map.put("03""sun");  
  7.               Set<String> keyset= map.keySet();  
  8.                // Collection<V> values() 返回此映射所包含的值的 Collection 视图。  
  9.              //有了Set集合,就可以获取迭代器  
  10.               Iterator<String> it=keyset.iterator();  
  11.              while (it.hasNext()) {  
  12.               String str =(String)it.next();  
  13.                String value=map.get(str);//得到key对应的值  
  14.               System.out.println("key:"+str);//得到值,而没有得到键  
  15.               }  
  16.   }  
  17. }</span>  


二、Set<Map.Entry<k,v>> entrySet: 将map集合中的映射关系取出,存入到集合中

[java]  view plaincopy
  1.      public class MapTest {  
  2.         public static void main(String[] args){  
  3.         Map<String, String> map=new HashMap<String, String>();  
  4.         map.put("02""li");  
  5.         map.put("03""sun");  
  6.         Set<Map.Entry<String, String>> entry=map.entrySet();  
  7.         Iterator<Map.Entry<String,String>> it=entry.iterator();  
  8.         while (it.hasNext()) {  
  9.         Map.Entry<String, String>  me=it.next();  
  10.         String key= me.getKey();  
  11.         String value=me.getValue();  
  12.         System.out.println("key:"+key+",value:"+value);  
  13.            }  
  14.     }  
  15. }  

注明:Map.Entry()其实Entry也是一个接口,它是Map接口中的一个内部接口。
练习:
 因为数据是以键值对形式存在的。
 所以要使用可以排序的Map集合。TreeMap。

[java]  view plaincopy
  1. <span style="font-size:18px;">import java.util.*;  
  2.   
  3. class A implements Comparator<Student>  
  4. {  
  5.     public int compare(Student s1,Student s2)  
  6.     {  
  7.         int num = s1.getName().compareTo(s2.getName());  
  8.         if(num==0)  
  9.             return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));  
  10.             return num;  
  11.     }  
  12. }  
  13. class  MapTest  
  14. {  
  15.     public static void main(String[] args)  
  16.     {  
  17.         TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuNameComparator());  
  18.          map.put("02""li");  
  19.          map.put("03""sun");  
  20. //   第一种方法:keySet  
  21.              Set<Student> keySet=tm.keySet();  
  22.              Iterator<String > it=keyset.iterator();  
  23.         while(it.hasNext()){  
  24.         Student stu=it.next();  
  25.         String addr=tm.get(stu);  
  26.         System.out.println(stu+".."+addr);  
  27.             }  
  28.   
  29. //   第二种方法: entrySet:  
  30.           
  31.         Set<Map.Entry<Student,String>> entrySet = tm.entrySet();  
  32.   
  33.         Iterator<Map.Entry<Student,String>> it = entrySet.iterator();  
  34.   
  35.         while(it.hasNext())  
  36.         {  
  37.             Map.Entry<Student,String> me = it.next();  
  38.   
  39.             Student stu = me.getKey();  
  40.             String addr = me.getValue();  
  41.             System.out.println(stu+":::"+addr);  
  42.         }  
  43.     }  
  44. }</span>  

练习:
"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。
希望打印结果:a(1)c(2).....
通过结果发现,每一个字母都有对应的次数。说明字母和次数之间都有映射关系。

注意,当发现有映射关系时,可以选择map集合。因为map集合中存放就是映射关系。
什么使用map集合呢?
当数据之间存在这映射关系时,就要先想map集合。

思路:
1,将字符串转换成字符数组。因为要对每一个字母进行操作。
2,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。
3,遍历字符数组。
    将每一个字母作为键去查map集合。
    如果返回null,将该字母和1存入到map集合中。
    如果返回不是null,说明该字母在map集合已经存在并有对应次数。
    那么就获取该次数并进行自增。,然后将该字母和自增后的次数存入到map集合中。覆盖调用原理键所对应的值。
4,将map集合中的数据变成指定的字符串形式返回。

[java]  view plaincopy
  1. <span style="font-size:18px;">class  MapTest  
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         String s= charCount("wefsdfefdc,sedffe-fsd");  
  6.         System.out.println(s);  
  7.     }  
  8.     public static String charCount(String str)  
  9.     {  
  10.         char[] chs = str.toCharArray();  
  11.         TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();  
  12.         int count = 0;  
  13.         for(int x=0; x<chs.length; x++)  
  14.         {  
  15.                      if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))  
  16.               continue;  
  17.                     Integer value = tm.get(chs[x]);  
  18.             if(value!=null)  
  19.             count = value;  
  20.             count++;  
  21.             tm.put(chs[x],count);//直接往集合中存储字符和数字,因为自动装箱。  
  22.   
  23.             count = 0;  
  24.             /* 
  25.             if(value==null) 
  26.             { 
  27.                 tm.put(chs[x],1); 
  28.             } 
  29.             else 
  30.             { 
  31.                 value = value + 1; 
  32.                 tm.put(chs[x],value); 
  33.             } 
  34.             */  
  35.  }  
  36.                 StringBuilder sb = new StringBuilder();  
  37.                 Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();  
  38.         Iterator<Map.Entry<Character,Integer>>  it = entrySet.iterator();  
  39.                 while(it.hasNext())  
  40.         {  
  41.             Map.Entry<Character,Integer> me = it.next();  
  42.             Character ch = me.getKey();  
  43.             Integer value = me.getValue();  
  44.             sb.append(ch+"("+value+")");  
  45.         }  
  46.         return sb.toString();  
  47.     }  
  48. }</span>  
目录
相关文章
|
8天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
23天前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
27天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
27 2
|
1月前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
26天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
1月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
1月前
|
Java 开发者
|
1月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
20天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
10 0
|
1月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
28 0