小滴课堂-学习笔记:(9)Java进阶核心之三大集合框架拓展

56 篇文章 0 订阅
32 篇文章 1 订阅

logo 愿景:"让编程不再难学,让技术与生活更加有趣"


更多架构课程请访问 xdclass.net

目录

第1集 Java集合框架遍历之迭代器(Iterator)

第2集 Java迭代器进阶和注意事项

第3集 Java集合框架之Collections工具类讲解上集

第4集 Java集合框架之Collections工具类讲解下集

第5集 Java集合框架元素排序之Comparable排序接口讲解

第6集 新版JDK之Objects 工具类实战

第7集 新版JDK之重写HashCode和Equals实战

第8集 本章课程作业练习题布置

第9集 本章课程作业常见问题和答案解析

第10集 集合框架Collection初步总结

干货文档


第1集 Java集合框架遍历之迭代器(Iterator)

简介:讲解什么是迭代器

  • 使用循环遍历集合

    • 普通for循环

    • 增强for循环

  • 什么是迭代器Iterator

    • Iterator是java中的一个接口,核心作用就是用来遍历容器的元素,当容器实现了Iterator接口后,可以通过调用Iterator()方法获取一个 Iterator对象

    • 为啥是调用容器里面的Iterator方法呢?

      • 因为容器的实现有多种,不同的容器遍历规则不一样,比如ArrayList/LinkedList/HashSet/TreeSet等,所以设计了Iterator接口,让容器本身去实现这个接口,实现里面的方法,从而让开发人员不用关系容器的遍历机制,直接使用对应的方法即可

    • 三个核心方法

      • boolean hashNext()

        • 用于判断iterator内是否有下个元素,如果有则返回true,没有则false

      • Obejct next()

        • 返回iterator的下一个元素,同时指针也会向后移动1位

      • void remove()

        • 删除指针的上一个元素(容易出问题,删除元素不建议使用容器自己的方法迭代器遍历集合

        •  

  •     public static void testSet(){
            Set<String> set = new HashSet<>();
            set.add("jack");
            set.add("tom");
            set.add("marry");
            set.add("tony");
            set.add("jack");
            Iterator<String> iterator =  set.iterator();
            while (iterator.hasNext()){
                String str = iterator.next();
                System.out.println(str);
            }
        }
    ​
    ​
        public static void testList(){
            List<String> list = new ArrayList<>();
            list.add("jack");
            list.add("tom");
            list.add("mary");
            list.add("tim");
            list.add("tony");
            list.add("eric");
            list.add("jack");
    ​
            Iterator<String> iterator =  list.iterator();
            while (iterator.hasNext()){
                String str = iterator.next();
                System.out.println(str);
            }
    ​
        }
    
    
    

     

第2集 Java迭代器进阶和注意事项

简介:详细讲解迭代器的进阶知识和注意事项

  • 迭代器是一种设计模式

  • 三个核心方法

    - boolean hashNext() 
      - 用于判断iterator内是否有下个元素,如果有则返回true,没有则false
    - Obejct next()
      - 返回iterator的下一个元素,同时指针也会向后移动1位
    - void remove()
      - 删除指针的上一个元素
      - 只有当next执行完后,才能调用remove函数
      - 如要删除第一个元素,不能直接调用 remove(),要先next一下()否则调用remove方法是会抛出异常的

     

  • 迭代器遍历元素时不能通过Collection接口中的remove方法删除元素,只能用Iterator的remove方法删除元素; 原因 某个线程在 Collection 上进行迭代时,不允许另一个线程修改该 Collection

public static void testList(){
        List<String> list = new ArrayList<>();
        list.add("jack");
        list.add("tom");
        list.add("mary");
        list.add("tim");
        list.add("tony");
        list.add("eric");
        list.add("jack");
​
        Iterator<String> iterator =  list.iterator();
        while (iterator.hasNext()){
            String str = iterator.next();
            if("jack".equals(str)){
                list.remove(str);//ConcurrentModificationException并发修改异常
            }
            System.out.println(str);
        }
​
    }
  • 迭代出的对象是引用的拷贝,如果修改迭代中的元素,那么就是修改容器对象的本身

  • 和for循环对比

    • for循环适合顺序访问,或者通过下标进行访问的

    • 迭代器适合链式结构

    • 最终看使用场景,性能会有轻微差别,但是可以忽略

 

 

 

第3集 Java集合框架之Collections工具类讲解上集

简介:讲解Java集合工具类Collections讲解上集

  • Collections工具类

    • Java里关于集合的工具类,包含有各种有关集合操作的静态多态方法,不能实例化(把构造函数私有化)

      • public class Collections {
            // Suppresses default constructor, ensuring non-instantiability.
            private Collections() {
            }

 

  • 和Collection的区别

    • Collection是接口,提供了对集合对象进行基本操作的通用接口方法,List、Set等多种具体的实现类

    • Collections是工具类,专门操作Collection接口实现类里面的元素

 

  • 常见方法

    • 排序 sort(List list)

      • 按自然排序的升序排序

                List<String> list = new ArrayList<>();
                list.add("aaaa");
                list.add("zzz");
                list.add("gggg"); 
                System.out.println(list);
                Collections.sort(list);
                System.out.println(list);

         

      • sort(List list, Comparator c) 自定义排序规则,由Comparator控制排序逻辑

                List<String> list = new ArrayList<>();
                list.add("aaaa");
                list.add("zzz");
                list.add("gggg");
                System.out.println(list);
                //默认升序
                Collections.sort(list, Comparator.naturalOrder());
                System.out.println(list);
        ​
                //降序
                Collections.sort(list, Comparator.reverseOrder());
                System.out.println(list);
    • 随机排序 shuffle(List list)

              List<String> list = new ArrayList<>();
              list.add("1");
              list.add("2");
              list.add("3");
              list.add("4");
              list.add("5");
              list.add("6");
              list.add("7");
              list.add("8");
              list.add("9");
              list.add("10");
              list.add("J");
              list.add("Q");
              list.add("K");
              System.out.println(list);
              Collections.shuffle(list);
              System.out.println(list);
      ​
      
      

       

 

 

第4集 Java集合框架之Collections工具类讲解下集

  • 简介:讲解Java集合工具类Collections讲解下集

    • 获取最大元素 max(Collection coll) 默认比较,不适合对象比较

    • 获取最大元素 max(Collection coll, Comparator comparator)

      public class CollectionsTest {
      ​
          public static void main(String[] args) {
      ​
      ​
              List<Student> list = new ArrayList<>();
              list.add(new Student("jack", 26));
              list.add(new Student("tom", 29));
              list.add(new Student("mary", 32));
              list.add(new Student("tony", 19));
              list.add(new Student("smith", 41));
      ​
              System.out.println(list);
      ​
              Student maxAgeStudent =  Collections.max(list, new Comparator<Student>() {
                  @Override
                  public int compare(Student o1, Student o2) {
                      return o1.getAge() - o2.getAge();
                  }
              });
              
               Student mixAgeStudent =  Collections.mix(list, new Comparator<Student>()       {
                  @Override
                  public int compare(Student o1, Student o2) {
                      return o1.getAge() - o2.getAge();
                  }
              });
      ​
      ​
      ​
             System.out.println(maxAgeStudent.toString());
      ​
          }
      ​
      }
      ​
      ​
      class Student {
      ​
          public Student(String name, int age) {
              this.name = name;
              this.age = age;
          }
      ​
          private int age;
      ​
          private String name;
      ​
          public void setAge(int age) {
              this.age = age;
          }
      ​
          public int getAge() {
              return age;
          }
      ​
      ​
          public void setName(String name) {
              this.name = name;
          }
      ​
          public String getName() {
              return name;
          }
      ​
          @Override
          public String toString() {
              return "Student{" +
                      "age=" + age +
                      ", name='" + name + '\'' +
                      '}';
          }
      }

       

    • 获取最小元素 min(Collection coll)

    • 创建不可变集合unmodifiablleXXX()

              List<String> list = new ArrayList<>();
              list.add("SpringBoot课程");
              list.add("架构课程");
              list.add("微服务SpringCloud课程"); //设置为只读List集合
              list = Collections.unmodifiableList(list);
              System.out.println(list);
              Set<String> set = new HashSet<>();
              set.add("Mysql教程");
              set.add("Linux服务器器教程");
              set.add("Git教程");
              //设置为只读Set集合
              set = Collections.unmodifiableSet(set);
              System.out.println(set);
              Map<String, String> map = new HashMap<>();
              map.put("key1", "课程1");
              map.put("key2", "课程2");
              //设置为只读Map集合
              map = Collections.unmodifiableMap(map);
              System.out.println(map);
      
      
      
      
      
      
      

       

 

第5集 Java集合框架元素排序之Comparable排序接口讲解

简介:讲解Java集合元素排序接口Comparable讲解

  • 什么是Comparable

    public interface Comparable<T> {
        public int compareTo(T o);
    }
    • 是一个接口,定制排序规则

    • 对实现它的每个类的对象进行整体排序,里面 compareTo 方法是实现排序的具体方法

    • 比如TreeSet、SortedSet、Collections.sort() 方法调用进行排序

    • String、Integer等类默认实现了这个接口,所以可以排序(看源码)

 

  • 详解compareTo方法

    • 用于比较次对象和指定对象的顺序,o为要比较的对象

    • 返回int类型

      • 大于0, 表示this大于传进来的对象o ,则往后排,即升序

      • 等于0,表示this等于传进来的对象o

      • 小于0,表示this小于传进来的对象o

 

  • 需求:根据学生的年龄进行排序

​
public class TestCom {
    public static void main(String [] args) {
​
        Set<Student> studentSet = new TreeSet<>();
        studentSet.add(new Student("jack",32));
        studentSet.add(new Student("tom",22));
        studentSet.add(new Student("mary",35));
        studentSet.add(new Student("tim",11));
        studentSet.add(new Student("tony",49));
        studentSet.add(new Student("dd",30));
​
​
        System.out.println(studentSet);
​
     }
}
​
​
 class Student implements Comparable{
    private int age;
​
    private String name;
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public int getAge() {
        return age;
    }
​
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getName() {
        return name;
    }
​
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
​
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
​
    @Override
    public int compareTo(Object o) {
        if(o instanceof Student){
            Student student = (Student)o;
            return this.age - student.age;
        }
​
        //返回的数是0代表两个对象相同
        return 0;
    }
}




 

第6集 新版JDK之Objects 工具类实战

简介:讲解Objects工具类重点方法使用

  • Objects工具类讲解

    • jdk1.7引进的工具类,都是静态调用的方法,jdk1.8新增了部分方法

    • 重点方法

      • equals

        • 用于字符串和包装对象的比较,先比较内存地址,再比较值

      • deepEquals

        • 数组的比较,先比较内存地址,再比较值,如String/char/byte/int数组, 或者包装类型Integer等数组

      • hashCode

        • 返回对象的hashCode,若传入的为null,返回0

      • hash

        • 传入可变参数的所有值的hashCode的总和,底层调用Arrays.hashCode

 

  • 可变参数(只能在最后一个参数里面加)

        public static int hash(Object... values) {
            return Arrays.hashCode(values);
        }
    
    
    
    

     

第7集 新版JDK之重写HashCode和Equals实战

简介:讲解对象的HashCode和equals方法使用

  • HashCode方法

    • 顶级类Object里面的方法,所有类都是继承Object的,返回值int类型

    • 根据一定的hash规则(存储地址,字段,或者长度等),映射成一个数值,即散列值

  • Equals方法

    • 顶级类Object里面的方法,所有类都是继承Object的,返回值boolean类型

    • 根据自定义的匹配规则,用于匹配两个对象是否一样, 一般逻辑是如下

    • //判断地址是否一样
      //非空判断和class类型判断
      //强转
      //对象里面的字段一一匹配
  • 重写规则

     class User {
        private int age;
        private String name;
        private Date time;
        //省略setter和getter方法
    ​
        @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) &&
                     Objects.equals(time, student.time);
         }
    ​
         @Override
         public int hashCode() {
    ​
             return Objects.hash(age, name, time);
         }
    ​
    }
    
    
    

     

  • 问题:当向集合中插入对象时,如何判别在集合中是否已经存在该对象,比如Set确保存储对象的唯一,并判断是不是同个对象呢?

    • 依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法

    • 判断两个对象是否一样,首先判断插入obj的hashcode值是否存在,hashcode值不存在则直接插入集合,值存在则还需判断equals方法判断对象是否相等

     

第8集 本章课程作业练习题布置

简介: 根据本章知识点布置课程作业

  • 使用Collection统计下面每个字出现的次数

"*Constructs a new <tt>HashMap</tt> 小滴课堂 with the same mappings as the * 小滴课堂 specified <tt>Map</tt>.  The <tt>HashMap</tt> is created with default load factor (0.75) and an initial capacity sufficient to*hold the mappings in the specified <tt>Map</tt>."
  • A、B用户订单列表里面的 交集(2种方式),差集(2种方式),并集,去重并集, 以下是部分代码

​
        List<VideoOrder> videoOrders1 = new ArrayList<>();
​
        videoOrders1.add(new VideoOrder("a课程", 22));
        videoOrders1.add(new VideoOrder("w课程", 200));
        videoOrders1.add(new VideoOrder("c课程", 100));
        videoOrders1.add(new VideoOrder("d课程", 33));
        videoOrders1.add(new VideoOrder("f课程", 1));
​
​
        List<VideoOrder> videoOrders2 = new ArrayList<>();
        videoOrders2.add(new VideoOrder("a课程", 22));
        videoOrders2.add(new VideoOrder("b课程", 18));
        videoOrders2.add(new VideoOrder("d课程", 33));
        videoOrders2.add(new VideoOrder("f课程", 1));
        videoOrders2.add(new VideoOrder("z课程", 22));
        
        
        
        
