------- android培训、java培训、期待与您交流! ----------
Map集合
1.Map子类对象的特点:
|--HashTable:顶层是哈希表数据结构,是线程同步的,不可以存储null键,null值
|--HashMap:底层是哈希表数据结构,是线程不同步的,可以存储null键,null值
|--TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序
2.Map和Set很像,Set底层就是使用了Map集合。
3.Map集合和Collection集合的不同之处:
Collection一次存入一个元素,Map一次存入一对元素
Collection是单列集合,Map是双列集合
Map中数据之间存在映射关系
Map中常用方法:
1.添加
put(key,value):当存储的键相同时,新值会替换老值,并将老值返回,如果见没有重复,返回null
void putAll(Map):一次性添加多对元素
2.删除
void clear():清空集合
value remove(key):删除指定键
3.判断
boolean isEmpty():集合是否为空
boolean containsKey(key):是否包含指定键
boolean containsValue(value):是否包含指定值
4.取出
int size():返回集合的长度
value get(key):通过指定键获取对应的值,通过返回null来判断
Collection values():获取map集合中的所有值
map集合的两种取出方式:
1,Set<k>keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
importjava.util.*;
class MapDemo1
{
publicstatic void main(String[] args)
{
Map<String,String>map = new HashMap<String,String>();
map.put("01","lisi");
map.put("02","wangwu");
map.put("03","zhangsan");
map.put("04","zhaoliu");
Set<String> keySet = map.keySet();//将map集合中的键都取出存放在set中
Iterator<String> it = keySet.iterator();//获取迭代器,迭代set集合
while(it.hasNext())
{
String key =it.next();//用迭代的方式取出所有的键
String value = map.get(key);//根据get方法,获取每一个键对应的值
System.out.println("key:"+key+",value:"+value);
}
}
}
2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry
Entry其实就是Map中的一个static内部接口。
--->为什么要定义在内部呢?
因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。而且该事物在直接访问Map集合中的元素。
importjava.util.*;
class MapDemo2
{
publicstatic void main(String[] args)
{
Map<String,String>map = new HashMap<String,String>();
map.put("1","zhangsan1");
map.put("2","zhangsan2");
map.put("3","zhangsan3");
//通过entrySet方法获得map集合中的映射关系,并存入到set集合中
Set<Map.Entry<String,String>>entrySet = map.entrySet();
//获取迭代器,迭代set集合
Iterator<Map.Entry<String,String>>it = entrySet.iterator();
while(it.hasNext())
{
//用迭代的方式取出每一对映射的关系,存入到map的entry中
Map.Entry<String,String>me = it.next();
Stringkey = me.getKey();//通过getKey方法获取键
Stringvalue = me.getValue();//通过getValue方法获取值
System.out.println(key+":"+value);
}
}
}
补充知识点:HashMap和TreeMap存取数据的原理:
HashMap:存储一个键值对的时候,先会调用键对象的hashCode()方法得到哈希值,然后在集合中查找是否有哈希值相同的键对象。如果没有哈希值相同的键对象,直接将键值对存入。如果有哈希值相同的键对象,逐个和这些键对象进行equals()方法比较,比较的结果为false就将键值对存入;比较的结果为true,则用新的值覆盖原有值。
TreeMap:在存储键值对的时候,会调用键对象的compareTo()方法和集合中其他的键对象进行比较,根据比较结果以二叉树形式存储。如果TreeMap创建的时候在构造函数中传入了比较器(有时可以用匿名内部类的形式)的话,那么在比较的时候以比较器为主。这里我们需要清楚的知道的就是:存储自定义的对象的时候,我们可以用自然顺序的方式,还可以用比较器的方式:
自然顺序:让自定义的类实现Comparable接口,重写ComparaTo()方法。
比较器:写一个类然后让其实现Comaparator接口,然后重写Compare()方法。
小总结:
Array就是数组结构,有角标,查询速度很快
Link就是链表结构,增删速度快,而且有特有方法,addFirst(),addLast()。removeFirst(),removeLast(),getFirst(),getLast();
hash就是哈希表,就要想到唯一,就要想到存入的元素必须覆盖hashCode和equals方法
Tree就要想到二叉树,就要想到比较:
比较的两种方式:
一个是Comparable:覆盖CompareTo方法
一个是Comparator:覆盖Compare方法
集合的使用规则:
当存储的是一个元素的时候就用Collection,当存储的对象之间存在映射关系时,就使用Map集合
保证唯一,就用Set。不保证唯一,就用List。
HashMap练习:
需求:每一个学生都有一个归属地,学生Student,地址String,学生属性:
姓名,年龄
注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。
步骤:1.描述学生。
2.定义map容器,将学生作为键,地址作为值传入。
3.获取map集合中的元素。
相关代码如下:
importjava.util.*;
class Student implements Comparable<Student>
{
privateString name;
privateint age;
Student(Stringname,int age)
{
this.name= name;
this.age= age;
}
public intcompareTo(Student s)
{
intnum = new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
returnthis.name.compareTo(s.name);
returnnum;
}
public inthashCode()
{
returnname.hashCode()+age*34;
}
publicboolean equals(Object obj)
{
if(!(objinstanceof Student))
thrownew ClassCastException("类型不匹配");
Students = (Student)obj;
returnthis.name.equals(s.name) && this.age==s.age;
}
publicString getName()
{
returnname;
}
public intgetAge()
{
returnage;
}
publicString toString()
{
returnname+":"+age;
}
}
class HashMapTest
{
publicstatic void main(String[] args)
{
HashMap<Student,String>hm = new HashMap<Student,String>();
hm.put(newStudent("zhangsan",12),"北京");
hm.put(newStudent("lisi",24),"上海");
hm.put(newStudent("lisi",24),"青岛");
hm.put(newStudent("wangwu",34),"北京");
//第一种取出方式 keySet
Set<Student>keySet = hm.keySet();
Iterator<Student>it = keySet.iterator();
while(it.hasNext())
{
Studentstu = it.next();
Stringaddr = hm.get(stu);
System.out.println(stu+".."+addr);
}
//第二种取出方式 entrySet
Set<Map.Entry<Student,String>>entrySet = hm.entrySet();
Iterator<Map.Entry<Student,String>>iter = entrySet.iterator();
while(iter.hasNext())
{
Map.Entry<Student,String>me = iter.next();
Studentstu = me.getKey();
Stringaddr = me.getValue();
System.out.println(stu+"........."+addr);
}
}
}
TreeMap练习:
需求:对学生对象的年龄进行升序排序:
importjava.util.*;
class Student implements Comparable<Student>
{
privateString name;
privateint age;
Student(Stringname,int age)
{
this.name= name;
this.age= age;
}
public intcompareTo(Student s)
{
intnum = new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
returnthis.name.compareTo(s.name);
returnnum;
}
public inthashCode()
{
returnname.hashCode()+age*34;
}
publicboolean equals(Object obj)
{
if(!(objinstanceof Student))
thrownew ClassCastException("类型不匹配");
Students = (Student)obj;
returnthis.name.equals(s.name) && this.age==s.age;
}
publicString getName()
{
returnname;
}
public intgetAge()
{
returnage;
}
publicString toString()
{
returnname+":"+age;
}
}
class StuNameComparator implementsComparator<Student>
{
public intcompare(Student s1,Student s2)
{
intnum = s1.getName().compareTo(s2.getName());
if(num==0)
returnnewInteger(s1.getAge()).compareTo(newInteger(s2.getAge()));
returnnum;
}
}
class TreeMapTest
{
publicstatic void main(String[] args)
{
TreeMap<Student,String>tm = new TreeMap<Student,String>(new StuNameComparator());
tm.put(newStudent("zhangsan",12),"北京");
tm.put(newStudent("lisi",24),"上海");
tm.put(newStudent("lisi",24),"青岛");
tm.put(newStudent("wangwu",34),"北京");
Set<Map.Entry<Student,String>>entrySet = tm.entrySet();
Iterator<Map.Entry<Student,String>>it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<Student,String>me = it.next();
Studentstu = me.getKey();
Stringaddr = me.getValue();
System.out.println(stu+":::"+addr);
}
}
}
------- android培训、java培训、期待与您交流! ----------