Map集合

第一章 Map集合

1.1概述:

1).特点:

1).Map内部采用“键值对”的形式存储;

2).在一个Map内,“键”是唯一的值可以重复;每个键只能对应一个值

3).键和值可以是任何对象;

4).可以通过“键”获取对应的“值”;

1.2 常用子类:

Map(接口):双列集合:

|--HashMap(子类):键是“哈希表”结构:

|--LinkedHashMap(子类):键是“链表、哈希表”结构;

1.3 Map接口中定义的常用方法:

注意:KeyValue只能存放引用类型。

1).添加、修改:

public V put(K key,V value):存储一个键值对;

返回值:当存储一个已存在的键时,用新值替换旧值,并将旧值返回;如果键不存在,返回null。

2).删除:

public V remove(Object key):使用键删除对应的“键值对”,并将“值”返回。

3).查询:

public V get(K key):通过键,获取对应的值;

public int size():获取键值对的数量;

4).遍历:

注:Map本身没有遍历的方法,都是间接遍历

1) 键找值:keySet(),Map集合中的键放到Set集合中。

2) values(),Map集合中的值放到Set集合中。

3).获取“键值对”的方式;entrySet()

        

1.4 集合遍历_键找值:

1).键找值:先获取Map中所有“键”的集合,然后在逐个根据每个键,获取对应的值。

2).示例代码:

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("美女", "马蓉");
    map.put("绿巨人", "王宝强");
    map.put("老王", "宋喆");
    map.put("影帝", "黄渤");
    //键找值:先获取所有"的集合
    Set<String> keys = map.keySet();
    //遍历所有键的集合
    for (String key : keys) {
        System.out.println(key + " , " + map.get(key));
    }
}

1.5 集合遍历_键值对对象_Entry对象说明:

当我们向Map中存储键值对时,其实Map内部会将这个键值对封装到一个Entry对象中。

 

1.6 集合遍历_键值对对象:

1)常用方法:

获取对应键和对应值得方法:

public K getKey() :获取Entry对象中的

public V getValue() :获取Entry对象中的

获取Map集合中所有Entry对象的方法:

public Set<Map.Entry<K,V>>  entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)

2).键值对对象:将所有的Entry对象封装到一个Set中,并返回;

3).示例代码:

public static void main(String[] args) {
    Map<String, String> map = new HashMap<>();
    map.put("美女", "马蓉");
    map.put("绿巨人", "王宝强");
    map.put("老王", "宋喆");
    map.put("影帝", "黄渤");
    //键值对对象
    Set<Map.Entry<String, String>> es = map.entrySet();
    //遍历所有的Entry
    for (Map.Entry<String, String> e : es) {
        String key = e.getKey();
        String value = e.getValue();
        System.out.println(key + " , " + value);
    }
}

1.7 子类_HashMap的基本使用和使用自定义对象做键

1).注意:自定义对象做键,必须重写hashCode()和equals()方法:

public class Student {
    .....
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

2).测试类:

public static void main(String[] args) {
    Map<Student,String> map = new HashMap<>();
    map.put(new Student("张三", 18), "帅哥");
    map.put(new Student("杨幂", 17), "美女");
    map.put(new Student("杨幂", 17), "女神");
    System.out.println(map.size());
    System.out.println(map);
}

1.8 子类_LinkedHashMap的基本使用:

1). LinkedHashMap:它是Map的特例,有序的哈希表;

1.9 集合练习_计算每个字符出现的次数(多练):

1).题目:有以下字符串:

String str = "abccdabadebaabbf";

   统计:abcd字符各出现多少次;

2).示例代码:

public static void main(String[] args) {
        String str = "abccdabadebaabbf";
        //1.定义一个Map存储计算结果
         Map<Character,Integer> map = new HashMap<>();
        //2.遍历字符串
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
//            if (c >= 'a' && c <= 'd') {
                //c作键,到map中查找值
                Integer value = map.get(c);
                if (value == null) {
                    value = 1;
                }else{
                    value++;
                }
                //cvalue重新putmap
                map.put(c, value);
//            }
        }
        //3.验证结果
         Set<Map.Entry<Character,Integer>> es = map.entrySet();
        for (Map.Entry<Character, Integer> e : es) {
            System.out.println(e.getKey() + " = " + e.getValue());
        }
    }

 

第二章:补充知识点

2.1  JDK9对集合添加的优化:

1).向集合添加元素:

ArrayList<String> list = new ArrayList<>();

list.add(...);

list.add(...);

...

2).JDK9的三个集合接口:ListSetMap中都提供了一种静态方法of( )

3).例如:

List<String> strList = List.of("张三","李四","王五","周六");

Set<String> strSet = Set.of("黄渤","黄老邪","黄磊","黄瓜");

Map<Character,Integer> map = Map.of('a',10,'b',20,'c',25);

4).注意:它们返回都是:(长度)不可变集合--不能再添加、删除元素不能修改

public static void main(String[] args) {
        List<String> list = List.of("张三", "李四", "王五");
        System.out.println(list);
//        list.add("周六");//运行时异常
//        list.remove(0);//运行时异常
//        list.set(0, "张三丰");//运行时异常  
        System.out.println(list);
    }

  注意:1:of()方法只是Map,List,Set这三个接口的静态方法,其父类接口和子类实现并没有这类方法,比如HashSet,ArrayList等待;

2:返回的集合是不可变的;

2.2  Debug追踪调试:

1).在要“暂停”的代码左侧,"行号的右边"--》鼠标单击,出现一个红点。

2).右键-->Debuge "xxxx.main()"

3).运行起来后,到达断点处,会自动暂停:

4).几个快捷键:

1).F8 : 单步执行,遇到方法调用,不进入方法体;

2).F9 : 结束单步执行;继续执行后面的代码,如果后面代码没有断点,直接将后续所有代码执行完毕;如果后面有断点,将在下一个断点处暂停;

3).F7 : 单步执行,遇到方法调用,进入到方法体

 

第三章:综合案例

模拟斗地主洗牌发牌_案例介绍:

1).封装一副牌(54个字符串)

2).洗牌

3).发牌

4).看牌:要求每个人的牌面要从大到小排列:

抓到手:

♥2♠2,小王,♦2,大王,♣2

看牌:

大王,小王,♥2♦2♠2♣2

 

posted on 2018-10-14 13:30  水漾月  阅读(98)  评论(0编辑  收藏  举报

导航