黑马程序员——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、MapCollection的区别?(面试题)

    A:Map 是由键值对组成的集合,Map的键(key)是唯一的,(value)可以重复。

    B:Collection 是有单列数据组成的集合,它的儿子List是可以重复的,Set是唯一的。

 

5、HashMapHashtable的区别?(面试题)

    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>、期待与您交流! ----------


0 0