Java集合框架(三)

 Map

Map集合:该集合存储键值对,一对一对的往里存,而且要保证键的唯一性。

Map

  |------HashTable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。JDK1.0,效率低。

  |------HashMap:底层是哈希表数据结构,允许使用 null值和 null键,该集合是不同步的。JDK1.2,效率高。

  |------TreeMap:底层是二叉树数据结构,线程不同步,可以给map集合中的键进行排序。

和Set很像,其实,Set底层就是使用了Map集合。

方法总结:

  1、添加

    put(K key, V value)

    putAll(Map<? extends K,? extends V> m)

  2、删除

    clear()

    remove(Object key)

  3、判断

    containsKey(Object key)

    containsValue(Object value)

    isEmpty()

  4、获取

    get(Object key)

    size()

    values()

    entrySet()

    keySet()

示例代码如下:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class MapDemo {

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();

        //添加元素
        //添加元素,如果出现添加时,相同的键,那么后添加的值会覆盖原有的键对应的值,并put()方法返回被覆盖的值。
        System.out.println("put:" + map.put("01", "zhangsan01"));//输出null
        System.out.println("put:" + map.put("01", "wangwu"));
        map.put("02", "zhangsan02");
        map.put("03", "zhangsan03");

        //System.out.println("containsKey:" + map.containsKey("022"));
        //System.out.println("remove:" + map.remove("02")) ;

        //可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断
        System.out.println("get:" + map.get("023"));

        map.put(null, "haha");//HashMap允许使用 null值和 null键
        map.put("04", null);

        System.out.println("get:" + map.get("04"));
        System.out.println("get:" + map.get(null));

        //获取集合中所有的值
        Collection<String> coll = map.values();
        System.out.println(coll);
        System.out.println(map);

     }

}

 Map集合的两种取出方式

Map集合的两种取出方式:

  1、Set<K> keySet():将map所有的键存入到Set集合,因为Set集合具备迭代器,所以可以迭代方式取出所有的键,在根据get()方法,获取每一个键对应的值。

  Map集合的取出原理:将map集合转成set集合,在通过迭代器取出。

  2、Set<Map.Entry<K,V>> entrySet():将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry。

  Map.Entry,其实Entry也是一个接口,它是Map接口中的一个内部接口。代码如下:

interface Map {
    public static interface Entry {
        public abstract Object getKey();
        public abstract Object getValue();
    }
}

class HashMap implements Map {

    class Haha implements Map.Entry {
        public Object getKey() {

        }
        public Object getValue() {

        }
    }

}

示例代码:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapDemo1 {

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();

        map.put("01", "zhangsan01");
        map.put("02", "zhangsan02");
        map.put("03", "zhangsan03");
        map.put("04", "zhangsan04");

        //将map集合中的映射关系取出,存入到set集合中
        Set<Map.Entry<String, String>> entrySet = map.entrySet();

        Iterator<Map.Entry<String, String>> it = entrySet.iterator();
        while(it.hasNext()) {
            Map.Entry<String, String> me = it.next();
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key + ":" + value);
        }
        /*
        //先获取map集合的所有的键的Set集合,keySet()
        Set<String> keySet = map.keySet();

        //有了Set集合,就可以获取其迭代器
        Iterator<String> it = keySet.iterator();
        while(it.hasNext()) {
            String key = it.next();
            //有了键就可以通过map集合的get()方法获取其对应的值
            String value = map.get(key);
            System.out.println("key:" + key + ", value = " + value);
        }
        */

    }

}

练习1:每一个学生都有对应的归属地。学生Student,地址String。学生属性:姓名,年龄。注意:姓名和年龄相同的视为同一个学生。保证学生的唯一性。

分析:

  1. 描述学生。
  2. 定义Map容器,将学生作为键,地址作为值。存入。
  3. 获取map集合中的元素。

代码如下所示:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

