黑马程序员---Java基础---Map集合
来源:互联网 发布:淘宝运营策划方案 编辑:程序博客网 时间:2024/05/17 01:21
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一.Map集合
1.什么是Map集合
Map集合用来存储键值对, 每次存储2个对象, 一个键一个值, 可以根据键查找值, 键必须唯一.
2.Map集合常用方法
Vput(K key, V value)
存储一个键值对, 如果键在集合中存在, 值将会覆盖原有值, 并且返回原有值.
Vget(Object key)
根据键获取值, 如果不存在, 返回null
Vremove(Object key)
根据键删除值, 并将值返回, 如果不存在, 返回null
booleancontainsKey(Object key)
判断指定的键对象是否存在
package cn.itcast.day18.map;import java.util.Collection;import java.util.HashMap;import java.util.Map;public class MapDemo {public static void main(String[] args) {//demo1();//demo2();//demo3();//demo4();//demo5();//demo6();//demo7();//demo8();}private static void demo8() {Map<String, Integer> map = new HashMap<String, Integer>();map.put("张三", 80);map.put("李四", 85);map.put("王五", 80);map.put("赵六", 90);Collection<Integer> c = map.values();// 获取Map中所有值组成的集合for (Integer i : c) System.out.println(i);// 打印每一个值}private static void demo7() {Map<String, Integer> map1 = new HashMap<String, Integer>();System.out.println(map1.put("张三", 81));// 如果键不存在, 存储之后返回nullSystem.out.println(map1.put("李四", 82));System.out.println(map1.put("王五", 83));System.out.println(map1.put("张三", 90));// 如果键存在, 将原有的值返回}private static void demo6() {Map<String, Integer> map1 = new HashMap<String, Integer>();map1.put("张三", 81);map1.put("李四", 82);map1.put("王五", 83);System.out.println(map1);System.out.println(map1.remove("张三"));// 删除键为张三的记录, 并且返回张三的值, 81System.out.println(map1.remove("赵六"));// 删除键为赵六的记录, 不存在, 返回nullSystem.out.println(map1);}private static void demo5() {Map<String, Integer> map1 = new HashMap<String, Integer>();map1.put("张三", 81);map1.put("李四", 82);map1.put("王五", 83);Map<String, Integer> map2 = new HashMap<String, Integer>();map2.put("李四", 91);map2.put("王五", 92);map2.put("赵六", 93);map1.putAll(map2);// 把map2中的所有元素装入map1System.out.println(map1);}private static void demo4() {Map<String, Integer> map = new HashMap<String, Integer>();map.put("张三", 80);map.put("李四", 85);map.put("王五", 80);map.put("赵六", 90);System.out.println(map.containsValue(80));System.out.println(map.containsValue(81));System.out.println(map.containsValue(82));System.out.println(map.containsValue(83));System.out.println(map.containsValue(84));System.out.println(map.containsValue(85));}private static void demo3() {Map<String, Integer> map = new HashMap<String, Integer>();map.put("张三", 80);map.put("李四", 85);map.put("王五", 80);map.put("赵六", 90);System.out.println(map.containsKey("张三"));System.out.println(map.containsKey("李四"));System.out.println(map.containsKey("王五"));System.out.println(map.containsKey("赵六"));System.out.println(map.containsKey("王二麻子"));}private static void demo2() {Map<String, Integer> map = new HashMap<String, Integer>();map.put("张三", 80);map.put("李四", 85);map.put("王五", 80);map.put("赵六", 90);System.out.println(map);map.clear();System.out.println(map.isEmpty());System.out.println(map.size());System.out.println(map);}private static void demo1() {Map<String, Integer> map = new HashMap<String, Integer>();map.put("张三", 80);// 存储键值对map.put("李四", 85);map.put("王五", 80);map.put("赵六", 90);map.put("赵六", 95);// 如果键重复, 后来的值覆盖原有值System.out.println(map.get("张三"));// 根据键获取值System.out.println(map.get("李四"));System.out.println(map.get("王五"));System.out.println(map.get("赵六"));System.out.println(map);// 打印map的toString(), 内部会将所有的键和值连接在一起}}
3.Map集合的遍历
keySet:
Map集合的keySet()方法可以得到一个所有键对象组成的Set集合
遍历这个Set集合可以得到每一个键对象
再根据键对象即可获取值
entrySet:
Map集合的entrySet()方法可以得到一个所有Entry对象(键值对)组成的Set集合
遍历这个Set集合可以得到每一个Entry对象
再使用Entry的getKey()方法和getValue()方法获取键和值
package cn.itcast.day18.map;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import java.util.Set;public class MapIterateDemo {public static void main(String[] args) {Map<String, Integer> map = new HashMap<String, Integer>();map.put("张三", 80);map.put("李四", 85);map.put("王五", 80);map.put("赵六", 90);//iterate1(map);//iterate2(map);}private static void iterate2(Map<String, Integer> map) {Set<Entry<String, Integer>> set = map.entrySet();// Map集合的entrySet()方法可以得到一个所有Entry对象(键值对)组成的Set集合for (Entry<String, Integer> e : set)// 遍历这个Set集合可以得到每一个Entry对象System.out.println(e.getKey() + ": " + e.getValue());// 再使用Entry的getKey()方法和getValue()方法获取键和值}private static void iterate1(Map<String, Integer> map) {Set<String> set = map.keySet();// Map集合的keySet()方法可以得到一个所有键对象组成的Set集合for (String key : set)<span style="white-space:pre"></span>// 遍历这个Set集合可以得到每一个键对象System.out.println(key + ": " + map.get(key));// 根据键对象即可获取值}}
4.Map集合的常用实现类
HashMap: 使用哈希算法对键对象去重复
* HashMap存储一个键值对的时候, 先会调用键对象的hashCode()方法得到哈希值
* 然后在集合中查找是否有哈希值相同的键对象
* 如果没有哈希值相同的键对象,直接将键值对存入
* 如果有哈希值相同的键对象,逐个和这些键对象进行equals()方法比较
* 比较的结果为false就将键值对存入
* 比较的结果为true则用新的值覆盖原有值
* HashMap在根据指定的键对象获取值的时候, 先对键对象调用hashCode()方法, 得到哈希值
* 然后在集合中查找哈希值相同的对象, 逐个equals()方法比较
* 找到equals()结果为true的键值对, 将值返回
TreeMap: 使用二叉树算法对键对象排序
* TreeMap在存储键值对的时候, 会调用键对象的compareTo()方法和集合中其他的键对象进行比较, 根据比较结果以二叉树形式存储
* 如果TreeMap创建的时候在构造函数中传入了比较器, 那么存储顺序以比较器为准
LinkedHashMap: HashMap的子类, 去重复的同时保留存储顺序
Hashtable: 和HashMap原理相同, 都是使用哈希算法去重复. 线程安全, 效率略低. 键和值都不允许为null
Properties: 键和值都是String, 用来存储一些配置项
二.练习
1.定义一个函数, 函数中接收一个String, 统计每个字符出现的次数
package cn.itcast.day19.review;import java.util.Comparator;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import java.util.TreeSet;/* * 定义一个函数, 函数中接收一个String, 统计每个字符出现的次数 */public class Exercise5 {public static void main(String[] args) {countTimes1("bbcddddaaa");// {b=2, c=1, d=4, a=3}<span style="white-space:pre"></span>countTimes2("bbcddddaaa");// {c=1, b=2, a=3, d=4}}public static void countTimes1(String s) {Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();// 创建一个Map<Character, Integer>, 用来存储字符和次数char[] arr = s.toCharArray();<span style="white-space:pre"></span>// 将字符串转为字符数组for (char c : arr) {// 循环遍历每个字符if (map.containsKey(c)){// 判断Map中是否包含这个字符map.put(c, map.get(c) + 1);// 如果包含, 将以前的次数获取出来, 加1, 再覆盖} else { map.put(c, 1);// 如果不包含, 将字符存入, 次数存1}}System.out.println(map);// 打印Map中存的结果}private static void countTimes2(String s) {Map<Character, Integer> map = new HashMap<Character, Integer>();for (char c : s.toCharArray()) map.put(c, map.containsKey(c) ? map.get(c) + 1 : 1);// 以上的操作统计出了每个字符出现的次数, 但是没有顺序, 只要将这些结果排序即可Set<Entry<Character, Integer>> entrySet = map.entrySet();<span style="white-space:pre"></span>// 获取出map集合中的所有EntryTreeSet<Entry<Character, Integer>> treeSet = new TreeSet<Entry<Character,Integer>>(new EntryComparator());// 创建TreeSet用来排序treeSet.addAll(entrySet);// 将entrySet中的键值对都装入treeSet, 排序System.out.println(treeSet);<span style="white-space:pre"></span>// 打印结果}}class EntryComparator implements Comparator<Entry<Character, Integer>> {public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) {int gap = o1.getValue() - o2.getValue();// 值的比较结果return gap != 0 ? gap : o1.getKey() - o2.getKey();// 如果值不一样, 按照值排序, 值一样的话按照键排序}}2.从键盘接收3个学生的考试成绩, 对其按照总分排序, 输出到屏幕
package cn.itcast.day18.exercise;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.TreeSet;/*从键盘接收3个学生的考试成绩, 对其按照总分排序, 输出到屏幕. 考试成绩输入格式:张三,80,85,80李四,70,70,80王五,90,90,90屏幕输出格式:王五,90,90,90,270张三,80,85,80,245李四,70,70,80,220*/public class Exercise4 {public static void main(String[] args) throws Exception {System.out.println("请输入学生成绩:");BufferedReader br = new BufferedReader(new InputStreamReader(System.in));TreeSet<Student> ts = new TreeSet<Student>();<span style="white-space:pre"></span>// 定义TreeSet<Student>, 用来对学生排序for (;;) {// 定义循环String line = br.readLine();// 读取一行if (line.equals("quit"))<span style="white-space:pre"></span>// 如果读到"quit", 退出输入break;String[] arr = line.split(",");// 按逗号分割成String[]Student stu = new Student(arr[0], Integer.parseInt(arr[1]), Integer.parseInt(arr[2]),Integer.parseInt(arr[3]));ts.add(stu);// 装入TreeSet}System.out.println("考试成绩排序后的结果:");for (Student stu : ts)// 遍历TreeSetSystem.out.println(stu);// 打印Student}}class Student implements Comparable<Student> {private String name;private int chinese;private int math;private int english;private int sum;public Student(String name, int chinese, int math, int english) {this.name = name;this.chinese = chinese;this.math = math;this.english = english;this.sum = chinese + math + english;}public String toString() {return name + "," + chinese + "," + math + "," + english + "," + sum;}public int compareTo(Student o) {int i = o.sum - this.sum;return i != 0 ? i : 1;}}
三.集合总结
Conllection :单列集合,一次存一个对象
List:可重复,有索引
ArrayList: 数组实现,查找快,增删慢
LinkedList:链表实现,增删快,查找慢
boolean add(Object obj)
向集合中添加一个对象, 如果改变了集合的结构, 返回true. 集合可以添加任意类型的对象.
Object remove(int index)
删除指定索引上的元素, 并且返回这个元素
Object set(int index, Object obj)
将集合中指定位置的元素替换为指定对象
Object get(int index)
从集合中获取指定索引上的对象.
遍历:
1,增强for循环
for(类型 变量名 : 容器) { 循环体 }, 容器长度是多少循环体就执行多少次, 变量每次引用容器中的一个元素
2,迭代器
使用iterator()方法获取一个迭代器(Iterator对象), 调用hasNext()方法判断是否包含下一个元素,调用next()方法获取元素.
3,for循环
循环size()次,每次调用一个get()方法
Vector:原理和ArrayList相同,线程安全,效率较慢
Stack: 栈,先进后出
push():压入对象
pop():从最后一个开始拿出对象
Set:无重复,无索引
HashSet: 使用哈希算法,去重复,速度快,无顺序
add():向集合中添加一个对象, 如果改变了集合的结构, 返回true. 集合可以添加任意类型的对象.
remove();
size();
LinkedHashSet: 使用哈希算法,但是可以保留存储顺序
TreeSet: 使用二叉树算法,按照制定顺序排序:自然排序、比较器
TreeSet的add方法会将对象转为Comparable,然后调用compareTo方法, 所以存储在TreeSet中的对象必须实现Comparable, 重写compareTo方法
遍历:1,迭代器
2,增强for循环
Map:一个键值对的集合,键唯一,可根据键查找值
HashMap: 使用哈希算法去重复,无顺序
put(key,value):增加键值关联(增加对象)
get(key):通过键,查找值
entrySet():返回此映射所包含的映射关系的 Set 视图。
keySet(): 返回此映射中所包含的键的Set 视图。
remove():删除
size():长度
LinkedHashMap:HashMap的子类,去重复的同时,按照存储顺序排列
Hashtable:和HashMap同原理,线程安全,效率偏低,键和值都不能为null
Properties:键值都是Stirng类型,用来存储一些配置项
TreeMap:使用二叉树算法对键值对排序
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
- 黑马程序员-java基础之Map集合
- 黑马程序员:Java基础总结----Map集合
- 黑马程序员 java基础之Map集合
- 黑马程序员java基础之Map集合
- 黑马程序员---Java基础---Map集合
- 黑马程序员 java基础--map集合总结
- 黑马程序员----------------java基础-----------------Map集合
- 黑马程序员----java基础之Map集合
- 黑马程序员-------Java基础-------集合之Map
- 黑马程序员-Java基础:集合(Map)
- 黑马程序员-java基础-Map集合
- 黑马程序员--java基础--集合框架Set,集合框架map
- 黑马程序员--Map集合基础
- 黑马程序员《java基础总结(九)》(Map集合)
- 黑马程序员——Java基础之Map集合
- 黑马程序员——JAVA基础之Map集合
- 黑马程序员 Java基础 集合框架之Map
- 黑马程序员——Java基础—集合(Map、Collections)
- 第一次写博客
- 遗传算法
- excel宏,特定文字为粗体
- Js 获取行间样式属性值 和 css 内嵌样式或样式表中属性值的方法
- 修改浏览器默认网址
- 黑马程序员---Java基础---Map集合
- Android procrank查看内存使用情况
- POJ 题目1837 Balance(分组背包)
- L - Oil Deposits HDU 1241 基础BFS
- [Fiddler] Error:Content-Length mismatch: Request Header indicated 16 bytes, but client sent 0 bytes.
- 修改应用背景(适用于SDK2.3)
- iOS开发-ios7下拉刷新,上提加载快速集成
- [PAT]1001.A+B Format (20)
- 解释器模式