集合框架Map

来源:互联网 发布:美年大健康 知乎 编辑:程序博客网 时间:2024/04/30 04:13
------ 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(){
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培训,期待与您交流 ------
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 后滚翻翻不过去怎么办 走太多路小腿疼怎么办 踢毽子以后期盖右腿内彻疼怎么办 大学体育选修课挂了怎么办 当天贴的砖踩了怎么办 刚贴的瓷砖踩了怎么办 长胶底板太轻怎么办 乒乓球拍胶皮不粘了怎么办 乒乓球拍子胶片太滑怎么办 新买的包黏黏的怎么办 卫星锅收不到台怎么办 养殖厂被卫星拍住怎么办 中六卫星无信号怎么办 晒出成片的斑怎么办 太阳晒出胳膊上长斑怎么办 宇航员在太空死后怎么办 太阳暴晒起的斑怎么办 太阳晒出来的斑怎么办 被认定D级危房怎么办 突然发现两个关系遥远怎么办 如果没有地球人类会怎么办 小锅盖被屏蔽了怎么办 美的冰箱故障通讯不合格怎么办 美的冰箱通讯不合格怎么办 文明6金币降到0怎么办 紫癜肾炎长期尿潜血怎么办 肾移植后血压高怎么办 尿道长了个肿瘤怎么办 吃了有病的鹅怎么办 狗狗得了乳腺瘤怎么办 孕28周还是臀位怎么办 怀孕五个月胎位不正怎么办 33周了胎位不正怎么办 足月胎儿不足5斤怎么办 绒癌观察期怀孕怎么办 宝宝囱门闭合晚怎么办 慢性硬脑膜下血肿复发怎么办 佝偻病导致囟门晚闭怎么办 儿童液体补多了怎么办 脑脊液鼻漏3年了怎么办 结石掉到膀胱里怎么办