Map:一次添加一对元素。Collection一次添加一个元素。
Map也称为双列集合,Collection集合称为单列集合。其实map集合中存储的就是键值对。map集合中必须保证键的唯一性。
常用的方法:
1,添加。
value put(key,value):返回前一个和可以关联的值,如果没有返回null。
2,删除。
void clear():清空map集合。
value remove(key):根据指定的key删出这个键值对。
3,判断。
boolean containsKey(key)
boolean containsValue(value)
boolean isEmpty()
4,获取。
value get(key):通过键获取值,如果没有该键返回null。
当然可以通过返回bull,来判断是否包含指定键。
int size():获取键值对的个数。
public class MapDemo {
public static void main(String[] args) {
Map map=new HashMap();
method_2(map);
method(map);
}
private static void method(Map map) {//学好和姓名
//添加元素
System.out.println(map.put(8, "wangcai"));//输出为null
System.out.println(map.put(8, "xiaoqiang"));//存相同键,值会覆盖//输出为wangcai
map.put(2, "value");
map.put(7, "vhhd");
//删除
System.out.println("remove:"+map.remove(2));
//判断
System.out.println("containskey:"+map.containsKey(7));
//获取
System.out.println("get:"+map.get(6));
System.out.println(map);
}
private static void method_2(Map map) {
map.put(8,"zhaoliu");
map.put(2,"zhaoliu");
map.put(7, "xiaoqiang");
map.put(6,"wangcai");
Collection values=map.values();
Iterator it2=values.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
/*
通过Map转成set就可以迭代。
找到另一种方法。enteySet。。
该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的集合就是Map.Entry类型(内部接口、嵌套类)
*/
Set> entrySet=map.entrySet();
Iterator> it=entrySet.iterator();
while(it.hasNext()){
Map.Entry me=it.next();
Integer key=me.getKey();
String value=me.getValue();
System.out.println(key+": :"+value);
}
}
}
/*
Map.Entry原理:
interface MyMap{
public static interface MyEntry{//内部接口
void get();
}
}
class MyDemo implements MyMap.MyEntry{
public void get(){//重写get方法
}
}
类似于:
class Outer{
static class Inner{
static void show(){}
}
}
然后在main里被直接调用:
Outer.Inner.show();
*/
运行:
Map常用的子类:
|--Hashtable:内部结构是哈希表,是同步的。不允许null作为键,null作为值。
|--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|--HashMap:内部结构是哈希表,不是同步的。允许null作为键和值。
|--TreeMap:内部结构地二叉树,不是同步的。可以对Map集合中的键进行排序。
HashMapDemo:
public static void main(String[] args) {
/*
将学生对象和学生归属地通过键与值存到map集合中
*/
HashMap hm=new HashMap();
hm.put(new Student("lisi",38), "北京");
hm.put(new Student("zhaoliu",24), "上海");
hm.put(new Student("xiaoqiang",31), "沈阳");
hm.put(new Student("wqangcai", 28),"大连");
hm.put(new Student("zhaoliu",24), "铁岭");//在person中重写覆盖了hashcode和equals去重
/*Set keySet=hm.keySet();
Iterator it=keySet.iterator();可直接合并*/
Iterator it=hm.keySet().iterator();
while(it.hasNext()){
Student key=it.next();
String value=hm.get(key);
System.out.println(key.getName()+": "+key.getAge()+"--"+value);
}
}
运行:
TreeMapDemo:
public static void main(String[] args) {
TreeMap tm=new TreeMap(new ComparatorByName());
tm.put(new Student("lisi",38), "北京");
tm.put(new Student("zhaoliu",24), "上海");
tm.put(new Student("xiaoqiang",31), "沈阳");
tm.put(new Student("wqangcai", 28),"大连");
tm.put(new Student("zhaoliu",24), "铁岭");
Iterator> it = tm.entrySet().iterator();
while(it.hasNext()){
Map.Entry me = it.next();
Student key = me.getKey();
String value = me.getValue();
System.out.println(key.getName()+":"+key.getAge()+"---"+value);
}
}
运行:
LinkesHashMap:
public static void main(String[] args) {
HashMap hm=new LinkedHashMap();
hm.put(7, "zhouqi");
hm.put(3, "zhangsam");
hm.put(1, "qianyi");
hm.put(5, "wangwu");
Iterator> it=hm.entrySet().iterator();
while(it.hasNext()){
Map.Entry me=it.next();
Integer key=me.getKey();
String value=me.getValue();
System.out.println(key+": "+value);
}
}
运行:
练习:
“fdgavcbsacdfs“获取该字符串中,每一个字母出现的次数。
要求打印结果是:a(2)b(1)...;
思路:
对于结果的分析发现,字母和次数之间存在着映射关系。而且这种关系很多。
很多就需要存储,能存储映射关系的容器有数组和Map集合。
关系一:方式有序编号吗?没!
那就是使用Map集合。又发现可以保证唯一性的一方具备着a b c...
所以可以使用TreeMap集合。
这个集合最终应该存储的是字母和次数的对应关系。
1,因为操作的是字符串的字母,所以先将字符串变成字符数组。
2,遍历字符数组,用每一个字母作为键去查Map集合这个表,看看集合中是否有这个元素。
如果该字母键不存在,就将该字母作为键 1作为值存储到map集合中。
如果该字母键存在,就将该字母键对应值取出并+1,再将该字母和+1后的值存储到map集合中,
键相同值会覆盖。这样就记录住了该字母的次数。
3,遍历结束,map集合就记录所有字母出现次数。
public class MapTest {
public static void main(String[] args) {
String str="fdgav +cbsacdfs";
String s=getCharCount(str);
System.out.println(s);
}
private static String getCharCount(String str) {
//将字符串变成字符数组
char[] chs=str.toCharArray();
//定义map集合表
Map map=new TreeMap();
for(int i=0;i='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z'))//只取字母
//if(!(Character.toLowerCase(chs[i])>='a' && Character.toLowerCase(chs[i])<='z'))
continue;*/
//将数组中的字母作为键去查map表
Integer value=map.get(chs[i]);
/*
//判断值是否为null
if(value==null){
map.put(chs[i], 1);
}else{
map.put(chs[i], value+1);
}
*/
int count=1;
if(value!=null){
count=value+1;
}
map.put(chs[i], count);
}
// return map.toString();
return mapToString(map);
}
private static String mapToString(Map map) {
StringBuilder sb=new StringBuilder();
Iterator it=map.keySet().iterator();
while(it.hasNext()){
Character key=it.next();
Integer value=map.get(key);
sb.append(key+"("+value+")");
}
return sb.toString();
}
运行:
Map有映射关系,在查表法中的应用较为多见。,可以有限考虑。
public static void main(String[] args) {
/*
* Map在有映射关系时,可以优先考虑。
*
* 在查表法中的应用较为多见。
*/
String week = getWeek(1);
System.out.println(week);
System.out.println(getWeekByMap(week));
}
public static String getWeekByMap(String week){
Map map = new HashMap();
map.put("星期一","Mon");
map.put("星期二","Tus");
map.put("星期三","Wes");
map.put("星期日","Sun");
map.put("星期天","Sun");
return map.get(week);
}
public static String getWeek(int week){
if(week<1 || week>7)
throw new RuntimeException("没有对应的星期,请您重新输入");
String[] weeks = {"","星期一","星期二"};
return weeks[week];
}