class Student implements Comparable<Student> {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = 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;
    }

    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Student))
            throw new ClassCastException("类型不匹配");
        Student student = (Student) obj;
        return this.name.equals(student.name) &&
                this.age == student.age;
    }

    @Override
    public int hashCode() {
        return name.hashCode() + age * 34;
    }

    public String toString() {
        return name + ":" + age;
    }

    @Override
    public int compareTo(Student s) {
        int num = new Integer(this.age).compareTo(new Integer(s.age));

        if(num == 0)
            return this.name.compareTo(s.name);

        return num;
    }
}
public class MapTest {

    public static void main(String[] args) {
        HashMap<Student, String> map = new HashMap<Student, String>();

        map.put(new Student("lisi1", 21), "beijing");
        map.put(new Student("lisi1", 21), "tianjin");
        map.put(new Student("lisi2", 22), "shanghai");
        map.put(new Student("lisi3", 23), "wuhan");
        map.put(new Student("lisi4", 24), "nanjing");

        //第一种取出方式  keySet()
        Set<Student> keySet = map.keySet();

        Iterator<Student> it = keySet.iterator();
        while(it.hasNext()) {
            Student s = it.next();
            String address = map.get(s);
            System.out.println(s + "..." + address);
        }

        //第二种取出方式 entrySet()
        Set<Map.Entry<Student, String>> entrySet = map.entrySet();
        Iterator<Map.Entry<Student, String>> it1 = entrySet.iterator();
        while(it1.hasNext()) {
            Map.Entry<Student, String> me = it1.next();
            Student stu = me.getKey();
            String address = me.getValue();
            System.out.println(stu + "..." + address);
        }

    }

}

练习2:需求:对学生对象的姓名进行升序排序。

分析:因为数据是以键值对的形式存在的。所以要使用可以排序的Map集合。TreeMap。

代码:

import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

class Student1 implements Comparable<Student1> {
    private String name;
    private int age;

    public Student1(String name, int age) {
        this.name = name;
        this.age = 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;
    }

    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Student1))
            throw new ClassCastException("类型不匹配");
        Student1 stu = (Student1) obj;
        return this.name.equals(stu.name) &&
                this.age == stu.age;
    }

    @Override
    public int hashCode() {
        return name.hashCode() + age * 34;
    }

    public String toString() {
        return name + ":" + age;
    }

    @Override
    public int compareTo(Student1 s) {
        int num = new Integer(this.age).compareTo(new Integer(s.age));

        if(num == 0)
            return this.name.compareTo(s.name);

        return num;
    }
}

class StuNameComparator implements Comparator<Student1> {

    @Override
    public int compare(Student1 s1, Student1 s2) {
        int num = s1.getName().compareTo(s2.getName());

        if(num == 0)
            return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));

        return num;
    }

}
public class MapTest1 {

    public static void main(String[] args) {
        Map<Student1, String> tm = new TreeMap<Student1, String>(new StuNameComparator());

        tm.put(new Student1("blisi3", 23), "wuhan");
        tm.put(new Student1("lisi1", 21), "beijing");
        tm.put(new Student1("alisi4", 24), "nanjing");
        tm.put(new Student1("lisi1", 21), "tianjin");
        tm.put(new Student1("lisi2", 22), "shanghai");

        //System.out.println(tm);

        Set<Map.Entry<Student1, String>> entrySet = tm.entrySet();

        Iterator<Map.Entry<Student1, String>> it = entrySet.iterator();
        while(it.hasNext()) {
            Map.Entry<Student1, String> me = it.next();
            Student1 stu = me.getKey();
            String addr = me.getValue();
            System.out.println(stu + ":::" + addr);
        }

    }

}

练习3:"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。希望打印结果:a(1)c(2)...

分析:

通过结果发现,每一个字母都有对应的次数。说明字母和次数之间都有映射关系。注意:当发现有映射关系时,可以选择map集合。因为map集合中存放的就是映射关系。

问:什么时候使用map集合呢?

答:当数据之间存在着映射关系时,就要先想到map集合。

本题思路:

  1. 将字符串转换为字符数组。因为要对每一个字母进行操作。
  2. 定义一个Map集合,因为打印结果的字母有顺序,所以使用TreeMap集合。
  3. 遍历字符数组,将每一个字母作为键去查map集合。如果返回null,将该字母和1存入到map集合中。如果返回不是null,说明该字母在map集合中已经存在,并有对应次数。那么就获取该次数并进行自增,然后将该字母和自增后的次数存入到map集合中,覆盖掉原来键所对应的值。
  4. 将map集合中的数据变成指定的字符串返回。

