Day 20 Map集合

Map集合和Collection集合的区别

都是容器,能够存和取

Collection 集合的单列集合 ,里面的只能存储一种引用类型的元素

Map 集合双列集合Map<k,v> 一系列键值对元素,键必须唯一,值可以重复

Collection理解为 “光棍”
Map集合理解为"夫妻对"
Collection]的具体的子实现类TreeSet和HashSet都和Map有关系(TreeMap/HashMap)

遍历方式不同的
Collection有自己的迭代器
map集合:常用的方式,获取素有的键的集合,通过键找值;
举例
Map<String,String>
“杨过” ,“小龙女”
“郭靖” ,“黄蓉”
“陈玄风”,“梅超风”
“令狐冲”,"任盈盈

认识Map集合

要通过学号获取学生姓名?

  •  Collection<Student> 这个Student的属性:学号,以及姓名,年龄,地址,就可以通过getXXX()来获取内容!
    
  •  有的需求结构必须使用Map<K,V> 键值对,因为针对Key就是键有效(Key必须唯一的),跟值无关,键必须唯一 ,Value值可以重复
    
  •  Map<Integer,Student>    K:Integer学号  V:Student 学生   Map本身就能够描述一个实体(就是描述事物的)
    
  •  单独来存储学号,Value存储学生类型,Integer必须唯一
    
  •          通过学号查询学生,通过学生就获取学生的基本信息
    

Map

Map的基本功能:

V put(K key, V value)

添加键值对,注意实现:如果键是第一次添加,返回值null;

如果键重复,后面的值将前面的值会覆盖掉,返回第一次键对应的值;

  •      boolean containsKey(Object key):判断是否包含指定的键
    
  •      boolean containsValue(Object value):判断是否包含指定的值
    
  •      boolean isEmpty():判断集合是否为空,Map为空,true;否则,false
    
  •      V remove(Object key):删除Map中的键,返回该键对应的值
    
  •      Collection<V> values():获取Map集合中的所有值的集合---是Collection,里面将所有的Value集中起来
    
  •      void clear():清空map集合
    

HashMap

遍历1 获取所有键的Set类型集合
/**
 * @author 刘涛
 * @date 2022/8/22 15:57
 * 方式1:推荐的方式
 *  Map集合遍历
 *          获取Map集合中所有的键的集合,增强for遍历所有的键,通过键获取值
 *          Set<K> keySet()--->获取Map集合中所有的键的集合
 *          V get(Object key)------->通过键获取值
 */
public class MapDemo2 {
    public static void main(String[] args) {
        //创建Map集合
        Map<String,String> map = new HashMap<>() ;

        //添加元素
        map.put("杨过","小龙女") ;
        map.put("郭靖","黄蓉") ;
        map.put("令狐冲","岳莹莹") ;
        map.put("陈玄风","梅超风") ;
        map.put("刘备","大乔") ;
        map.put("刘备","小乔") ;

        // Set<K> keySet()--->获取Map集合中所有的键的集合
        Set<String> set = map.keySet();
        //遍历所有的键
        for(String key:set){
            //V get(Object key)------->通过键获取值
            String value = map.get(key);
            System.out.println(key+"="+value);
        }

    }
}

遍历2 获取所有键值对的集合
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author 刘涛
 * @date 2022/8/22 16:04
 *
 * Map集合遍历方式2:不推荐   获取所有的键值对象 Set<Map.Entry<K,V>> entrySet()
 *              Map.Entry<K,V>键值对象就有
 *                          K getKey():获取键
 *                          V getVvalue():获取值
 */
public class MapDemo3 {
    public static void main(String[] args) {
        //创建Map集合
        Map<String,String> map = new HashMap<>() ;

        //添加元素
        map.put("杨过","小龙女") ;
        map.put("郭靖","黄蓉") ;
        map.put("令狐冲","岳莹莹") ;
        map.put("陈玄风","梅超风") ;
        map.put("刘备","大乔") ;

        //获取所有的键值对象 Set<Map.Entry<K,V>> entrySet()----理解为"结婚证"
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        //遍历所有的键值对
        for(Map.Entry<String, String> en :entrySet){
            // K getKey():获取键
            String key = en.getKey();
            // V getVvalue():获取值
            String value = en.getValue();
            System.out.println(key+"="+value) ;
        }
    }
}

/**
 * @author 刘涛
 * @date 2022/8/22 17:00
 * HashMap<K,V>,如果是自定义类型,保证元素唯一,键必须唯一!
 * K--->Student类型
 * V--->学生的地址String
 *
 * 之前将HashSet的时候,的add方法依赖于HashMap的put方法---->间接依赖于Object的hashCode和equals()方法
 * 默认比的地址值是否相同,equals,如果存储K键是String类型,jdk提供的----已经重写了
 *
 * 而现在的键是自定义类型,Student类型必须重写equals和hashCode,才能保证键必须唯一!
 *
 * Map集合针对键有效,跟值无关,键必须唯一!(自定义类型,jdk提供的类型几乎重写过了equals和hashCode方法)
 */

