package day16Map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class MapDemo {
/*
* Map 集合
* 该集合存储键值对
* 一对一对的往里存
* 而且要保证键 的唯一性
*
* 1:添加
* put(K key, V value)
* putAll(Map extends K,? extends V> m)
* 2:删除
* clear
* remove(Object key)
* 3:判断
* containsKey(Object key)
* containsValue(Object key)
* isEmpty()
* 4:获取元素
* get(Object key)
* Collection values()
*
* entrySet()
* keySet
* Map
* |--HashTable:
* 相同:底层是Hash表,不可以存入null;
* 不同:线程同步的
* 此类实现一个哈希表
* 该哈希表将键映射到相应的值
* 任何非 null 对象都可以用作键或值。
* |--HastMap:底层是Hash表
* 相同:基于哈希表的 Map 接口的实现
* 不同:并允许使用 null 值和 null 键
* 除了非同步和允许使用 null 之外
* HashMap 类与 Hashtable 大致相同
* |--TreeMap:
* 底层是二叉树
* 线程不同步
* 对键 进行排序
* 和Set很像
* 其实:Set底层就是使用了Map集合
* */
public static void main(String[] args) {
Map m=new HashMap();
//添加元素
System.out.println(m.put("01", "zs1"));
System.out.println(m.put("01", "qqqzss1"));
//put方法当存入相同的键时,会替换原来键对应的值,put还将该值返回
m.put("02", "zs2");
m.put("03", "zs3");
m.put(null, "zs3");//可以通过
System.out.println("containsKey:"+m.containsKey("01"));
//System.out.println("containsKey:"+m.remove("01"));
System.out.println("m:"+m);
//System.out.println("get:"+m.get(null));//可以应用
Collection c=m.values();
System.out.println("collection:"+c);
}
}
2Map取出元素的方法keySet 、entrySet
package day16Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapDemo2 {
/*Map集合的取出方式;;两种
* 1:keySet()将Map中的所有键存入Set集合,
* 因为Set具备迭代器。可以通过迭代方式取出键
* 然后是get方法获取值
* Map集合的取出原理:
* 将Map---》set---》迭代器
* 2:Set>entrySet
* 将Map集合中的映射关系存入到Set集合中,
* 而这个关系的数据类型就Map.entry
*
* Mao.Entry 其实Entry也是一个接口
* 他是Map接口中的内部接口
*
* interface Map{
* public static interface Entry{
* public abstract Object getKey();
* public abstract Object getValue();
* }
* }
*
* class HashMaop implement Map{
* class Haha implement Map.entry{
*
* public Object getKey(){
* }
* public Object getValue(){
*
* }
* }
* }
* */
public static void main(String[] args) {
Map m=new HashMap();
System.out.println(m.put("01", "zs1"));
System.out.println(m.put("01", "qqqzss1"));
m.put("02", "zs2");
m.put("03", "zs3");
//先或Map集合 的所有键 存在的集合
Set s=m.keySet();
for (Iterator iterator = s.iterator(); iterator.hasNext();) {
String string = iterator.next();
System.out.print("key:"+string);
System.out.println("-->value:"+m.get(string));
}
//将Map集合的映射关系取出。放在Set集合中
Set> sm=m.entrySet();
for (Iterator> iterator = sm.iterator(); iterator.hasNext();) {
Map.Entry entry = iterator.next();
String key=entry.getKey();
String value=entry.getValue();
System.out.println("key:"+key+"==value:"+value);
}
}
}
3将自定义对象存入Map值,用地址作为键。相同姓名年龄视为同一元素package day16Map;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
public class MapTest {
/*
* 每一个学生都有对应的归属地。
* 学生Student,地址String。
* 学生属性:姓名,年龄。
* 注意:姓名和年龄相同的视为同一个学生。
* 保证学生的唯一性。
* 1:定义学生类
* 2:定义Map 学生为键,地址为值 存入Map
* 3;获取Map中的元素
*/
public static void main(String[] args) {
System.out.println("------------------Map HashMap----------");
Map m=new HashMap();
sop(m.put( new Student("a",4, "山东"),"山东"));
sop(m.put( new Student("b",2, "北京"),"北京"));
sop(m.put( new Student("c",3, "上海"),"上海" ));
sop(m.put( new Student("d",3, "上海"),"上海" ));
sop(m.put( new Student("c",3, "上海"),"上海"));
//第一种 Map keySet方法
Set s=m.keySet();
for (Iterator iterator = s.iterator(); iterator.hasNext();) {
Student student = iterator.next();
System.out.println(student.toString());
}
//第 2 种 Map entrySet方法
System.out.println("----------- Map entrySet-------------");
Set> sme=m.entrySet();
for (Iterator> iterator = sme.iterator(); iterator.hasNext();) {
Map.Entry entry =iterator.next();
System.out.print("getKey:"+entry.getKey());
System.out.println("->getValue:"+entry.getValue());
}
System.out.println("------------------Set TreeSet----------");
Set set=new TreeSet();
sop(set.add( new Student("a",4, "山东") ));
sop(set.add( new Student("b",2, "北京") ));
sop(set.add( new Student("c",3, "上海") ));
sop(set.add( new Student("d",3, "上海") ));
sop(set.add( new Student("c",3, "上海") ));
for (Iterator iterator =set.iterator(); iterator.hasNext();) {
Student student = iterator.next();
System.out.println(student);
}
}
static void sop(Object o){
System.out.println(o);
}
}
class Student implements Comparable{
private String name;
private int age;
private String address;
public Student( String name,int age,String address) {
this.name=name;
this.age=age;
this.address=address;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getAddress() {
return address;
}
public boolean equals(Object obj){
if(!(obj instanceof Student)){
throw new RuntimeException("不是Student");
}
Student s=(Student) obj;
return (this.name.equals(s.getName())&&this.age==s.getAge());
}
public int hashCode(){
return name.hashCode()+address.hashCode()+age;
}
public String toString(){
return ("name:"+name+"; age"+age+"; address"+address);
}
public int compareTo(Student o) {
int num=new Integer(this.age).compareTo(new Integer(o.age));
if(num==0)
return this.name.compareTo(o.name);
return num;
}
}
4对学生对的年龄进行升序排序:创建比较器
package day16Map;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class MapTest2 {
/*
* 需求:对学生对的年龄进行升序排序
*
* 以为数据时以键值对的形式存在的
* 所以要使用可以排序的Map 集合 :TreeMap*/
public static void main(String[] args) {
TreeMap m=new TreeMap(new ComSutentByName());
sop(m.put( new Student("a",4, "山东"),"山东"));
sop(m.put( new Student("b",2, "北京"),"北京"));
sop(m.put( new Student("c",3, "上海"),"上海" ));
sop(m.put( new Student("d",3, "上海"),"上海" ));
sop(m.put( new Student("c",3, "上海"),"上海"));
Set> s=m.entrySet();
for (Iterator> iterator = s.iterator(); iterator.hasNext();) {
Map.Entry entry = iterator.next();
System.out.print("getKey:"+entry.getKey());
System.out.println("getValue:"+entry.getValue());
}
}
static void sop(Object o){
System.out.println(o);
}
}
class ComSutentByName implements Comparator{
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());
}
}
5获取该字符串中字母出现的次数
package day16Map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class MapDemo3 {
/*
* Map 扩展知识
* map集合被使用时因为具有映射关系
*
* "yureban" Student("01" "zhangsan");
* "yureban" Student("02" "lisi");
* "jiuyeban" "01" "wangwu";
* "jiuyeban" "02" "zhaoliu";
* */
public static void main(String[] args) {
HashMap hmyr=new HashMap();
hmyr.put("01", "zhangsan");
hmyr.put("02", "lisi");
HashMap hmjy=new HashMap();
hmjy.put("01", "zhaoliu");
hmjy.put("02", "wangwu");
HashMap> chuanzhi=new HashMap>();
chuanzhi.put("yure", hmyr);
chuanzhi.put("jiuye", hmjy);
Set s=chuanzhi.keySet();
for (Iterator iterator = s.iterator(); iterator.hasNext();) {
String type = iterator.next();
HashMap h=chuanzhi.get(type);
getBan(h);
}
System.out.println("------------demo-------------");
demo(hmjy);
}
static void getBan(HashMap h){
Set banSet=h.keySet();
for (Iterator iterator2 = banSet.iterator(); iterator2.hasNext();) {
String string = iterator2.next();
System.out.println("id:"+string+"name:"+h.get(string));
}
}
static void demo(HashMap h){
HashMap> chuanzhi=new HashMap>();
List yureList=new ArrayList();
List jiuyeList=new ArrayList();
yureList.add(new Student("a",1,"beijing"));
yureList.add(new Student("b",2,"beijing"));
jiuyeList.add(new Student("c",3,"beijing"));
jiuyeList.add(new Student("c",3,"beijing"));
getBanList(yureList);
getBanList(jiuyeList);
}
static void getBanList(List h){
for (Iterator iterator2 = h.iterator(); iterator2.hasNext();) {
Student string = iterator2.next();
System.out.println("name:"+string.getName()+"age:"+string.getAge());
}
}
}
《黑马程序员 java 基础 毕向东 面向对象 集合框架 Map HashTable HashMap TreeMap》