代码:

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class MapTest2 {

    public static void main(String[] args) {
        String s = charCount("sdf+gz-x,cvasdf1xcvdfkk");
        System.out.println(s);
    }

    public static String charCount(String str) {
        char[] chs = str.toCharArray();

        TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();

        int count = 0;
        for(int i = 0; i < chs.length; i++) {
            if(!(chs[i] >= ‘a‘ && chs[i] <= ‘z‘ || chs[i] >= ‘A‘ && chs[i] <= ‘Z‘))
                continue;//不是字母继续循环

            Integer value = tm.get(chs[i]);
            if(value != null) {
                count = value;
            }
            count++;
            tm.put(chs[i], count);

            count = 0;

            /*
            if(value == null) {
                tm.put(chs[i], 1);
            } else {
                value = value + 1;
                tm.put(chs[i], value);
            }
            */

        }

        //System.out.println(tm);

        StringBuilder sb = new StringBuilder();

        Set<Map.Entry<Character, Integer>> entrySet = tm.entrySet();

        Iterator<Map.Entry<Character, Integer>> it = entrySet.iterator();
        while(it.hasNext()) {
            Map.Entry<Character, Integer> me = it.next();
            Character ch = me.getKey();
            Integer value = me.getValue();
            sb.append(ch + "(" + value + ")");
        }

        return sb.toString();

    }

}

 map集合扩展知识——一对多关系

一对多的关系:一个学校有多个教室,每一个教室都有名称。一个教室有多个学生。

示例代码:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

/*
map集合扩展知识。

map集合被使用是因为具备映射关系。

"yureban" StudentM("01" "zhangsan")
"yureban" StudentM("02" "lisi")

"jiuyeban" "01" "wangwu"
"jiuyeban" "02" "zhaoliu"

一对多的关系
一个学校有多个教室,每一个教室都有名称。
一个教室有多个学生。

*/
class StudentM {
    private String id;
    private String name;

    public StudentM(String id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return id + ":::" + name;
    }

}
public class MapDemo2 {

    public static void demo() {
        HashMap<String, List<StudentM>> czbk = new HashMap<String, List<StudentM>>();

        List<StudentM> yure = new ArrayList<StudentM>();
        List<StudentM> jiuye = new ArrayList<StudentM>();

        czbk.put("yureban", yure);
        czbk.put("jiuyeban", jiuye);

        yure.add(new StudentM("01", "zhangsan"));
        yure.add(new StudentM("04", "wangwu"));
        jiuye.add(new StudentM("01", "zhouqi"));
        jiuye.add(new StudentM("02", "zhaoliu"));

        Iterator<String> it = czbk.keySet().iterator();

        while(it.hasNext()) {
            String roomName = it.next();
            List<StudentM> room = czbk.get(roomName);
            System.out.println(roomName);
            getInfos(room);
        }
    }

    public static void getInfos(List<StudentM> list) {
        Iterator<StudentM> it = list.iterator();
        while(it.hasNext()) {
            StudentM s = it.next();
            System.out.println(s);
        }
    }

    public static void main(String[] args) {
        demo();

        /*
        HashMap<String, HashMap<String, String>> czbk = new HashMap<String, HashMap<String, String>>();

        HashMap<String, String> yure = new HashMap<String, String>();

        HashMap<String, String> jiuye = new HashMap<String, String>();

        czbk.put("yureban", yure);
        czbk.put("jiuyeban", jiuye);

        yure.put("01", "zhangsan");
        yure.put("02", "lisi");

        jiuye.put("01", "zhaoliu");
        jiuye.put("02", "wangwu");

        //遍历czbk集合,获取所有的教室
        Iterator<String> it = czbk.keySet().iterator();

        while(it.hasNext()) {
            String roomName = it.next();
            HashMap<String, String> room = czbk.get(roomName);
            System.out.println(roomName);
            getStudentMInfo(room);
        }

        //getStudentInfo(jiuye);
        */
    }
    public static void getStudentInfo(HashMap<String, String> roomMap) {
        Iterator<String> it = roomMap.keySet().iterator();
        while(it.hasNext()) {
            String id = it.next();
            String name = roomMap.get(id);
            System.out.println(id + ":" + name);
        }
    }
}

时间: 2024-10-07 18:27:31

Java集合框架(三)的相关文章

java 集合框架(三)Collection

Collection是集合框架的根接口,一个集合代表一组对象,我们称之为元素.不同的集合具有不同的特性,比如有的集合可以有重复元素,有的不可以,有的可以排序,有的不可排序,如此等等,而Collection作为集合的根接口,它规范定义了集合的通用方法,一个集合我们可以看作一个在内存中的小型数据库,而数据库的常用操作无外乎"增删改查",Collection中的方法也大体是这些类型操作. Java集合框架中没有直接实现Collection的子类,而是通过一系列子接口,比如List,Set,Q

Java—集合框架List

集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组织(针对作用与意义一样的属性,将他们放到一个集合中) 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中快速的插入或删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 与数组相比 数组的长度

JAVA集合框架

收藏 查看我的收藏 146有用+1 56 编辑 Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.集合框架是为表示和操作集合而规定的一种统一的标准的体系结构.任何集合框架都包含三大块内容:对外的接口.接口的实

2016.3.9-3.10(java集合框架)

3.9 集合框架有什么作用? 集合框架其主要功能是用来将存储的数据以某种结构组织,并以特定的方式来访问这些数据. Java集合框架中有哪些存储方式? Java集合框架中的对象容器,按照对象在其中的存储方式,分为Set.List.和Map三种类型. Set类型对象没有顺序,且不能重复: List类型对象容器中的对象按照索引顺序排序,而且可以有重复的对象: Map类型对象容器中的元素包含一对“键对象-值对象”映射,其中键对象不能重复,值对象可以重复. 以上三种存储方式对应Java集合框架中Set.L

java集合框架22

思想:在面向对象的思想里,一种数据结构被认为是一种容器.在本质上来讲是一个类,提供方法支持查找,插入和删除等等操作. Java集合框架支持以下俩种类型的容器: 存储一个元素集合,简称为集合Collection 存储键值对,称为图Map 集合collection 三种主要类型 : 规则集(set) , 线型表(List) , 队列(Queue) set: 存储一组不重复的数据 List: 存储由元素构成的有序集合 Queue: 存储先进先出方式处理的对象 细说Collection接口: 它是处理对

Java集合框架的知识总结

说明:面试准备,写的挺不错的. 转载地址: http://www.cnblogs.com/zhxxcq/archive/2012/03/11/2389611.html 1.综述 所有集合类都位于java.util包下.集合中只能保存对象(保存对象的引用变量).(数组既可以保存基本类型的数据也可以保存对象). 当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进行处理.从JDK1.5以后,这种状态得到了改进:可以使用泛型来限制集合里元素的类型,并让集合记住所有集合元素的类

Java 集合框架

Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题.由于这个原因,使用Vector类的方式和使用Properties类的方式有着很大不同. 集合框架被设计成要满足以下几个目标. 该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的. 该框架允许不同类型的集合,以类似的方式工作,具有高度

Java集合框架总结(4)——List接口的使用

Java集合框架总结(4)--List接口的使用 List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引.List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素. 1.List接口和ListIterator接口 List作为Collection接口的子接口,可以使用Collection接口里的全部方法.List是有序集合,所以List集合里增加了一些根据索引来操作集合元素的方法: void add(int index, Object element):将元素element插

Java集合框架总结(5)——Map接口的使用

Java集合框架总结(5)--Map接口的使用 Map用于保存具有映射关系的数据(key-vlaue).Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false Map中包含了一个keySet()方法,用于返回Map所以key组成的Set集合. Map集合与Set集合元素的存储形式很像,如Set接口下有HashSet.LinkedHashSet.SortedSet(接口).TreeSet.EnumSet等实现类和子接口,而Map接口下则有HashMa