TreeMap

1.自然排序
import sun.reflect.generics.tree.Tree;

import java.util.Set;
import java.util.TreeMap;

/**
 * @author 刘涛
 * @date 2022/8/22 17:14
 * TreeMap<K,V>集合也是Map集合的子实现类
 * TreeSet<E>集合依赖于TreeMap实现
 *
 * 包保证元素必须进行排序的,使用TreeMap<K,V>,如果是自定义类型,要保证唯一而且还要排序
 * 底层是一种红黑树结构;
 *
 * public TreeMap():自然排序,键的这个类型必须实现Comarepable接口
 *public TreeMap(Comparator<K> comparator):比较器排序,自定义一个类实现Comparator或者是使用接口匿名内部类
 */
public class TreeMapDemo {
    public static void main(String[] args) {
        //TreeMap<Student,String>: K:学生类型 ,V: 爱好 String类型
        //按照学生的年龄从小到大排序
        TreeMap<Student,String> tm = new TreeMap<>() ;//自然排序

        Student s1  = new Student("gaoyuanyuan",36) ;
        Student s2  = new Student("gaoyuanyuan",36) ;
        Student s3  = new Student("zhangjianing",36) ;
        Student s4  = new Student("zhangsan",20) ;
        Student s5  = new Student("wenzhang",19) ;
        Student s6  = new Student("wenzhang",25) ;
        Student s7  = new Student("mayili",43) ;
        Student s8  = new Student("yaodi",30) ;
        Student s9  = new Student("mayili",43) ;

        tm.put(s1,"演戏-律师") ;
        tm.put(s2,"演戏-杨桃") ;
        tm.put(s3,"演戏-电视剧唐砖") ;
        tm.put(s4,"踢足球") ;
        tm.put(s5,"撩妹") ;
        tm.put(s6,"演戏") ;
        tm.put(s7,"打篮球") ;
        tm.put(s8,"排球") ;
        tm.put(s9,"乒乓球") ;

        //获取所有的键的集合
        Set<Student> set = tm.keySet();
        for(Student s:set){
            //通过键获取值
            String value = tm.get(s);
            System.out.println(s.getName()+"---"+s.getAge()+"---"+value);
        }

    }
}

自定义类型实现 Compareable 接口

/**
 * @author 刘涛
 * @date 2022/8/22 17:03
 */

//完成自然排序
public class Student implements Comparable<Student> {
    private String name ; //姓名
    private int age ; //年龄

    public Student() {
    }

    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 String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }




    @Override
    public int compareTo(Student s) {
        按照学生的年龄从小到大排序
        int num = this.age - s.age ;
        //年龄相等,不一定是同一个人
        int num2 = (num==0)?this.name.compareTo(s.name):num ;
        return num2;
    }
}

2. 比较器排序
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;

/**
 * @author 刘涛
 * @date 2022/8/22 17:14
 * TreeMap<K,V>集合也是Map集合的子实现类
 * TreeSet<E>集合依赖于TreeMap实现
 *
 * 包保证元素必须进行排序的,使用TreeMap<K,V>,如果是自定义类型,要保证唯一而且还要排序
 * 底层是一种红黑树结构;
 *
 * public TreeMap():自然排序,键的这个类型必须实现Comarepable接口
 *public TreeMap(Comparator<K> comparator):比较器排序,自定义一个类实现Comparator或者是使用接口匿名内部类
 */
public class TreeMapDemo {
    public static void main(String[] args) {
        //TreeMap<Student,String>: K:学生类型 ,V: 爱好 String类型
        //按照学生的年龄从小到大排序
        //接口匿名内部类的方式
        TreeMap<Student,String> tm = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //主要条件:按照年龄从大到小
                int num = s2.getAge()-s1.getAge() ;
                //年龄相等,比较姓名内容是否一致
                int num2 = (num==0)?s1.getName().compareTo(s2.getName()):num;
                return num2;
            }
        }) ;//比较器排序

        Student s1  = new Student("gaoyuanyuan",36) ;
        Student s2  = new Student("gaoyuanyuan",36) ;
        Student s3  = new Student("zhangjianing",36) ;
        Student s4  = new Student("zhangsan",20) ;
        Student s5  = new Student("wenzhang",19) ;
        Student s6  = new Student("wenzhang",25) ;
        Student s7  = new Student("mayili",43) ;
        Student s8  = new Student("yaodi",30) ;
        Student s9  = new Student("mayili",43) ;

        tm.put(s1,"演戏-律师") ;
        tm.put(s2,"演戏-杨桃") ;
        tm.put(s3,"演戏-电视剧唐砖") ;
        tm.put(s4,"踢足球") ;
        tm.put(s5,"撩妹") ;
        tm.put(s6,"演戏") ;
        tm.put(s7,"打篮球") ;
        tm.put(s8,"排球") ;
        tm.put(s9,"乒乓球") ;

        //获取所有的键的集合
        Set<Student> set = tm.keySet();
        for(Student s:set){
            //通过键获取值
            String value = tm.get(s);
            System.out.println(s.getName()+"---"+s.getAge()+"---"+value);
        }

    }
}

