------- android培训java培训、期待与您交流!
----------

Map集合:

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

和Set很像,其实Set底层就是使用了Map集合。

Map与Collection:

   Map与Collection在集合框架中属并列存在

   Map存储的是键值对

   Map存储元素使用put方法,Collection使用add方法

   Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素

   Map集合中键要保证唯一性

Map集合常用类

Hashtable:线程安全,速度慢,底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。已被HashMap替代。

   HashMap:底层是哈希表数据结构,线程不安全,速度快,允许存放null键,null值,jdk1.2.效率高。

   TreeMap:对键进行排序,排序原理与TreeSet相同。底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

常用方法:

    1.添加。

        put(K key, V value)  将指定的值与此映射中的指定键关联

        putAll(Map<? extends K,? extends V> m)  从指定映射中将所有映射关系复制到此映射中

如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。

import java.util.HashMap;
import java.util.Map; /**
*
* Map集合添加的简单演示
*
*/
public class MapDemo
{
public static void main(String[] args)
{
Map<String,Integer> m = new HashMap<String,Integer>(); m.put("zhangsan", 19);
m.put("lisi", 49);//如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。
m.put("wangwu", 19);
m.put("lisi",20);//put方法会返回被覆盖的值。
m.put("hanmeimei", null); System.out.println(m);
}
}

    2.删除。

        clear()  从此映射中移除所有映射关系

remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除

import java.util.HashMap;
import java.util.Map; /**
*
* Map集合删除的简单演示
*
*/
public class MapDemo
{
public static void main(String[] args)
{
Map<String,Integer> m = new HashMap<String,Integer>(); m.put("zhangsan", 19);
m.put("lisi", 49);//如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。
m.put("wangwu", 19);
m.put("lisi",20);//put方法会返回被覆盖的值。
m.put("hanmeimei", null);
System.out.println(m); System.out.println(m.remove("wangwu")); m.clear();
System.out.println(m);
}
}

   3.判断。

        containsValue(Object value)  如果此映射将一个或多个键映射到指定值,则返回 true

containsKey(Object key)   如果此映射包含指定键的映射关系,则返回 true

isEmpty()  如果此映射未包含键-值映射关系,则返回 true

import java.util.HashMap;
import java.util.Map; /**
*
* Map集合判断的简单演示
*
*/
public class MapDemo
{
public static void main(String[] args)
{
Map<String,Integer> m = new HashMap<String,Integer>(); m.put("zhangsan", 19);
m.put("lisi", 49);//如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。
m.put("wangwu", 19);
m.put("lisi",20);//put方法会返回被覆盖的值。
m.put("hanmeimei", null);
System.out.println(m); System.out.println(m.containsKey("lisi"));
System.out.println(m.containsValue(20));
System.out.println(m.isEmpty());
}
}

4.获取。

        get(Object key)  返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null

        size()  返回此映射中的键-值映射关系数。

        values()  返回此映射中包含的值的 collection 视图

 

        entrySet()  返回此映射中包含的映射关系的 set 视图。

        keySet()  返回此映射中包含的映射关系的 key 视图。

import java.util.HashMap;
import java.util.Map; /**
*
* Map集合获取的简单演示
*
*/
public class MapDemo
{
public static void main(String[] args)
{
Map<String,Integer> m = new HashMap<String,Integer>(); m.put("zhangsan", 19);
m.put("lisi", 49);//如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。
m.put("wangwu", 19);
m.put("lisi",20);//put方法会返回被覆盖的值。
m.put("hanmeimei", null);
System.out.println(m); //通过get方法返回null的情况可以当作第二种判断方式
System.out.println(m.get("lisi"));
System.out.println(m.size());//4
System.out.println(m.values()); //[19, 20, 19, null]
System.out.println(m.entrySet());//[wangwu=19, lisi=20, zhangsan=19, hanmeimei=null]
System.out.println(m.keySet());//[wangwu, lisi, zhangsan, hanmeimei]
}
}

map集合的两种取出方式:


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


     Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。

