Java集合框架中的Map集合
Map集合和Collection集合的区别?
Map集合是有Key(键)和Value(值)的,Collection集合是只有Value。
Collection集合底层也是有Key和Value,只是隐藏起来。
什么是Map集合呢?
Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
Map集合中的子类有:
- Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低;
- HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高;
- TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序
Map集合和Set很像,其实Set底层就是使用了Map集合。
Map集合中的方法:
添加
put(K key, V value) //向map集合中添加Key为key,Value为value的元素,当添加成功时返回null,否则返回value
/*
就是说Map集合中的Key是不能重复的,这就类似于Set集合中元素不能重复,但是Map集合中的Value是可以重复
*/
putAll(Map<? extends K,? extends V> m) //向map集合中添加指定集合的所有元素
删除
clear() //把map集合中所有的键值删除
remove(Object key) //删除Key为key值的元素
判断
containsValue(Object value) //检出map集合中有没有包含Value为value的元素,如果有则返回true,否则返回false
containsKey(Object key) //检出map集合中有没有包含Key为key的元素,如果有则返回true,否则返回false。
isEmpty()
获取
get(Object key) //根据map集合中元素的Key来获取相应元素的Value
size() //返回map集合中元素个数
values()
Set<Map.Entry<K,V>> entrySet() //返回map到一个Set集合中,以map集合中的Key=Value的形式返回到set中
Set<K> keySet() //返回map集合的所有key
例1:
Map<String,String> map=new HashMap<String,String>();
System.out.println(map.put("01","Tom"));
System.out.println(map.put("01","Jack")); //当添加的key一样时,返回第一次key对应的值
Map<String,String> map=new HashMap<String,String>();
map.put("01","Tom");
map.put("02","Jack");
map.put("03","Mike");
map.put("04","Jane");
map.remove("01"); //删除key为01对应的简直对
map.remove("02","Jack"); //删除指定key和value对应的元素
System.out.print(map);
map.clear(); //删除map集合所有元素
System.out.print(map);
Map<String,String> map=new HashMap<String,String>();
map.put("01","Tom");
map.put("02","Jack");
map.put("03","Mike");
map.put("04","Jane");
System.out.println(map.containsKey("01")); //是否包含指定key的元素
//可以通过get方法的返回值来判断一个键是否存在。如果返回null则不存在
System.out.println(map.get("03")); //返回value
System.out.println(map.values()); //获取map集合中所有的值
System.out.println(map.size()); //返回map集合的大小
例2:Map集合中的迭代器。
迭代方法一:
Set
keySet:将map中所有的键存入到Set集合。因为set具备迭代器; 所以可以通过迭代方式取出所有的键,再根据get方法。获取每一个键对应的值;
Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。
//迭代方法一:
Map<String,String> map=new HashMap<String,String>();
map.put("01","Tom");
map.put("02","Jack");
map.put("03","Mike");
map.put("04","Jane");
//方法一:先获取map集合的所有键的Set集合,keySet()
Set<String>keyset=map.keySet();
//有了Set集合。就可以获取其迭代器
Iterator<String>it=keyset.iterator();
while(it.hasNext())
{
String key=it.next();
String value=map.get(key);
System.out.println("key="+key+" value="+value);
}
迭代器方法二:
Set
> entrySet:将map集合中的映射关系存入到了set集合中; 而这个关系的数据类型就是:Map.Entry;
Entry其实就是Map中的一个static内部接口。
为什么要定义在内部呢?
因为只要有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。而且该事物在直接访问Map集合中的元素。
Set<Map.Entry<String,String>> entrySet=map.entrySet();
Iterator<Map.Entry<String,String>> it=entrySet.iterator();
while(it.hasNext())
{
Map.Entry<String,String> me=it.next();
String key=me.getKey();
String value=me.getValue();
System.out.println("key="+key+" value="+value);
}
例3:每一个学生都有对应的归属地。学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。
class Student implements Comparable<Student>
{
private String name;
private int age;
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Student s)
{
int num = new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
return this.name.compareTo(s.name);
return num;
}
public int hashCode()
{
return name.hashCode()+age*34;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s = (Student)obj;
return this.name.equals(s.name) && this.age==s.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name+":"+age;
}
}
class Demo {
public static void main(String[] args)
{
HashMap<Student,String> hm = new HashMap<Student,String>();
hm.put(new Student("lisi1",21),"beijing");
hm.put(new Student("lisi1",21),"tianjin"); //当键一样时,新键替代旧键
hm.put(new Student("lisi2",22),"shanghai");
hm.put(new Student("lisi3",23),"nanjing");
hm.put(new Student("lisi4",24),"wuhan");
//第一种取出方式 keySet
Set<Student> keySet = hm.keySet();
Iterator<Student> it = keySet.iterator();
while(it.hasNext())
{
Student stu = it.next();
String addr = hm.get(stu);
System.out.println(stu+".."+addr);
}
}
}
还没有评论,来说两句吧...