/**
 * @author 刘涛
 * @date 2022/8/22 17:03
 */


public class Student  {
    private String name ; //姓名
    private int age ; //年龄

    public Student() {
    }

    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 String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Collections 工具

/**
 * Collections:是Jdk提供的针对集合操作的工具类
 * 里面的很多静态功能,排序,求最值等等
 * public static T max(Collection<T> coll):求集合中最大值
 * public static T min(Collection<T> coll):求集合中最小值
 * public static void shuffle(List<?> list):随机置换 (针对List集合打乱元素)
 * public static <T extends Comparable<? super T>> void sort(List<T> list):针对List集合自然排序
 * public static <T extends Comparable<? super T>> void      sort(List<T> list,Comparator<T> c):
 *              针对List集合比较器排序
 *
 *
 *              TreeSet集合人家本身就可以排序 取决构造方法
 *
 *              而List集合要进行自然排序或者比较器排序需要使用      * Collections.sort(list集合对象)

泛型的高级通配符(了解)

<?> :表示任意Java类型包含Object <? extends E>:向下限定:E类型及其他的子类 ,最起码和E类型保持一致 <? super E>:向上限定:E类型及其他的父类 class Animal{ } class Dog extends Animal{} //测试 Collection<?> c1 = new ArrayList() ;

Collection<?> c2 = new ArrayList() ; Collection<?> c3 = new ArrayList() ;

Collection<? extends Object> c4= new ArrayList() ;
Collection<? extends Object> c5= new ArrayList() ;
Collection<? extends Animal> c6= new ArrayList() ;
Collection<? extends Animal> c7= new ArrayList() ;
Collection<? super Dog> c7= new ArrayList() ;
Collection<? super Dog> c8= new ArrayList() ;

静态导入

静态导入,前提这个类方法的是静态,导入方法的级别

​ import static 包名.类名.静态方法名;

注意:

  • 如果我们在使用静态导入的时候,导入方法级别,前提是自定义的方法名不能和它冲突,如果冲突,系统
  • 不知道这个方法是自定义的还是jdk提供的这个类的方法,此时静态导入就不能用了,必须显示的指明是哪个类的方法

可变参数

当方法的形式参数有多个,可以使用… 表示多个参数


public static void main(String[] args) {

        //调用方法
        int sum = getSum(10, 12, 13, 15 );
        System.out.println(sum);

        System.out.println("--------------------------------------------------") ;
        printA(10,20,30,40,50,15);//可变参数

    }

    //明确4个参数,求和
    public static int getSum(int a,int b,int c,int d){
        return  a+ b+c+d ;
    }

    //定义多个数据求和,不明确参数有多少个,jdk5提供新特性 可变参数 ...
    public static void printA(int ... a){
            //此时可变参数a就相当于数组 里面存储很多数据
        for(int x = 0 ; x  < a.length ; x++){
            System.out.print(a[x]+"\t"); //\t 制表符,类似tab键 缩进
        }
        System.out.println();
    }

异常

/**
 * @author liutao
 * @date 2022/8/23 14:14
 * public final void join()  线程礼让!
 *                 throws InterruptedException
 *      等待该线程终止(等待某个线程结束,才能执行其他线程互相抢占cpu执行权)
 *      方法本身会抛出异常(中断异常),等会谁在调用这个方法可以抛throws(抛出到方法上)
 *      或者     捕获异常
 *      (jvm内存解析代码,如果异常信息和它处理的信息异常,它会创建异常对象,将异常信息打印在控制台上,展示日志)
 *              try{
 *                  //代码
 *              }catch(异常类名 变量名){
 *                  //处理异常,跟踪底层原码   变量名.printStackTrace():将信息打印
 *              }
 *
 *              开发中:使用捕获异常(业务逻辑层:捕获),自己写代码可以抛出异常 (给方法上抛throws)
 */

*** 集合重点**

Collection和Map区别

他们的遍历方式

Map的两种遍历方式对比

TreeSet集合存储自定义类型,如何实现自然排序和比较器排序

Map集合针对键有效,跟值无关,TreeMap<k,v>k如果是自定义类型,如何自然排序和比较器排序…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值