2 . Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry

     Entry其实就是Map中的一个static内部接口。

     定义在内部因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。而且该事物在直接访问Map集合中的元素。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; /**
*
* Map集合判断的简单演示
*
*/
public class MapDemo
{
public static void main(String[] args)
{
Map<String,Integer> m = new HashMap<String,Integer>(); m.put("zhangsan", 19);
m.put("wangwu", 19);
m.put("lisi",20); System.out.println(m); //方法1,将Map集合中的映射关系取出,
Set<Map.Entry<String,Integer>> entrySet = m.entrySet();
for (Iterator<Map.Entry<String,Integer>> it = entrySet.iterator();it.hasNext(); )
{
Map.Entry<String, Integer> me = it.next();
String Key = me.getKey();
Integer Value = me.getValue();
System.out.println(Key+"------"+Value);
} //方法2.先获取键的集合
Set<String> keySet = m.keySet();
for (Iterator<String> it = keySet.iterator();it.hasNext(); )
{
String key = it.next();
int value = m.get(key); System.out.println(key+"---"+value);
}
}
}
/*
每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。 1,描述学生。
2,定义map容器。将学生作为键,地址作为值。存入。
3,获取map集合中的元素。
*/ import java.util.*;
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = 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 int hashCode()
{
return name.hashCode()+age*34;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配"); Student s = (Student)obj; return this.name.equals(s.name) && this.age==s.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name+":"+age;
}
}
class MapTest
{
public static void main(String[] args)
{
HashMap<Student,String> hm = new HashMap<Student,String>(); hm.put(new Student("lisi1",21),"beijing");
hm.put(new Student("lisi1",21),"tianjin");
hm.put(new Student("lisi2",22),"shanghai");
hm.put(new Student("lisi3",23),"nanjing");
hm.put(new Student("lisi4",24),"wuhan");
//第一种取出方式 keySet
Set<Student> keySet = hm.keySet();
Iterator<Student> it = keySet.iterator();
while(it.hasNext())
{
Student stu = it.next();
String addr = hm.get(stu);
System.out.println(stu+".."+addr);
}
//第二种取出方式 entrySet
Set<Map.Entry<Student,String>> entrySet = hm.entrySet();
Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();
while(iter.hasNext())
{
Map.Entry<Student,String> me = iter.next();
Student stu = me.getKey();
String addr = me.getValue();
System.out.println(stu+"........."+addr);
}
}
}
/*
需求:对学生对象的年龄进行升序排序。
因为数据是以键值对形式存在的。所以要使用可以排序的Map集合。TreeMap。
*/
import java.util.*; class StuNameComparator implements Comparator<Student>
{
public int compare(Student s1,Student s2)
{
int num = s1.getName().compareTo(s2.getName());
if(num==0)
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())); return num;
}
} class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = 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 int hashCode()
{
return name.hashCode()+age*34;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配"); Student s = (Student)obj; return this.name.equals(s.name) && this.age==s.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name+":"+age;
}
}
class MapTest2
{
public static void main(String[] args)
{
TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuNameComparator()); tm.put(new Student("blisi3",23),"nanjing");
tm.put(new Student("lisi1",21),"beijing");
tm.put(new Student("alisi4",24),"wuhan");
tm.put(new Student("lisi1",21),"tianjin");
tm.put(new Student("lisi2",22),"shanghai"); Set<Map.Entry<Student,String>> entrySet = tm.entrySet(); Iterator<Map.Entry<Student,String>> it = entrySet.iterator(); while(it.hasNext())
{
Map.Entry<Student,String> me = it.next(); Student stu = me.getKey();
String addr = me.getValue();
System.out.println(stu+":::"+addr);
}
}
}
/*
练习:
"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。 希望打印结果:a(1)c(2)..... 通过结果发现,每一个字母都有对应的次数。说明字母和次数之间都有映射关系。
注意了,当发现有映射关系时,可以选择map集合。因为map集合中存放就是映射关系。 当数据之间存在这映射关系时,就要先想map集合。 思路:
1,将字符串转换成字符数组。因为要对每一个字母进行操作。
2,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。
3,遍历字符数组。
将每一个字母作为键去查map集合。
如果返回null,将该字母和1存入到map集合中。
如果返回不是null,说明该字母在map集合已经存在并有对应次数。
那么就获取该次数并进行自增。,然后将该字母和自增后的次数存入到map集合中。覆盖调用原理键所对应的值。
4,将map集合中的数据变成指定的字符串形式返回。
*/
import java.util.*;
class MapTest3
{
public static void main(String[] args)
{
String s= charCount("ak+abAf1c,dCkaAbc-defa");
System.out.println(s);
}
public static String charCount(String str)
{
char[] chs = str.toCharArray();
TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
int count = 0;
for(int x=0; x<chs.length; x++)
{
if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
continue;
Integer value = tm.get(chs[x]);
if(value!=null)
count = value;
count++;
tm.put(chs[x],count);//直接往集合中存储字符和数字,为什么可以,因为自动装箱。
count = 0;
}
StringBuilder sb = new StringBuilder();
Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<Character,Integer> me = it.next();
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();
}
}

map扩展知识:

map集合被使用是因为具备映射关系。

