黑马程序员_温习 集合五 (个人笔记)摘要(Map集合体系---Hashtable集合---HashMap集合----TreeMap集合)

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


摘要(Map集合体系---Hashtable集合---HashMap集合----TreeMap集合)



Map集合体系:该集合存储键值对,属于双列接口(Collection属于单列)


|--Hashtable集合:底层哈希表,不可存null键null值,同步,JDK1.0出现,低效不常用


|--HashMap集合:底层哈希表,可以使用null键null值,不同步,JDK1.2出现,常用


|--TreeMap集合:底层二叉树,可以使用null键null值,不同步,可用于给Map集合中"键"排序
(和Set集合很像,其实Set集合底层就是使用Map集合)


接口Map<K.V> :K = Key(键)
 V = Value(值)
 (键是唯一的,一个键只能对应一个值。)


Map集合体系的公共方法(常用的)
|--添加
|--一个键值对:(上一个值) put(K 键, V 值) 
|--一个map集合:void putAll(Map<? extends K,? extends V> m)


|--删除
|--删除所有:void clear()
|--删除一个键所对应的关系:(值) remove(Object key) 


|--判断
|--键有没有值:boolean containsKey(Object key)
|--值有无键指向:boolean containsValue(Object value) 
|--集合是否有元素:boolean isEmpty()


|--获取:
|--获取键对应的值:(值) get(Object key)//若无则返回null
|--获取长度:int size()
|--获取所有值:Collection<v> values()
|--获取所有键:Set<k> keySet()
|--获取所有键值关系:Set<Map.Entry<K,V>> entrySet()


HashMap:判断"键"唯一性跟HashSet一样,先判断"键"的HashCode值 再判断 equals


TreeMap:判断"键"唯一性跟TreeSet一样,要吗"键"自带,要么比较器


例:演示


class MapDemo
{
public static void main(String[] args)
{
Map<String,Integer> map = new HashMap<String,Integer>();//键HashMap 演示 MAP集合公用方法
map.put("01",100);//加一个键值对  返回null 因为"01"上一个值位空
map.put("01",50); //加一个键值对  返回100 因为"01"上一个值是100,此时"01"值为50
map.put("03",20);
map.containsKey("02");//判断元素键有没有值 false
map.get("01");//获取键所对应的的值50
Collection<String> coll = map.values();//[50,20]
}
}


KeySet方法应用:取出Map集合所有的键,存入Set集合中,因为Set集合可用迭代器,所以可以
迭代出所有键,再调用Map集合中的get()方法获取值,实现Map集合的键值对遍历


图例:将所有的键存入Set集合中




例:keySet演示


class MapDemo
{
public static void main(String[] args)
{
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("01",100);
map.put("02",50); 
map.put("03",20);
// Set<String> s = m.keySet();//先将键存入Set集合中
// Iterator<String> it = s.iterator();//再让迭代器指向Set集合


Iterator<String> it = map.keySet.iterator();//上边两句简写成一句
while (it.hasNext())//遍历Set 相当于遍历 键
{
String s = it.next();//记录每一个遍历的键
Integer in = map.get(s);//调用Map集合的get方法,获取键所对应的的值,实现键值对遍历
System.out.println(s+"----"+in);
}


}


}




entrySet方法应用:将键值对关系存入Set<Map.Entry<K,V>>中
 键值对关系是什么类型呢,就是Set<Map.Entry<K,V>>类型,故存入之


Map.entry:其实Entry也是一个接口,他是Map接口中的一个内部接口
interface Map
{
public static interface Entry
{
public abstract Object getKey();
public abstract Object gerValue();
}
}


图例:将关系存入Set<Map.Entry<K,V>>中




例:entrySet演示


class MapDemo
{
public static void main(String[] args)
{
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("01",100);
map.put("02",50); 
map.put("03",20);
Iterator<Map.Entry<String,Integer>> it = map.entrySet().iterator();//两句合一句,将关系存入Set<Map.Entry<String,Integer>>中,在让
while (it.hasNext()) //迭代器指向Set集合
{
Map.Entry<String,Integer> mm = it.next();//将关系存入特殊容器Map.Entry<String,Integer>中
String s = mm.getKey(); //获取键
Integer in = mm.getValue(); //获取值
System.out.println(s+"===="+in);
}
}


}


