您的位置:首页 > 编程语言 > Java开发

Java基础 集合Map

2015-06-16 11:11 579 查看

Map

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。

和Set很像,Set底层就是使用了Map集合

1,添加
V put(K key, V value)
返回:此哈希表中指定键的以前的值;如果不存在该值,则返回 null

void putAll(Map< ? extends K,? extends V> m)

2,删除

V remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。

void clear()
3,判断
boolean containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true。
boolean containsValue(Object value)如果此映射将一个或多个键映射到指定值,则返回 true。
boolean isEmpty()
4,获取
V get(Object key)返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
Collection<V> values()返回此映射中包含的值的 Collection 视图。
int size()
Set<K> keySet() 返回此映射中包含的键的 Set 视图。
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的 Set 视图。


基本方法演示

import java.util.*;
class MapDemo
{
public static void main(String[] args)
{
Map<String,String> map = new HashMap<String,String>();

map.put("01","value1");
map.put("02","value2");
map.put("03","value3");
map.put("01","value001");//覆盖老的值,返回原来的值
map.put(null,"snull");

Collection<String> coll=map.values();

System.out.println("containsKey:"+map.containsKey("01"));
System.out.println("get:"+map.get("01"));//返回value1
System.out.println("null:"+map.get(null));//返回snull
//System.out.println("remove:"+map.remove("01"));//返回value1
System.out.println("remove:"+map.remove("0"));//返回null
System.out.println("map:"+map);//

System.out.println(coll);
}
}


输出:

containsKey:true

get:value001

null:snull

remove:null

map:{null=snull, 01=value001, 02=value2, 03=value3}

[snull, value001, value2, value3]

Hashtable

底层是哈希表数据结构,不可以存入null键 null值

该集合线程同步。jdk1.0 效率低

HashMap

底层是哈希表数据结构,允许使用null键 null值

该集合线程不同步。jdk1.2 效率高

keySet()//获取所有键

import java.util.*;
class MapDemo1
{
public static void main(String[] args)
{
Map<String,String> map = new HashMap<String,String>();

map.put("01","value1");
map.put("02","value2");
map.put("03","value3");

System.out.println("取出所有的键值对");
Set<String> keys=map.keySet();
for(Iterator<String> it=keys.iterator();it.hasNext();)
{
String k=it.next();
String v=map.get(k);
System.out.println(k+":"+v);
}
System.out.println("------------------");
}
}


输出:

取出所有的键值对

01:value1

02:value2

03:value3

——————

entrySet()//获取所有键值对

import java.util.*;

class MapDemo2
{
public static void main(String[] args)
{
Map<String,String> map=new HashMap<String,String>();
map.put("k1","v1");
map.put("k2","v2");
map.put("k3","v3");

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();
System.out.println("key:"+me.getKey()+" value:"+me.getValue());
}
}
}


输出:

key:k1 value:v1

key:k2 value:v2

key:k3 value:v3

TreeMap

底层是二叉树数据结构,可以用于给map集合中的键进行排序

线程不同步。

练习

使用 map 存储 学生,地址

学生有 名字,年龄 两个属性

并打印结果使用无序使用 HashMap

import java.util.*;

class MapTest
{
public static void main(String[] args)
{
Map<Student,String> map=new HashMap<Student,String>();
map.put(new Student("张三",18),"北京");
map.put(new Student("李四",20),"北京");
map.put(new Student("大明",25),"上海");
map.put(new Student("大明",25),"武汉");

Set<Map.Entry<Student,String>> mySet=map.entrySet();

Iterator<Map.Entry<Student,String>> ite=mySet.iterator();
System.out.println(new Student("张三",18).equals(new Student("张三",18)));
while(ite.hasNext())
{
Map.Entry<Student,String> ent=ite.next();
Student K=ent.getKey();
System.out.println(K+" Value:"+ent.getValue());
}
}

}

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*2;
}

public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
if(name.equals(s.getName()) && age==s.getAge())
return true;

return false;
}
public String toString()
{
return name+":"+age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}


输出:

true

大明:25 Value:武汉

张三:18 Value:北京

李四:20 Value:北京

练习2使用 TreeMap

同上题,使用学生姓名,年龄进行排序。

向TreeMap中传入一个比较器,Comparator

比较两个Student的name和age

import java.util.*;

class StuNameComparator implements Comparator<Student>
{
public int compare(Student s1,Student s2)
{
int num=s1.getName().compareTo(s2.getName());
if(num==0)
return new Integer(s1.getAge()).compareTo(s2.getAge());
return num;
}
}
class MapTest2
{
public static void main(String[] args)
{
Map<Student,String> map=new TreeMap<Student,String>(new StuNameComparator());
map.put(new Student("aa1",25),"北京");
map.put(new Student("aa2",20),"北京");
map.put(new Student("bb1",23),"上海");
map.put(new Student("bb2",28),"武汉");
map.put(new Student("bb2",18),"武汉");

Set<Map.Entry<Student,String>> mySet=map.entrySet();

Iterator<Map.Entry<Student,String>> ite=mySet.iterator();
System.out.println(new Student("张三",18).equals(new Student("张三",18)));
while(ite.hasNext())
{
Map.Entry<Student,String> ent=ite.next();
Student K=ent.getKey();
System.out.println(K+" Value:"+ent.getValue());
}
}

}

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*2;
}

public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
if(name.equals(s.getName()) && age==s.getAge())
return true;

return false;
}
public String toString()
{
return name+":"+age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}


输出:

true

aa1:25 Value:北京

aa2:20 Value:北京

bb2:18 Value:武汉

bb2:28 Value:武汉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: