您的位置:首页 > 职场人生

黑马程序员——Map集合

2015-08-12 10:04 507 查看
------- <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>、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: