------- android培训、java培训、期待与您交流! ----------
Map与Collection在java集合框架中属于并列存在的,map存储的是键值对。
可以说整个集合框架中的容器分为两种,一种是单列集合,指的就是Collection
另外一种是双列集合,就是指map。
map下主要有HashTable、HashMap和TreeMap
他们的特点是:
HashTable:底层数据结构是哈希表,是线程同步的。不可以存储null键和null值。
HashMap:线程不同步,底层数据结构也是哈希表。但是可以存储null键和null值。
TreeMap:能对键进行排序。排序原理和TreeSet相同,事实上,TreeSet底层就是调用了TreeMap。
1,添加。
put(key,value):当存储的键相同时,新的值会替换老的值,并将老值返回。如果键没有重复,返回null。
void putAll(Map);
2,删除。
void clear():清空
value remove(key) :删除指定键。
3,判断。
boolean isEmpty():
boolean containsKey(key):是否包含key
boolean containsValue(value) :是否包含value
4,取出。
int size():返回长度
value get(key) :通过指定键获取对应的值。如果返回null,可以判断该键不存在。当然有特殊情况,
就是在hashmap集合中,是可以存储null键null值的。Collection values():获取map集合中的所有的值。
5,想要获取map中的所有元素:
map中是没有迭代器的,collection具备迭代器,只要将map集合转成Set集合,可以使用迭代器了。
之所以转成set,是因为map集合具备着键的唯一性,其实set集合就来自于map,set集合底层其实用的就是map的方法。
获取Map集合的两种方法:
获取Map集合中元素的原理是:因为map集合中没有迭代器,所以,要想需要先将map转化成集合
然后使用集合中的迭代器遍历。有两种方法:
第一:使用keySet方法。获取key的集合,遍历key集合,使用map中get方法,来获取值。
第二:使用entrySet方法。获取键值对映射关系的集合Map.Entry。使用迭代器遍历Map.Entry集合,
再通过Map.Entry中的getKey和getValue方法。
下面分别用两种方法取出Map集合中的元素代码示例:
package com.itheima;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapTest
{
public static void main(String args[])
{
//map集合取出原理:
//因为map集合中没有迭代器。
//是先将map转化成set集合,再使用set集合中的迭代器
//来遍历集合。从而取出map集合中的元素。
//Map元素取出的第一种方式。先取出map集合中键的集合。
//使用map中的keySet方法。
Map<String ,String> map = new HashMap<String ,String>();
map.put("02","lisod");
map.put("03","lzhgnsl");
map.put("01","lisodni");
map.put("07","zhangsan");
//使用keySet将map集合中的键取出存入到set集合中。
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext())
{
String string = it.next();
System.out.println(string + "....." + map.get(string));
}
//map集合取出的第二种方式:
//先将map集合中的映射关系取出。通过map集合中的entrySet方法。
Set<Map.Entry<String, String>> entrySet = map.entrySet();
Iterator<Map.Entry<String, String>> it1 = entrySet.iterator();
while (it1.hasNext())
{
Map.Entry<java.lang.String, java.lang.String> entry =
(Map.Entry<java.lang.String, java.lang.String>) it1.next();
System.out.println(entry.getKey()+"______"+entry.getValue());
}
}
}
与Map有关的练习代码示例:
需求是创建学生对象,每个学生都有地址属性。姓名和年龄若相同则视为同一个学生。
保证学生的唯一性。
package com.itheima;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
/**
* map集合被使用是因为具备映射关系。
* 当一个类会产生大量的对象时,则有可能需要容器存储。
* 存储时有可能存入不同的集合。*/
class Student1 implements Comparable<Student1>
{
private String name;
private int age ;
Student1(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String toString()
{
return name + ":" + age;
}
public int hashCode()
{
return name.hashCode()+age*34;
}
@Override
public boolean equals(Object obj)
{
if (!(obj instanceof Student1))
{
throw new ClassCastException("类型不匹配");
}
Student1 s = (Student1)obj;
return this.name.equals(s.name) && this.age==s.age;
}
@Override
public int compareTo(Student1 s)
{
// TODO Auto-generated method stub
int num = new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
{
return this.name.compareTo(s.name);
}
return num;
}
}
public class MapPractice
{
public static void main(String args[])
{
HashMap<Student1,String> hm = new HashMap<Student1,String>();
hm.put(new Student1("lse",23),"shaoyang");
hm.put(new Student1("lily",21),"chagde");
hm.put(new Student1("lily",21),"tianjing");
hm.put(new Student1("mike",26),"xiangtan");
hm.put(new Student1("jack",25),"cahngsha");
Set<Student1> set = hm.keySet();
Iterator<Student1> it = set.iterator();
while (it.hasNext())
{
Student1 student = it.next();
System.out.println(student+".........."+hm.get(student));
}
}
}
TreeMap分析:
TreeMap是存储以键值对形式存在的数据,并且能对键进行排序。
排序原理和TreeSet相同,事实上,TreeSet底层就是调用了TreeMap。
TreeMap练习:sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。
希望打印结果:a(1)c(2).....
package com.itheima;
/*思路:
1,将字符串转换成字符数组。因为要对每一个字母进行操作。
2,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。
3,遍历字符数组。
将每一个字母作为键去查map集合。
如果返回null,将该字母和1存入到map集合中。
如果返回不是null,说明该字母在map集合已经存在并有对应次数。
那么就获取该次数并进行自增。,然后将该字母和自增后的次数存入到map集合中。覆盖调用原理键所对应的值。
4,将map集合中的数据变成指定的字符串形式返回。
*/
import java.util.*;
public class TreeMapPractice
{
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;
/*
if(value==null)
{
tm.put(chs[x],1);
}
else
{
value = value + 1;
tm.put(chs[x],value);
}
*/
}
//System.out.println(tm);
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();
}
}