Map集合,保证元素的唯一性包含hashmap、treemap(和set集合很像,Set集合其实就是用的map集合)
hashmap底层是hash表数据结构,允许空键,空值,线程不同步
treemap底层是二叉树,线程不同步,可以用来给map中的键排序
hashtable底层的数据结构也是Hash表,不允许键或值为空,线程同步
map集合的基本使用:put(key、value)、clear()、remove(key)、containskey(k)、containsvalue(v)、
Map<String,String> map=new HashMap<String,String>();
//put方法,像map集合添加元素,如果添加了相同的键,则后来的值会覆盖原来的值,并返回原来的值
map.put("01", "zhangsan");
map.put("02", "lisi");
map.put("03", "wangwu");
Set<String> keySet=map.keySet();
//keySet将所有的键存入到Set集合,因为Set集合具备迭代器,所以可以用迭代器的方式取出所有的键,再根据get方法,获取每个键所对应的值
Iterator<String> it=keySet.iterator();
while(it.hasNext())
{
String key=it.next();
String value=map.get(key);
System.out.println("key:"+key+"value:"+value);
}//map集合的取出原理:将map集合转化成set集合,再通过迭代器取出
Set<Map.Entry<String, String>> entrySet=map.entrySet();
Iterator<Map.Entry<String, String>> it2=entrySet.iterator();
while(it2.hasNext())
{
Map.Entry<String, String> me=it2.next();
String key=me.getKey();
String value=me.getValue();
System.out.println("2key:"+key+"value:"+value);
}//Map.Entry其实Entry也是一个接口,它是Map接口中的一个内部接口,它里面有getKey和getValue方法
System.out.println("containskey:"+map.containsKey("02"));//containskey:true
System.out.println("get:"+map.get("02"));//get:lisi
System.out.println("containsvalue:"+map.containsValue("lisi"));//containsvalue:true
System.out.println("remove:"+map.remove("02"));//remove:lisi
System.out.println(map);//{01=zhangsan, 03=wangwu}
System.out.println("get:"+map.get("02"));//get:null也可用于判断一个键是否存在,如果存的是null,返回值也是null
map.put(null, "haha");
System.out.println(map);// {null=haha, 01=zhangsan, 03=wangwu}
Collection coll=map.values();
System.out.println(coll);//[haha, zhangsan, wangwu]
map集合的两种取出方式,上面也有
练习题:每个学生对应一个归属地,学生Student,地址String、
学生的属性:姓名,年龄(相同视为同一个学生)
保证学生的唯一性
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int hashCode()//用于存到hash表中
{
return name.hashCode()+age;
}
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 this.name+"_"+this.age;}
}
main()
{
HashMap<Student,String> hm=new HashMap<Student,String>();
hm.put(new Student("lisi1",4), "beijing");
hm.put(new Student("lisi2",3), "shanghai");
hm.put(new Student("lisi2",3), "sh");
hm.put(new Student("lisi3",2), "tianjin");
hm.put(new Student("lisi4",1), "dalian");
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);
}
}
结果:lisi4_1~~dalian
lisi3_2~~tianjin
lisi2_3~~sh
lisi1_4~~beijing
2、要求对年龄进行升序排列,则需要实现
public int compareTo(Student s)//用于存到treeset中
{
//按年龄排序
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0) return this.name.compareTo(s.name);
return num;
}
并且使用TreeMap,
如果要再按照姓名排序,则需要用比较器:
class StuNameComparator implements Comparator<Student>
{
public int compare(Student o1, Student o2) {
String s1=o1.getName();
String s2=o2.getName();
int num=s1.compareTo(s2);
return num;
}
}
new一个比较器,作为treeset的参数传进去。