Map集合:
用于存储成对的数据<key,values>,一对一的往里面存入而且要保证键的唯一性;Collection用于存储
单个的数据
|--Hashtable:底层的数据结构是哈希算法,不可存入null键和null值,线程同步、安全,执行效率低
|--HashMap:底层的数据结构是哈希算法,可以存入null键和null值,线程不同步,不安全,执行效率高;替代了
Hashtable
|--TreeMap:底层的数据结构是二叉树结构,线程不同步,可以用于给map集合进行排序
HashMap如何实现存入的元素不重复?
HashMap集合中不能存入相同的元素而判定元素是否相同的依据是hashCode和equals两个方法
如果两个元素的hashCode值相同时则再用equals方法来比较两个元素是否是真的相同,
如果相同则不存入,否则存入,所以自定义的元素对象要复写这个方法
hashMap中如果存入相同的键而存入的相应的值不同时,则后存入的值会覆盖先前的值
TreeMap如何实现存入的元素排序?
有两种方式可以实现判断元素的方法
1.元素自身实现comparaTo方法
元素实现comparable接口中的comparaTo方法
2.集合自身覆盖comparator接口
集合自身实现compare方法
Map常用方法:
1.添加:
put(K key,V values):向集合中加入元素
putAll(Map m):向集合中加入另一个集合
2.删除:
remove(Object b): 如果存在一个键的映射关系,则将其从此映射中移除(可选操作
clear():清空集合
3.判断:
containsKey(Object key):判断集合中是否有指定的键
containsValue(Object value):判断集合中是否有指定的值
isEmpty():判断集合是否为空
4.获取:
get(Object key):返回指定键的值,没有则返回null
size():返回集合元素的个数
Map集合的两种获取方式:
1.Set<k> keySet():
将map中所有的键数据存入Set集合中,因为Set中有迭代器,可以通过set中的迭代器取出所有
的键,再根据get()来取出对应的值,每一个对应的键都有对应的一个值
原理:将Map集合转化为Set集合,再根据Set迭代器取出元素
2.Set<Map.Entry<k,v>> entrySet():
将Map集合中的映射关系存入到Set集合中,而这个关系类型就是Map.Entry()
Entry其实是Map集合中的一个内部接口
import java.util.*;
public class MapTest{
public static void main(String[] args){
Map<String,String> ma=new HashMap<String,String>();
ma.put("01","lidaofu");
ma.put("03","haha");
ma.put("04","afu");
ma.put("02","daofu");
//第一种取出元素的方式
Set<String> key=ma.keySet();
Iterator it=key.iterator();
while(it.hasNext()){
String ke=(String)it.next();
String value=ma.get(ke);
System.out.println("key="+ke+" value="+value);
}
System.out.println(ma);
//第二种取出元素的方式
Set<Map.Entry<String,String>> entry=ma.entrySet();
Iterator<Map.Entry<String,String>> it=entry.iterator();
while(it.hasNext()){
Map.Entry<String,String> me = it.next();
String key = me.getKey();
String value = me.getValue();
System.out.println(key+":"+value);
}
}
}
//向集合中存入自定义对象
import java.util.*;
class Person{
private String name;
private int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
public int hashCode(){
return this.name.hashCode()+this.age*5;
}
public boolean equals(Object obj){
Person p=(Person)obj;
return (this.name.equals(p.name)==true) ? ((this.age==p.age) ? true : false) : false;
}
public String toString(){
return "name: "+this.name+" age :"+this.age;
}
}
public class MapTest{
/*
需求:向集合中存入个人信息和所在地,并打印输出
分析:因为存入的是键值对,所以可以用HashMap集合,因为存入的元素是自定义的元素,所以要
覆写父类中的hashCode()和equals()两个方法,这两个方法能保证存入的元素唯一性
而从集合中取出元素Map集合有两种方式:
1.通过先取出Map集合中的键集合,再通过键取出集合中的值
2.通过取出Map集合中视图关系,再通过视图取出集合中的元素
*/
public static void main(String[] args){
HashMap<Person,String> hm=new HashMap<Person,String>();
hm.put(new Person("lidaofu",34),"蚌埠");
hm.put(new Person("daofu",23),"合肥");
hm.put(new Person("LIDAOFU",22),"杭州");
hm.put(new Person("lidafu",34),"桐城");
hm.put(new Person("fu",25),"北京");
hm.put(new Person("李",12),"天津");
hm.put(new Person("道",67),"上海");
hm.put(new Person("福",45),"安庆");
//第一种取出方式
//取集合视图
Set<Map.Entry<Person,String>> se=hm.entrySet();
//取集合视图迭代器
Iterator<Map.Entry<Person,String>> it=se.iterator();
//取集合元素
while(it.hasNext()){
Map.Entry<Person,String> entry=it.next();
Person p=entry.getKey();
String s=entry.getValue();
System.out.println(p+":"+s);
}
//第二种取出方式
//取键集合
Set<Person> se=hm.keySet();
//取集合迭代器
Iterator<Person> it=se.iterator();
//取元素
while(it.hasNext()){
Person p=it.next();
String value=hm.get(p);
System.out.println(p+" : "+value);
}
//取出值集合元素
Collection<String> con=hm.values();
Iterator<String> it=con.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}