Java学习之Map集合

【1】Map集合的概述和特点

Map将键映射到值的对象一个映射不能包含重复的键每个键最多只能映射到一个值。Map接口提供三种collection视图,允许以键集,值集,或者键-值映射关系集的形式查看某个映射内容,映射顺序定义为迭代器在映射实现可明确保证其顺序,如TreeMap类,另一些映射实现则不保证顺序如:HashMap

【2】Map与Collection接口的不同:

A:Map是双列的,Collection是单列的

B:Map的键是唯一的,Collection的子体系Set是唯一的

C:Map集合的数据结构针对键有效,跟值无关。Collection集合的数据结构是针对元素有效

【3】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():返回一个键值对的Set集合

                     V get(Object key):根据键获取值

                     Set<K> keySet():获取集合中所有键的集合

                    Collection<V> values():获取集合中所有值的集合

E:长度功能:int size():返回集合中键值对的对数

【4】Map集合的基本功能测试

一个简单的String,String类型键值对的Map方法的使用

Map集合的两种遍历方式:

A:通过生成键值对对象,遍历集合:Set<Map.Entry<String,String>> 

B:通过生成键集,遍历键找出对应的值:Set<String>

package HashMapDemo;

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

public class HashMapDemo {
    public static void main(String[] args) {
        HashMap<String,String> hashMap=new HashMap<>();
        hashMap.put("33","333");
        hashMap.put("44","444");
        hashMap.put("22","222");
        Set<Map.Entry<String,String>> entries=hashMap.entrySet();//获取键值对对象
        //遍历  方式1:生成键值对集合,遍历键值对集合 Map.Entry<String,String>
        for (Map.Entry<String, String>  entry : entries) {
            String key=entry.getKey();
            String value=entry.getValue();
            System.out.println(key+"==="+value);
        }
        System.out.println("---------------------------------------");
       //遍历 方式2:获取键的集合,通过键找值的方式遍历
        Set<String> key=hashMap.keySet();//键集合
        for (String s : key) {
            String s1=hashMap.get(s);
            System.out.println(s+"==="+s1);
        }

    }
}

【5】HashMap上个例子就用的HashMap,它的键值都是String类型

我们再来举个键是Student值是String类型的例子:

package HashMapDemo;

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

public class HashMapDemo2 {
    public static void main(String[] args) {
        HashMap<Student,String> hashMap=new HashMap<Student, String>();
        hashMap.put(new Student("钟楚红", 23),"s001");
        hashMap.put(new Student("钟楚红", 23), "s001");
        hashMap.put(new Student("梅艳芳", 27),"s002");
        hashMap.put(new Student("李丽珍", 26),"s003");
        hashMap.put(new Student("翁虹", 27),"s004");
        hashMap.put(new Student("翁虹", 27), "s004");
        hashMap.put(new Student("叶子楣", 29),"s005");
        hashMap.put(new Student("叶子楣222", 29),"s005");
        //通过从键集获取值的方式遍历
        for (Student student : hashMap.keySet()) {
            String string=hashMap.get(student);
            System.out.println(student.getName()+"=="+student.getAge()+"=="+string);
        }
        //通过获取键值对集合的迭代器的方式遍历
        Iterator map=hashMap.entrySet().iterator();
        while (map.hasNext()){
            Map.Entry<Student,String> entry=(Map.Entry<Student,String>)map.next();
            System.out.println(entry.getKey().getName()+"=="+entry.getKey().getAge()+"=="+entry.getValue());
        }
    }
}

再来一个键是String值是Student的例子:

package HashMapDemo;

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

public class HashMapDemo3 {
    public static void main(String[] args) {
        HashMap<String,Student> hashMap=new HashMap<String, Student>();
        hashMap.put("s001",new Student("钟楚红", 23));
        hashMap.put("s001",new Student("钟楚红", 23));
        hashMap.put("s002",new Student("梅艳芳", 27));
        hashMap.put("s003",new Student("李丽珍", 26));
        hashMap.put("s004",new Student("翁虹", 27));
        hashMap.put("s004",new Student("翁虹", 27));
        hashMap.put("s005",new Student("叶子楣", 29));
        hashMap.put("s005",new Student("叶子楣222", 29));
        //通过从键集获取值的方式遍历
        for (String string : hashMap.keySet()) {
            Student student=hashMap.get(string);
            System.out.println(string+student.getName()+"=="+student.getAge()+"==");
        }
        //通过获取键值对集合的迭代器的方式遍历
        Iterator map=hashMap.entrySet().iterator();
        while (map.hasNext()){
            Map.Entry<String,Student> entry=(Map.Entry<String,Student>)map.next();
            System.out.println(entry.getKey()+"=="+entry.getValue().getAge()+"=="+entry.getValue().getName());
        }
    }
}

【6】LinkedHashMap的概述和使用

A:LinkedHashMap:Map接口的哈希表和链接列表实现,具有可预知的迭代顺序

B:LinkedHashMap的特点:底层数据结构是链表和哈希表,元素有序且唯一,元素的有序性由链表数据结构保证,唯一性由哈希表数据结构保证;Map集合的数据结构只与键有关

【7】TreeMap集合键

A:键的数据结构是红黑树,可保证键的排序和唯一性,排序分为自然排序和比较器排序

B:线程是不安全的效率比较高

再次举一个TreeMap集合键是Student 值是String的实例

package TreeMapDemo;

import HashSetDemo.Student;

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

public class TreeMapDemo2 {
    public static void main(String[] args) {
        TreeMap<Student,String> treeMap=new TreeMap<>();
        treeMap.put(new Student("钟楚红", 23),"s001");
        treeMap.put(new Student("钟楚红", 23), "s001");
        treeMap.put(new Student("梅艳芳", 27),"s002");
        treeMap.put(new Student("李丽珍", 26),"s003");
        treeMap.put(new Student("翁虹", 27),"s004");
        treeMap.put(new Student("翁虹", 27), "s004");
        treeMap.put(new Student("叶子楣", 29),"s005");
        treeMap.put(new Student("叶子楣222", 29),"s005");
        for (Student integer :treeMap.keySet()) {
            System.out.println(integer.getName()+integer.getAge()+"=="+treeMap.get(integer));
        }
        Set<Map.Entry<Student,String>> entries=treeMap.entrySet();
        for (Map.Entry<Student,String> entry: entries
             ) {
            Student key=entry.getKey();
            System.out.println(key.getName()+"==="+key.getAge()+"====="+entry.getValue());
        }
    }
}

实现Comparable接口


    @Override
    public int compareTo(Student s) {
        //System.out.println(this+"==="+s);
        //需求:按照年龄大小来排序学生
        //年龄一样了,不能说明是同一个对象,我们还得比较姓名是否一样
        int flag=0;
        int num=this.age-s.getAge();
        int num2=num==0?this.name.compareTo(s.name):num;
        return -num2;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值