您的位置:首页 > 职场人生

集合框架Map

2014-03-13 13:39 417 查看
------ android培训java培训,期待与您交流
------
 黑马程序员 java集合框架Map

Map集合存储和Collection中的元素存储有着很大不同:

Collection一次存一个元素,Map一次存一对元素。

Collection是单列集合,Map是双列集合。

Map中的存储的一对元素:一个是键,一个是值,键与值之间有对应(映射)关系。

Map集合常用的三个子类:
|--Hashtable:底层是哈希表数据结构,是线程同步的。不可以存储null键,null值。
|--HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable.
|--TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。

常用方法:

1,添加   V put(K key, V value) 将指定的值与此映射中的指定键关联,当存储的键相同时,新的值会替换老的值,并将老值返回。 如果键没有重复,返回null。

2,删除   void clear() 从此映射中移除所有映射关系。 
 V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除,并返回值

3,判断   boolean isEmpty():
 boolean containsKey(key):是否包含key
 boolean containsValue(value) :是否包含value

4,取出   int size():返回长度
 value get(key) :通过指定键获取对应的值,如果返回null,可以判断该键不存在。
 当然有特殊情况,就是在hashmap集合中是可以存储null值的。
 Collection values():获取map集合中的所有的值。

5,获取map中的所有元素:
原理:map中是没有迭代器的,collection具备迭代器,只要将map集合转成Set集合,可以使用迭代器了。之所以转成set,是因
为map集合具备着键的唯一性,其实set集合就来自于map,set集合底层其实用的就是map的方法。
把map集合转成set的两种方法:
Set<K> keySet(),返回此映射中包含的键的 Set 视图。 
Set<Map.Entry<K,V>> entrySet(),返回此映射中包含的映射关系的 Set 视图。拿到这个Set关系集合后,就能找到键和值了 

取出map集合中所有元素的方式一:keySet()方法。

可以将map集合中的键都取出存放到set集合中。对set集合进行迭代。迭代完成,再通过get方法对获取到的键进行值的获取。
Set keySet = map.keySet();//返回键集
Iterator it = keySet.iterator();
while(it.hasNext()) {
Object key = it.next();
Object value = map.get(key);//根据键获取值
System.out.println(key+":"+value);
}

取出map集合中所有元素的方式二:entrySet()方法。
Set entrySet = map.entrySet();//返回键值对的关系
Iterator it = entrySet.iterator();
while(it.hasNext()) {
Map.Entry  me = (Map.Entry)it.next();
System.out.println(me.getKey()+"::::"+me.getValue());//根据关系分别获取键和值
}

案例展示:使用HashMap存储学生对象,姓名年龄作为键,地址作为值。

package map;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import java.util.Map.Entry;

public class MapTest_HashMap {
public static void main(String[] args) {
HashMap<Student, String> hm=new HashMap<Student, String>();
hm.put(new Student("zhangwuji",22), "WUDANG");
hm.put(new Student("linghuchong",25), "HUASHAN");
hm.put(new Student("linghuchong",25), "HUASHAN");
hm.put(new Student("linghuchong",21), "HUASHAN");
hm.put(new Student("zhouzhiruo",26), "EMEI");
Set<Map.Entry<Student, String>> es=hm.entrySet();
Iterator<Entry<Student, String>> it=es.iterator();
while(it.hasNext()){
Map.Entry<Student, String> me=it.next();
Student stu= me.getKey();
String addr=me.getValue();
System.out.println(stu+"::"+addr);
}
}

}

class Student implements Comparable<Student>{
private String name;
private int age;
public Student(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()
4000
{
return "姓名:"+this.name+" 年龄:"+this.age+"来自:";
}
public int hashCode(){//复写hashCode方法

return name.hashCode()+age*999;
}
public boolean equals(Object obj){//复写equals方法 
if(!(obj instanceof Student)){
throw new ClassCastException("类型转换错误");
}
Student stu=(Student)obj;
return this.age==stu.age&&this.getName().equals(stu.name);
}
@Override
public int compareTo(Student stu) {//复写compare方法
int num=this.age-stu.age;
if(num==0){
return this.getName().compareTo(stu.getName());
}
return num;
}

}

若对象较多的javaBean,需要存储起来,但不确定用什么容器存储时,

建议在普通javaBean的基础上复写hashCode方法,equals方法,实现comparable接口,复写compareTo方法

上面的案例用可排序的TreeMap实现,并按照年龄升序排序:

package map;

import java.util.Comparator;

import java.util.Iterator;

import java.util.Map;

import java.util.TreeMap;

import java.util.Map.Entry;

public class MapTest_TreeMap {
public static void main(String[] args) {
TreeMap<Student, String> tm=new TreeMap<Student, String>(new StuNameComparator());
tm.put(new Student("zhangwuji",22), "WUDANG");
tm.put(new Student("linghuchong",25), "HUASHAN");
tm.put(new Student("linghuchong",21), "HUASHAN");
tm.put(new Student("zhouzhiruo",26), "EMEI");
tm.put(new Student("zhouzhiruo",26), "EMEI2");
Iterator<Entry<Student, String>> it=tm.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);
}
}

}

//自定义比较器

class StuNameComparator implements Comparator<Student>{
@Override
public int compare(Student s1, Student s2) {
int num =s1.getAge()-s2.getAge();
if(num==0){
return s1.getName().compareTo(s2.getName());
}
return num;
}

}

使用集合的技巧:

看到Array就是数组结构,有角标,查询速度很快。

看到link就是链表结构:增删速度快,而且有特有方法。addFirst addLast removeFirst() removeLast() getFirst() getLast();

看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。

看到tree就是二叉树,就要想到排序,就想要用到比较。

LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。

集合什么时候用?

当存储的是一个元素时,就用Collection,当存储对象之间存在着映射关系时,就使用Map集合。

保证唯一,就用Set,不保证唯一,就用List。

------ android培训java培训,期待与您交流
------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息