/*
"yureban" Student("01" "zhangsan");
"yureban" Student("02" "lisi");
"jiuyeban" "01" "wangwu";
"jiuyeban" "02" "zhaoliu"; 一个学校有多个教室。每一个教室都有名称。
*/
import java.util.*; class Student
{
private String id;
private String name;
Student(String id,String name)
{
this.id = id;
this.name = name;
}
public String toString()
{
return id+":::"+name;
}
}
class MapDemo3
{ public static void demo()
{
HashMap<String,List<Student>> czbk = new HashMap<String,List<Student>>(); List<Student> reyu = new ArrayList<Student>();
List<Student> jiuye = new ArrayList<Student>(); czbk.put("yureban",reyu);
czbk.put("jiuyeban",jiuye); reyu.add(new Student("01","zhagnsa"));
reyu.add(new Student("04","wangwu"));
jiuye.add(new Student("01","zhouqi"));
jiuye.add(new Student("02","zhaoli")); Iterator<String> it = czbk.keySet().iterator(); while(it.hasNext())
{
String roomName = it.next();
List<Student> room = czbk.get(roomName); System.out.println(roomName);
getInfos(room);
}
}
public static void getInfos(List<Student> list)
{
Iterator<Student> it = list.iterator();
while(it.hasNext())
{
Student s = it.next();
System.out.println(s);
}
}
public static void main(String[] args)
{
demo(); }
public static void getStudentInfo(HashMap<String,String> roomMap)
{
Iterator<String> it = roomMap.keySet().iterator(); while(it.hasNext())
{
String id = it.next();
String name = roomMap.get(id);
System.out.println(id+":"+name);
}
}
}

------- android培训java培训、期待与您交流!
----------

黑马程序员——JAVA基础之Map集合的更多相关文章

  1. 黑马程序员——JAVA基础之List集合

    ------- android培训.java培训.期待与您交流! ---------- Collection : |--List:元素是有序的,元素可以重复.因为该集合体系有索引.         | ...

  2. 黑马程序员——JAVA基础之set集合

    ------- android培训.java培训.期待与您交流! ---------- Set:       元素是无序(存入和取出的顺序不一定一致),元素不可以重复.    Set接口中常用的类: ...

  3. 黑马程序员——JAVA基础之简述集合collection

    ------- android培训.java培训.期待与您交流! ---------- 集合: 为什么出现集合类? •  面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对 ...

  4. 黑马程序员——JAVA基础之Vector集合

    ------- android培训.java培训.期待与您交流! ---------- 基本已被淘汰 枚举就是Vector特有的取出方式.枚举和迭代器很像.其实枚举和迭代是一样的.   因为枚举的名称 ...

  5. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  6. 黑马程序员——JAVA基础之File类,递归,打印流,合并切割流

    ------- android培训.java培训.期待与您交流! ---------- File类 用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递 ...

  7. 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)

    正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G  QQ 1481135711 这是我总 ...

  8. 黑马程序员_java基础笔记(06)...集合

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— JavaApi(其实就是java给我们提供的已经定义好的对象.工具对象:集合框架) ...

  9. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

随机推荐

  1. 使用icon替换你的网页图标(转)

    第一次使用 Font Awesome 发现相当的爽呀!它的图标很全,能够帮你节约时间去找图片.下面就来一起学习吧: 1: 去官方网站下载解压 http://fontawesome.io/ 2: 解压后 ...

  2. struts2的返回类型

    return 一个字符串,如果是success 直接 服务器端跳转 返回到和方法名对应的页面去 不过如果返回的页面和方法没有太大关系,比如删除修改添加之后要 客户端跳转 返回所有用户列表,这个时候可以 ...

  3. 关于java的static语句块

    声明:转载请注明出处 static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次 ...

  4. 2016-1-6第一个完整APP 私人通讯录的实现 2:增加提示用户的提示框,监听文本框

    一:在登录时弹出提示用户的提示框: 1.使用第三方框架. 2.在登陆按钮点击事件中增加如下代码: - (IBAction)loginBtnClicked { NSString *acount = se ...

  5. 9、SQL基础整理(两表连接exists,join on,union)

    exists的用法 select *from haha where exists (select *from bumen where bumen.code = haha.bumen and bumen ...

  6. Magento路径函数getBaseUrl使用方法

    当我们在设计开发Magento主题模板时候,有个函数一定要知道,那就是getBaseUrl函数,用getBaseUrl函数我们可以在.phtml里调用JS.image.File.   1,getBas ...

  7. Eclipse中设置JDK内存方式

    (1) 打开Eclipse,双击Serveers进入到servers编辑画面 (2) 点击 Open launch configuration 选项 (3) 选项中找到Arguments 的选项卡(t ...

  8. Hashing filters for very fast massive filtering

    If you have a need for thousands of rules, for example if you have a lot of clients or computers, al ...

  9. USB Packet Types

    USB has four different packet types. Token packets indicate the type of transaction to follow, data ...

  10. 【转】7 Tips to Speed Up Eclipse

    技巧一:运行最新版本的JDK和Eclipse 通常,新版本的JDK和Eclipse都会有性能上的优化.请确保你使用的是64位Eclipse并且使用了Oracle的JDK.对于网络开发,需要使用Ecli ...