练习:获取某段字符串中,每个字母出现的次数,要求按a(1)c(2)格式输出
摘要一:用TreeMap集合存储数组,以为存在对应关系,而且自然排序符合输出要求
摘要二:建一个计数器初始化为0,判断,若键对应的值为空,则自加一次,因为键已经出现了一次
若不为空,则将值赋予计数器,然后再自加一次,因为出现次数存在值里,取出后应加一次,因为键
又出现了一次
没循环一次 计数器清零一次


import java.util.*;


class Demo2
{
public static void main(String[] args)
{
String s1 = "adfceqb";
text(s1);
}
public static void text(String s)
{
char[] ch = s.toCharArray();//字符串转字符数组
TreeMap<Character,Integer> t = new TreeMap<Character,Integer>();//字符数组当键存入TreeMap集合中
int temp = 0; //建立计数器
for(int x=0 ;x<ch.length;x++)
{
Integer y = t.get(ch[x]);//将每个字符对应的值(次数,目前都是null)记录
if(y!=null)//如果值不为空
temp = y; //将目前的次数传给计数器
temp++;//计数器自加一次,若值为空,也自加一次,因为键出现了一次
t.put(ch[x],temp);//将键和值存入集合中
temp=0;//每次循环后计数器清零,否则这次的值会进入下一次判断循环,导致错误结果
}
Iterator<Map.Entry<Character,Integer>> it = t.entrySet().iterator();//循环完毕后,用entrySet方法遍历输出
while (it.hasNext())
{
Map.Entry<Character,Integer> m = it.next();
Character x = m.getKey();
Integer y = m.getValue();
System.out.print(x+"("+y+")");//打印成,要求的输出格式
}

}


}




练习:(一对多嵌套映射) 传智播客
|--预热班
|--学号,学生
|--就业班
|--学号,学生


摘要一:其实嵌套映射就是键值对中件键或值 还是一个Map集合,即还是键值对
如TreeMap<String,TreeMap<String,person>> 值是一个TreeMap他里边还有对应关系
取出时,要循环中嵌套循环,类似于递归。



import java.util.*;


class Demo2
{
public static void main(String[] args)
{
TreeMap<String,TreeMap<String,person>> czbk = new TreeMap<String,TreeMap<String,person>>();//最外层集合
TreeMap<String,person> yure = new TreeMap<String,person>();//内层集合
TreeMap<String,person> jiuye = new TreeMap<String,person>();//内层集合
czbk.put("yure",yure);//加入键值对,值是另一个键值对
czbk.put("jiuye",jiuye);
yure.put("01",new person("zhang",27));//建立键值对,这个集合自身就是外层集合的值
yure.put("02",new person("li",27));
jiuye.put("01",new person("zhang",25));//建立键值对,这个集合自身就是外层集合的值
jiuye.put("02",new person("long",30));


getpaixu(czbk);//调用取出方法
}
public static void getpaixu(TreeMap<String,TreeMap<String,person>> t)//嵌套循环(递归)方法之一
{
for(Iterator<String> it = t.keySet().iterator();it.hasNext();)//用keySet集合遍历最外层集合
{
String s = it.next();
TreeMap<String,person> tt = t.get(s);
System.out.print(s+"==");
getperson(tt);//因为值是另一个键值对,故 在建一个keySet循环遍历其键值对 (递归)
}                  //循环可以写成嵌套,也可以写成调用,这个是调用
}
public static void getperson(TreeMap<String,person> trr)
{
for(Iterator<String> it = trr.keySet().iterator();it.hasNext();)//用keySet遍历内层键值对
{
String s = it.next();
person p = trr.get(s);
System.out.println(s+"----"+p);
}
}
}


class person implements Comparable<person>//person类的模板类,因为不确定存入什么集合故集合需要的
{                                        //比较唯一性的方法都要复写一共三个 HashCode   equals  Comparable
private String name;
private int age;
person(String name,int age)
{
this.name = name;
this.age = age;
}
public int compareTo(person s) //复写自然比较方法
{
int x = this.name.compareTo(s.name);
if(x==0)
return new Integer(this.age).compareTo(new Integer(s.age));
return x;
}
public int hashCode() //复写哈希比较
{
return this.name.hashCode()+this.age*39;
}
public boolean equals(Object obj) //复写equals比较
{
if(!(obj instanceof person))
throw new RuntimeException("类型有误");
person p = (person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String getname()
{
return name;
}
public int getage()
{
return age;
}

}


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值