java集合3——Map集合的基础知识

来源:互联网 发布:淘宝买家皇冠怎么来的 编辑:程序博客网 时间:2024/06/08 14:39

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的参数传进去。

0 0
原创粉丝点击