------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! ----------
一、Map集合:该集合存储键值对。一对一往里存,而且要保证键的唯一性。
Java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap.
Map主要用于存储键值对,根据键得到值,因此不允许键重复,但允许值重复。
HashMap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。
Hashtable与HashMap类似,不同的是,它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历时会比HashMap慢。
TreeMap能够吧保存的数据根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。
添加。
put(K key,V value)//添加键值对
putAll(Map<? Extends K,?extends V> m); //从指定映射中将所有映射关系复制到此映射中
1.删除
clear()//从集合中移除所有键值对
remove(Object key) //移除存在的键的映射关系
2.判断
containsValue(Object value);//存在对应的值,返回true
containsKey(Object key);//存在对应的键值,返回true
isEmpty(); //如果集合为空,返回true
3.获取
get(Object key) //根据键,得到对应的值
size()//集合映射数量,或大小
values()//返回此集合中所有的值的Collection<V>
entrySet()//返回此包含映射关系的Set<Map.Entry<K,V>>视图
Map实现类
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步的。
Jdk1.0效率低
|--HashMap:底层是哈希表数据结构,允许使用null值和null键,该集合是不同步的。Jdk1.2效率高。
|--TreeMap :底层是二叉树数据结构,线程不同步。可以用于给map集合中的键进行排序。
和set很像,set底层就是使用了map集合。
Map集合有两种取出方式:
1、Set<k> keySet:将map中所有元素的键存入到Set集合。因为Set具备迭代器。
所以可以利用迭代方式取出所有的键,在根据get方法。获取每个键对应的值。
原理:将map集合转成set集合。再通过迭代器取出。
2、Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的
数据类型就是:Map.Entry
Map.Entry :其实Entry也是一个接口,它是Map接口中的一个内部接口。
Map<String,String> map=new HashMap<String,String>();
//添加元素,如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应的值。
//put方法返回被覆盖的值。
System.out.print(map.put("22", "zhangsan"));//null
System.out.print(map.put("22", "lishi"));//zhangsan
向集合存入值
map.put("03", "haha");
map.put("04", null);
map.put(null, null);
map.containsKey("04");//返回true
map.containsValue("haha")//返回true
//获取map集合中的所有元素
Collection<String> co=map.values();
System.out.print(co);
练习;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/*每一个学生都有对应的归属地,学生Student,地址String。
* 学生属性:姓名,年龄。
* 注意,姓名和年龄相同的视为同一个学生。
* 保证学生的唯一性。
* */
//1、描述学生
//2、定义map容器,将学生作为键,地址作为值,存入集合
//3、获取map集合中的元素。
class Student1 implements Comparable<Student1>{
private String name;
privateintage;
Student1(String name,int age){
this.name=name;
this.age=age;
}
//有可能存储到二叉树,必须让学生具备自认顺序
@Override
publicint compareTo(Student1 s){
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
returnthis.name.compareTo(s.name);
return num;
}
//存的对象多,有可能存到hashSet中
publicint hashCode(){
returnname.hashCode()+age*23;
}
publicboolean equals(Object obj){
if(!(obj instanceof Student1))
thrownew RuntimeException("类型不匹配");
Student1 s=(Student1)obj;
returnthis.name.equals(s.name)&&this.age==s.age;
}
public String getName(){
returnname;
}
publicint getAge(){
returnage;
}
public String toString(){
returnname+":"+age;
}
}
publicclass HashMapDemo {
publicstaticvoid main(String[] args) {
HashMap<Student1,String> hm=new HashMap<Student1,String>();
hm.put(new Student1("lishi1",21), "北京");
hm.put(new Student1("lishi2",22), "大连");
hm.put(new Student1("lishi3",23), "上海");
hm.put(new Student1("lishi4",24), "天津");
//第一种取出方式:
Set<Student1> keySet=hm.keySet();
Iterator<Student1> it=keySet.iterator();
while(it.hasNext()){
Student1 s=it.next();
String addr=hm.get(s);
System.out.println(s+".."+addr);
}
//第二种取出方式:
Set<Map.Entry<Student1, String>> entrySet=hm.entrySet();
Iterator<Map.Entry<Student1, String>> iter=entrySet.iterator();
while(iter.hasNext()){
Map.Entry<Student1, String> me= iter.next();
System.out.println(me.getKey()+"---"+me.getValue());
}
}
}
------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! ----------
如有疑问:http://edu.youkuaiyun.com/

本文深入探讨Java中的Map集合,包括HashMap、Hashtable、LinkedHashMap和TreeMap的使用方法,以及如何添加、删除、判断和获取键值对。通过实例展示了如何使用Map集合存储学生信息,并获取相关信息。
1090

被折叠的 条评论
为什么被折叠?



