黑马程序员——Map集合
来源:互联网 发布:mac windows 共享文件 编辑:程序博客网 时间:2024/05/22 03:51
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
1、Map
(1)Map是一个键值对形式的集合;键和值必须成对出现。
最大优点:体现对应关系(一一对应关系)
(2)Map的功能:
注意:Map集合中的具体实现类的数据结构,针对的是键。
A:增加功能。
V put(K key, V value)
向集合中添加键值对
如果该键存在,则返回被替换的值
如果该键不存在则直接添加返回null
B:删除功能。
void clear()
清空集合中所有数据
V remove( Object key )
根据键删除键值对元素
C:判断功能。
boolean containsKey( Object key )
判断集合中是否包含指定的键
boolean containsValue( Object value )
判断集合中是否包含指定的值
boolean isEmpty()
判断集合是否为空
D:获取功能。
Set<Map.Entry<K,V>> entrySet()
获取键值对儿对象的集合
Object get( Object key )
根据键获取值
Set<K> keySet():
获取集合中所有键的Set集合
Collection<V> values()
获取集合中所有值的集合
E:长度功能。
int size()
获取集合的长度
(3)Map的两种遍历方式
A:丈夫找妻子
a:把所有丈夫给集合起来。Set<K> ketSet()
b:遍历丈夫集合,获取到每一个丈夫。增强for , 迭代器
c:让丈夫去找妻子。get(Object key)
B:根据结婚证找丈夫和妻子
a:获取所有结婚证的集合。Set<> entrySet()
b:遍历结婚证集合,获取到每一个结婚证对象。迭代器,增强for
c:通过结婚证对象获取丈夫和妻子getKey()和getValue()
2、HashMap
HashMap自定义对象当做键 ,为什么要重写 hashCode()方法和equals()方法?
因为如果用自定义对象当做键的话,要保持元素的唯一性(因为键是唯一的) ,HashMap 通过名字可以看出他是 哈希结构,所以如果想要保持元素的唯一性需要重写这两个方法.
案例:
package com.map;
//学生类 public class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Student(String name, int age) {super();this.name = name;this.age = age;}public Student() {super();}
//重写hashCode()方法@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}
//重写 equals 方法@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}
package com.map;import java.util.HashMap;import java.util.Set;
public class HashMapStu {public static void main(String[] args) {HashMap<Student, String> hm = new HashMap<Student, String>();
//添加学生hm.put(new Student("宿命", 24), "001");hm.put(new Student("王林", 34), "002");hm.put(new Student("王林", 32), "002");hm.put(new Student("孟浩", 18), "003");hm.put(new Student("孟浩", 18), "003");
//遍历学生Set<Student> set = hm.keySet();for(Student stu :set){System.out.println(hm.get(stu)+" "+stu.getName()+"-->"+stu.getAge());}}}
3、TreeMap
TreeMap自定义对象做键,需要做以下两个操作之一:
实现排序方式一:让对象所属的类去实现Comparable接口
实现排序方式二:用TreeMap的带参构造,在参数位置接收 Comparator 接口对象.
案例:便利、排序、去重自定义对象
package com.map;import java.util.Comparator;import java.util.Hashtable;import java.util.Set;import java.util.TreeMap;/* * 创建一个TreeMap,存储5对元素,,字符串做为键,Student做为值.然后遍历集合. * 用自定义对象做键,String做值 */public class TreeMapTest {/** * @param args */public static void main(String[] args) {TreeMap<Student, String> tm = new TreeMap<Student, String>(new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {// 按照年龄排序int num = s1.getAge() - s2.getAge();// 年龄同 ,比姓名int num2 = (num == 0) ? (s1.getName().compareTo(s2.getName())) : num;return num2;}});tm.put(new Student("宿命", 24), "001");tm.put(new Student("王林", 34), "002");tm.put(new Student("王林", 32), "002");tm.put(new Student("孟浩", 18), "003");tm.put(new Student("孟浩", 18), "003");Set<Student> set = tm.keySet();for (Student stu : set) {String name = stu.getName();int age = stu.getAge();String value = tm.get(stu);System.out.println(name + " " + age + " " + value);}Hashtable<String,String> hh = new Hashtable<String, String>();System.out.println(hh);}}
4、Map和Collection的区别?(面试题)
A:Map 是由键值对组成的集合,Map的键(key)是唯一的,值(value)可以重复。
B:Collection 是有单列数据组成的集合,它的儿子List是可以重复的,Set是唯一的。
5、HashMap和Hashtable的区别?(面试题)
HashMap:线程不安全,效率高。允许null键和值。
Hashtable:线程安全,效率低。不允许null键和值。
4:案例
(1)统计字符串中每个字符出现的次数。
package com.map;import java.util.HashMap;import java.util.Set;/* * 有一个字符串: "cbxzbvavdvgd" * 要求获取字符串中,每一个字母出现次数: * "a(1)b(2)c(1)d(2)g(1)v(3)x(1)z(1)" */public class TotalCharNum {public static void main(String[] args) {String str = "cbxzbvavdvgd";// 把字符串转换为字符数组char[] chs = str.toCharArray();// 定义TreeMap 集合HashMap<Character, Integer> tm = new HashMap<Character, Integer>();// 遍历字符数组,获取每个字符,并判断TreeMap 集合中是否存在for (char ch : chs) {boolean flag = tm.containsKey(ch);if (flag == false) {tm.put(ch, 1);} else {tm.put(ch, tm.get(ch) + 1);}}StringBuffer sb = new StringBuffer();Set<Character> set = tm.keySet();for (Character ch : set) {sb.append(ch).append("(").append(tm.get(ch)).append(")");}String st = sb.toString();System.out.println(st);}}
(2)HashMap嵌套HashMap的使用。
package com.map;import java.util.HashMap;import java.util.Set;//HashMap嵌套HashMap的使用/* * hm : bj jcb * jyb * * jcb 001 xiaoming * 002 xiaohong * jyb 001 hh * 002 oo */public class HashMapAndHashMap {/** * @param args */public static void main(String[] args) {// 创建hm集合HashMap<String, HashMap<String, String>> hm = new HashMap<String, HashMap<String, String>>();// jcb 集合HashMap<String, String> jcb = new HashMap<String, String>();jcb.put("001", "xiaoming");jcb.put("002", "xiaohong");// jyb 集合HashMap<String, String> jyb = new HashMap<String, String>();jyb.put("001", "dabai");jyb.put("002", "xiaobai");// hm 集合添加元素hm.put("jcb", jcb);hm.put("jyb", jyb);// System.out.println(hm);// 遍历Set<String> bjs = hm.keySet();for (String bj : bjs) {HashMap<String, String> banJi = hm.get(bj);System.out.println(bj);Set<String> xh = banJi.keySet();for (String xs : xh) {String name = banJi.get(xs);System.out.println(xs + "-->" + name);}}}}
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
- 黑马程序员—Map集合
- 黑马程序员—Map集合
- 黑马程序员_08集合——Map
- 黑马程序员——Map集合
- 黑马程序员——Map集合
- 黑马程序员——MAP集合#
- 黑马程序员——Map集合
- 黑马程序员——集合框架Map
- 黑马程序员——集合-泛型;Map
- 黑马程序员——Map集合总结
- 黑马程序员——泛型、Map集合
- 黑马程序员——Map集合
- 黑马程序员——Map集合
- 黑马程序员——Map集合
- 黑马程序员——Map集合
- 黑马程序员——泛型,Map集合
- 黑马程序员——Java Map集合
- 黑马程序员——Map集合
- HDU 5375 DP
- BOM基础
- Redis底层数据结构总结
- HtmlParser初探--使用Nodefilter和Visitor进行网页分析
- WindowManager.LayoutParams.type属性
- 黑马程序员——Map集合
- stdafx.h的作用体会
- Install JDK8 on Ubuntu
- 快学scala中嵌套类的介绍
- android使用自定义控件 IconTabPageIndicator时抛出java.lang.IllegalStateException的解决办法
- constants 常量值的使用
- 开源中国源码学习(七)——DrawerLayout使用
- C# 创建自定义集合编辑器/自定义集合属性
- RPG2.0战斗框架学习4之技能释放过程