黑马程序员——集合——Map集合
2015-08-27 00:25
447 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------
一.Map集合
1.Map集合存储的是键值对元素。键是唯一的,值可以重复。
2.Map和Collection的区别?
A:Map是双列集合,存储的元素键值对,键唯一,值可以重复。
B:Collection是单列集合,存储的元素是单一的,
List集合可以重复,Set集合元素唯一。
3.Map集合的功能
A:添加功能
V put(K key,V value)
B:删除功能
remove(K key)
C:判断功能
判断键 containsKey(K key)
判断值 containsValue(V value)
D:获取功能
通过键获取值
V get(K key)
获取键的Set集合
Set<K> keySet()
获取所有值的集合
Collection<V> values()
获取键值对对象集合
Set<Map.Entry<K,V>> entrySet()
通过键值对对象获取键,获取值
Map.Entry:
getKey
getValue
E:长度功能
int size()
4.Map集合的数据结构
Map集合的数据结构对键有效,跟值无关。
它的底层数据结构和Set相同。
情况一:
底层数据结构是哈希表,哈希表依赖于哈希值。
最终通过重写两个方法hashCode(),equals()保证元素的唯一性。
比较顺序:
先比较hashCode()值:
结果为true:
后使用equals()方法判断:
true:说明元素重复。不添加。
false:说明元素不重复,添加。
结果为false:
就直接添加到集合。
情况二:
如果是二叉树结构,就有两种方式:Comparable,Comparator
根据返回值是否是0保证元素的唯一性.
元素的排序:
A:自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
在类中重写compareTo(T t)方法
B:比较器排序(集合具备比较性)
在创建集合对象的时候,传递Comparator接口的子类对象
Comparator接口的子类重写compare(T t1,T t2)方法
5.Map的遍历方式
有一个HashMap集合hm,存储的键和值都是String类型.
方式一:根据键找值
a:获取所有键的集合
b:遍历键的集合,获取到每一个键
c:根据键找值
代码:
方式二:根据键值对对象找键和值
a:获取所有键值对对象的集合
b:遍历键值对对象的集合,获取到每一个键值对对象
c:根据键值对对象获取键和值
代码:
6.案例
A:统计一个字符串中每个字符出现的次数
B:Map集合的嵌套存储和遍历
7.Map集合的体系
Map
|--HashMap
|--LinkedHashMap
|--Hashtable
|--TreeMap
A:HashMap和Hashtable的区别?
Hashtable:底层是哈希表数据结构,是线程同步的。不可以存储null键,null值。
HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable.
B:LinkedHashMap的键的特点?
LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
-------
一.Map集合
1.Map集合存储的是键值对元素。键是唯一的,值可以重复。
2.Map和Collection的区别?
A:Map是双列集合,存储的元素键值对,键唯一,值可以重复。
B:Collection是单列集合,存储的元素是单一的,
List集合可以重复,Set集合元素唯一。
3.Map集合的功能
A:添加功能
V put(K key,V value)
B:删除功能
remove(K key)
C:判断功能
判断键 containsKey(K key)
判断值 containsValue(V value)
D:获取功能
通过键获取值
V get(K key)
获取键的Set集合
Set<K> keySet()
获取所有值的集合
Collection<V> values()
获取键值对对象集合
Set<Map.Entry<K,V>> entrySet()
通过键值对对象获取键,获取值
Map.Entry:
getKey
getValue
E:长度功能
int size()
4.Map集合的数据结构
Map集合的数据结构对键有效,跟值无关。
它的底层数据结构和Set相同。
情况一:
底层数据结构是哈希表,哈希表依赖于哈希值。
最终通过重写两个方法hashCode(),equals()保证元素的唯一性。
比较顺序:
先比较hashCode()值:
结果为true:
后使用equals()方法判断:
true:说明元素重复。不添加。
false:说明元素不重复,添加。
结果为false:
就直接添加到集合。
情况二:
如果是二叉树结构,就有两种方式:Comparable,Comparator
根据返回值是否是0保证元素的唯一性.
元素的排序:
A:自然排序(元素具备比较性)
让元素所属的类实现Comparable接口
在类中重写compareTo(T t)方法
B:比较器排序(集合具备比较性)
在创建集合对象的时候,传递Comparator接口的子类对象
Comparator接口的子类重写compare(T t1,T t2)方法
5.Map的遍历方式
有一个HashMap集合hm,存储的键和值都是String类型.
方式一:根据键找值
a:获取所有键的集合
b:遍历键的集合,获取到每一个键
c:根据键找值
代码:
Set<String> set = hm.keySet(); for(String key : set) { String value = hm.get(key); System.out.println(key+"---"+value); }
方式二:根据键值对对象找键和值
a:获取所有键值对对象的集合
b:遍历键值对对象的集合,获取到每一个键值对对象
c:根据键值对对象获取键和值
代码:
Set<Map.Entry<String,String>> set = hm.entrySet(); for(Map.Entry<String,String> me : set) { String key = me.getKey(); String value = me.getValue(); System.out.println(key+"---"+value); }
6.案例
A:统计一个字符串中每个字符出现的次数
package cn.itcast2; import java.util.Set; import java.util.TreeMap; /** * "aabcbdeeeeedbddcc"获取字符串中每一个字母出现的次数。要求结果:a(2)b(3)c(3)d(4)e(5) */ public class Test5 { public static void main(String[] args) { // 看到题目最后的排序有顺序,并且一一对应,使用TreeMap集合 // 定义字符串 String s = "aabcbdeeeeedbddcc"; // 创建集合对象 TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>(); // 首先将字符串转化为字符数组 char[] charArray = s.toCharArray(); // 遍历字符数组,字符为键 for (char charKey : charArray) { // 获取键所对应的值 Integer intValue = tm.get(charKey); if (intValue == null) { tm.put(charKey, 1); } else { tm.put(charKey, intValue + 1); } } // 定义字符串缓冲区 StringBuilder sb = new StringBuilder(); // 遍历集合 // 获取键的集合 Set<Character> keySet = tm.keySet(); // 遍历键的集合,获取键与键所对应的值 for (Character characterKey : keySet) { Integer value = tm.get(characterKey); sb.append(characterKey).append("(").append(value).append(")"); } // 输出结果 String string = sb.toString(); System.out.println(string); } }
B:Map集合的嵌套存储和遍历
package cn.itcast2; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Test4 { /** * 使用集合进行以下分类: 北京总部 -JAVAEE班:5个 -JAVASE班:8个 上海分校 -JAVAEE:4个 -JAVASE:7个 */ public static void main(String[] args) { //使用Map集合嵌套Map集合创建集合对象 Map<String, Map<String,Integer>> mm = new HashMap<String, Map<String,Integer>>(); //创建外层Map集合的元素对象1 String s1="北京总部"; // 创建内层Map集合对象 Map<String,Integer> map = new HashMap<String,Integer>(); //创建内层Map集合的元素对象并添加进集合 map.put("JAVAEE班", 5); map.put("JAVASE班", 8); //创建外层Map集合的元素对象2 String s2="上海分校"; // 创建内层Map集合对象 Map<String,Integer> map2 = new HashMap<String,Integer>(); //创建内层Map集合的元素对象并添加进集合 map2.put("JAVAEE班", 4); map2.put("JAVASE班", 7); //将外层Map集合的元素对象添加进集合 mm.put(s1, map); mm.put(s2, map2); //查看集合 System.out.println(mm); //遍历集合 //首先遍历外层Map,获取外层集合的键的集合 Set<String> outKeySet = mm.keySet(); //遍历外层键的集合 for (String outKey : outKeySet) { //通过外层键获取到其对应的值 Map<String, Integer> map3 = mm.get(outKey); //输出外层键的名称 System.out.println(outKey); //遍历内层map集合,首先获取键的集合 Set<String> inkeySet = map3.keySet(); //遍历内层键的集合 for (String inKey : inkeySet) { //通过内层键获取到其对应的值 Integer value = map3.get(inKey); //输出内层键的名称和它对应的值 System.out.println("班级名称:"+inKey+" 个数:"+value); } System.out.println(); } } }
7.Map集合的体系
Map
|--HashMap
|--LinkedHashMap
|--Hashtable
|--TreeMap
A:HashMap和Hashtable的区别?
Hashtable:底层是哈希表数据结构,是线程同步的。不可以存储null键,null值。
HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable.
B:LinkedHashMap的键的特点?
LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
相关文章推荐
- 程序员用过的座右铭
- 程序员为何对苹果 Mac 情有独钟?
- 找工作---面试3
- Java 面试题问与答:编译时与运行时
- 一次腾讯招聘的笔试和面试题
- php面试题
- 黑马程序员--Java集合框架(三)
- 程序员要想让自己的价值持续增长,有这么几个方向可供参考
- 黑马程序员——面向对象
- 程序员面试金典1.3: 确定两个字符串中一个重排后,能否变成另一个字符串
- 黑马程序员--Java集合框架(二)
- 经典面试资料大全(持续更新中............)
- 腾讯面试中最易被刷的几种表现求解答
- 面试题:查询第二高的收入
- 2014腾讯、百度、阿里面试经验
- 百度面试
- 面试题之位运算的巧妙应用
- 有理想的程序员必须知道的15件事
- 面试题:查询所有的客户记录
- 腾讯社招面试经历