class VideoOrder {
​
    private int price;
​
    private String title;
​
    public VideoOrder(String title, int price) {
        this.title = title;
        this.price = price;
    }
​
  
    public int getPrice() {
        return price;
    }
​
    public void setPrice(int price) {
        this.price = price;
    }
​
    public String getTitle() {
        return title;
    }
​
    public void setTitle(String title) {
        this.title = title;
    }
​
}




第9集 本章课程作业常见问题和答案解析

简介: 讲解课程作业常见问题和答案解析

  • 使用Collection统计下面每个字出现的次数

            //1.字符串
                    String str = "*Constructs a new <tt>HashMap</tt> 小滴课堂 with the same mappings as the * 小滴课堂 specified <tt>Map</tt>.  The <tt>HashMap</tt> is created with default load factor (0.75) and an initial capacity sufficient to*hold the mappings in the specified <tt>Map</tt>.";
    ​
            //2.把字符串转换为数组
            char[] charArr = str.toCharArray();
    ​
            //3.创建一个Map
            Map<Character, Integer> counterMap = new HashMap<>();
    ​
            //4.遍历数组,得到每个字符
            for (int i = 0; i < charArr.length; i++) {
    ​
                //5、拿得到的字符作为健到集合中去找值。
                Integer value = counterMap.get(charArr[i]);
    ​
                if(value ==null){
                    //把字符作为键,1为值存入集合,
                    counterMap.put(charArr[i], 1);
    ​
                }else{
    ​
                    //把值加1重新写入集合
                    value +=1;
                    counterMap.put(charArr[i], value);
                }
    ​
            }
    ​
            //6.遍历输出
            Set<Map.Entry<Character, Integer>> entrySet = counterMap.entrySet();
    ​
            for (Map.Entry<Character, Integer> entry : entrySet) {
                System.out.println(entry.getKey()+" 字符出现次数="+entry.getValue());
            }
    ​
         }
    

     

  • A、B用户订单列表里面的 交集(2种方式),差集(2种方式),并集,去重并集

    ​
    public class QuestioinTest {
        public static void main(String[] args) {
    ​
            List<VideoOrder> videoOrders1 = new ArrayList<>();
    ​
            videoOrders1.add(new VideoOrder("a课程", 22));
            videoOrders1.add(new VideoOrder("w课程", 200));
            videoOrders1.add(new VideoOrder("c课程", 100));
            videoOrders1.add(new VideoOrder("d课程", 33));
            videoOrders1.add(new VideoOrder("f课程", 1));
    ​
    ​
            List<VideoOrder> videoOrders2 = new ArrayList<>();
            videoOrders2.add(new VideoOrder("a课程", 22));
            videoOrders2.add(new VideoOrder("b课程", 18));
            videoOrders2.add(new VideoOrder("d课程", 33));
            videoOrders2.add(new VideoOrder("f课程", 1));
            videoOrders2.add(new VideoOrder("z课程", 22));
    ​
    ​
            //交集
            //videoOrders1.retainAll(videoOrders2);
            //System.out.println(videoOrders1);
    ​
            List<VideoOrder> intersectionList = new ArrayList<>();
            for(VideoOrder videoOrder: videoOrders1){
                if(videoOrders2.contains(videoOrder)){
                    intersectionList.add(videoOrder);
                }
            }
    ​
            System.out.println("交集="+intersectionList);
    ​
    ​
    ​
            //videoOrders1差集
            //videoOrders1.removeAll(videoOrders2);
            //System.out.println(videoOrders1);
            List<VideoOrder> diffList1 = new ArrayList<>();
            for(VideoOrder videoOrder: videoOrders1){
                if(!videoOrders2.contains(videoOrder)){
                    diffList1.add(videoOrder);
                }
            }
            System.out.println("订单1差集="+diffList1);
    ​
    ​
    ​
            //videoOrders2差集
            //videoOrders2.removeAll(videoOrders1);
            //System.out.println(videoOrders2);
    ​
            List<VideoOrder> diffList2 = new ArrayList<>();
            for(VideoOrder videoOrder: videoOrders2){
                if(!videoOrders1.contains(videoOrder)){
                    diffList2.add(videoOrder);
                }
            }
            System.out.println("订单2差集="+diffList2);
    ​
    ​
    ​
            //并集
            //videoOrders1.addAll(videoOrders2);
            //System.out.println(videoOrders1);
    ​
    ​
            //去重并集
            //Set<VideoOrder> set = new HashSet<>(videoOrders1);
            //System.out.println(set);
    ​
        }
    }
    ​
    ​
    class VideoOrder {
    ​
        private int price;
    ​
        private String title;
    ​
        public VideoOrder(String title, int price) {
            this.title = title;
            this.price = price;
        }
    ​
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            VideoOrder that = (VideoOrder) o;
            return price == that.price &&
                    Objects.equals(title, that.title);
        }
    ​
        @Override
        public int hashCode() {
    ​
            return Objects.hash(price, title);
        }
    ​
        public int getPrice() {
            return price;
        }
    ​
        public void setPrice(int price) {
            this.price = price;
        }
    ​
        public String getTitle() {
            return title;
        }
    ​
        public void setTitle(String title) {
            this.title = title;
        }
    ​
        @Override
        public String toString() {
            return "VideoOrder{" +
                    "price=" + price +
                    ", title='" + title + '\'' +
                    '}';
        }
    }
    
    
    
    

     

第10集 集合框架Collection初步总结

简介:集合框架Collection初步总结

  • 回顾知识点

 

 

 

 

 

 

 

干货文档

                                                        关注公众号发送:“CSDN干货文档”  即可领取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值