首页 > 编程语言 >java day13 Set集合 & Map集合 & Stream流

java day13 Set集合 & Map集合 & Stream流

时间:2024-11-17 19:19:51浏览次数:3  
标签:Map Set Stream map System println 集合 out

目录

​编辑

1.Set集合:

  1.Set集合的特点:

   2.HashSet的底层原理:

​编辑

   3.LinkedHashSet集合的底层原理:

   4.TreeSet集合:

2.Map集合:

  1.Map集合概述:

  2.Map集合的常用方法:

3.Map集合的遍历方式:

   4.Map集合的实现类:

3.Stream流:

1.获取流的方法:

2.流的中间方法:

3.流的终结方法(返回值不是Stream的方法):

  (1).获取值:

(2).获取集合或数组:



1.Set集合:

  1.Set集合的特点:

Set和List 都为单列集合

   2.HashSet的底层原理:

无序 不重复 无索引

重写equals和hashcode是为了在 HashSet和LinkedHashSet中能去重

 HashSet的存储原理:

如果:

扩容到原来的2倍

链表转换成红黑树的条件:

   3.LinkedHashSet集合的底层原理:

总结: 哈希表 + 双向链表

有序(存取有序)就是通过双向链表实现的 

   4.TreeSet集合:

TreeSet 提供比较规则:

注意:TreeSet的去重逻辑为 比较器中返回0则证明两元素相同则去除

   1.使用TreeSet(Comprator c) 构造方法创建集合指定比较规则 传入一个Comprator接口的实现

类对象因为只用一次所以可以用匿名内部类并且这个接口时函数式接口所以可以用lambda表达式来简化

   2. 让自定义类实现Comparable接口 重写 compare To 方法

  注意如果1,2同时存在时1优先执行

方式1:

public static void main(String[] args) {
        //TreeSet: 排序,不可重复, 不支持索引
        //对于Integer,Double这样的数值,默认都是从小到大排序

        //Set<Integer> is = new TreeSet<>();
        //如果我要从大到小排序呢? 使用重载的构造方法 TreeSet(Comparator c),指定比较规则
        /*
            @FunctionalInterface
                public interface Comparator<T>{
                    //比完的结果  >0 o1>o2   <0: o1<o2  =0  重复
                    int compare(T o1, T o2);
                }
         */
        Set<Integer> is = new TreeSet<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });

        is.add(10);
        is.add(2);
        is.add(5);
        is.add(5);
        is.add(8);

        System.out.println(is);
    }

方式2:

public 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 String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    //提供默认的比较规则
    @Override
    public int compareTo(Student o) {
        return this.age-o.getAge();
    }
}
public static void main(String[] args) {
        TreeSet默认要对元素排序
        TreeSet去除重复的规则: 比较的方法如果返回0,证明该元素已经存在,则不存储
        /*Set<Student> stus = new TreeSet<>((s1,s2)->{
            return s2.getAge()-s1.getAge();
        });*/
        ClassCastException: 类型转换异常, 无法将Student转换为Comparable
        
            如果TreeSet要存储自定义的对象,并且不想给他传递比较器,
            自定义的类必须实现Comparable接口,重写compareTo方法,用于提供默认的比较规则
         
        Set<Student> stus = new TreeSet<>();

        //想让TreeSet存储元素自定义的对象, 不需要传递比较器,也可以
        stus.add(new Student("张三",23));
        stus.add(new Student("李四",27));
        stus.add(new Student("王五",25));
        stus.add(new Student("赵六",26));
        stus.add(new Student("张三",23));

        System.out.println(stus);
    }

2.Map集合:

  1.Map集合概述:

双列集合

        

Map类集合和Set类集合的底层实现原理相同所以特点相同

  2.Map集合的常用方法:

注意单列集合的添加方式为add(Collection) 双列集合Map为put

注意:put方法返回值如果key重复返回被覆盖元素的值 如果key没有重复返回null

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

        添加
        map.put("杨过","小龙女");
        map.put("尹志平","小龙女");
        map.put("耶律齐","郭芙");

        clear()清空集合
        //map.clear();

        size():获取元素个数
        System.out.println(map.size());

        isEmpty(): 判断集合是否为空
        System.out.println(map.isEmpty());

        get(key): 根据键获取值
        System.out.println(map.get("杨过"));

        remove(key): 根据键删除键值对
        map.remove("尹志平");

        containsKey(key):判断当前集合中有没有指定的键
        System.out.println(map.containsKey("杨过"));

        containsValue(value): 判断当前集合中有没有指定的值
        System.out.println(map.containsValue("小龙女"));

        Set keySet(): 获取所有的键,并且放到一个Set集合中返回
        Set<String> keys = map.keySet();
        System.out.println(keys);

        Collection values(): 获取所有的值, 并且放到一个Collection集合中返回
        Collection<String> values = map.values();
        System.out.println(values);
        System.out.println(map);


    }

3.Map集合的遍历方式:

 Map<String,String> map = new HashMap<>();

        map.put("001","张三");
        map.put("002","李四");
        map.put("003","王五");
        map.put("004","赵六");

        //1. 遍历集合  键找值
        Set<String> keys = map.keySet();
        for (String key : keys) {
            //key键,value值
            String value = map.get(key);
            System.out.println(key+"----->"+value);
        }

方式2:

 entries为一个set单列集合 集合中的元素都为 实现了Map.Entry这个接口中的接口的实现类对象 

这个实现类对象中重写了两个Entry的抽象方法 getKey 和 getValue  并却每一个对象都存储了map对象的一对键值

 //2.键值对遍历方式  Set entrySet():用于获取所有键值对对象的集合  Map.Entry对应的对象中,都封装了一个键,一个值
        Set<Map.Entry<String, String>> es = map.entrySet();
        for (Map.Entry<String, String> e : es) {
            //getKey():用于获取键,  getValue()用于获取值
            String key = e.getKey();
            String value = e.getValue();
            System.out.println(key+"----->"+value);
        }

第三种方法:

//3.forEach()遍历, 底层依然是增强for
        /*
            大消费者接口:
            public interface BiConsumer<T, U> {
                 //方法是消费的方法, 参数就是用于消费的数据
                 void accept(T t, U u);
            }
         */
        map.forEach(new BiConsumer<String, String>() {
            //底层增强for遍历的时候,每次循环,都会调用一次accept方法, 把当前键值对对象的键和值作为参数传递进来
            @Override
            public void accept(String key, String value) {
                System.out.println(key+"----->"+value);
            }
        });

        System.out.println("=======");
        map.forEach((key,value)->{
            System.out.println(key+"----->"+value);
        });

   4.Map集合的实现类:

 

 

3.Stream流:

1.获取流的方法:

获取Stream流对象 1.集合stream() 方法 2. 数组调用Arrays.stream(数组)静态方法   散装数据 Stream.of(可变参数)

可变参数:格式:数据类型... 变量名

                  特点: 传递任意多个参数都可以

                  本质: 数组

public class Test {

    public static void main(String[] args) {
        //集合的流对象获取  stream()
        List<String> list = new ArrayList<>();
        Stream<String> s1 = list.stream();
        System.out.println(s1);

        //数组的流对象获取  Arrays.stream(数组)
        String[] names = {"a", "b", "c"};
        Stream<String> s2 = Arrays.stream(names);
        System.out.println(s2);

        //散装的数据  Stream.of(多个数据)
        Stream<String> s3 = Stream.of("a", "b", "c", "d", "e");
        System.out.println(s3);

        //调用含有可变参数的方法
        show("1","2","3");
        String[] aa = {"a","b","c"};
        show(aa);
    }

    //...叫可变参数, 数量可以变化, 你传递0个,1个,2个...
    //可变参数本质上就是个数组
    public static void show(String... names) {
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }
    }
}

2.流的中间方法:

public static void main(String[] args) {
        List<Integer> nums = new ArrayList<>();
        nums.add(6);
        nums.add(3);
        nums.add(3);
        nums.add(9);
        nums.add(1);

        //sorted(): 排序
        nums.stream().sorted().forEach(s-> System.out.println(s));

        //sorted(Comparator c): 排序指定比较规则
        nums.stream().sorted((i1,i2)-> i2-i1).forEach(s-> System.out.println(s));

        //limit(n): 限制获取前n个元素
        nums.stream().limit(2).forEach(System.out::println);

        //skip(n) : 跳过前n个元素, 使用后面的元素
        nums.stream().skip(2).forEach(System.out::println);

        //distinct() : 用于去重
        nums.stream().distinct().forEach(System.out::println);

        //map(): 完成转换, 把A类型的数据转换成B类型的数据返回
        /*
            JDK提供的用于完成数据类型转换的接口
            @FunctionalInterface
            public interface Function<T, R> {
                //把T类型的数据转换成R类型的数据返回
                R apply(T t);
            }
         */
        //需求: 数据源 中的整数 转换成字符串  6b, 3b
        /*nums.stream().map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) {
                return integer+"b";
            }
        }).forEach(System.out::println);*/
        //nums.stream().map((i)->{return i+"b";}).forEach(System.out::println);
        //nums.stream().map(i -> i + "b").forEach(System.out::println);


        //Static Stream concat(Stream s1, Stream s2): 合并两个流到一个流中
        Stream<Integer> s1 = Stream.of(1, 2, 3);
        Stream<Integer> s2 = Stream.of(4, 5, 6);

        Stream.concat(s1,s2).forEach(System.out::println);

    }

3.流的终结方法(返回值不是Stream的方法):

  (1).获取值:

max min的返回值为Optional类的实例对象 Optional里有实例方法get()get返回值为Stream泛型元素类型

(2).获取集合或数组:

collect方法的参数为实现 Collector接口的实现类对象 注意Collector有非常多的抽象方法 所以不是函数式接口并不用匿名内部类

Collectors是一个JVM提供的工具类 其中的静态方法 toList()返回值为返回一个收集器的实现类对象

Stream中的实例函数collect利用收集器对象 把数据存储到哟个List单列集合中并返回

toSet同样道理返回Set集合中

注意toArray返回值必须为Object类型数组

标签:Map,Set,Stream,map,System,println,集合,out
From: https://blog.csdn.net/moskidi/article/details/143729090

相关文章

  • 集合类源码浅析のJDK1.8ConcurrentHashMap(上篇)
    文章目录前言一、概述二、CHM的属性1、属性三、新增方法1、put2、initTable四、分段计数1、addCount2、fullAddCount3、sumCount总结前言  本篇是JDK1.8的ConcurrentHashMap源码个人学习笔记,ConcurrentHashMap(笔记中简称CHM)是一种线程安全的HashMap,1.8中废弃了......
  • 集合类源码浅析のJDK1.8ConcurrentHashMap(下篇)
    文章目录前言一、分段扩容1、addCount2、transfer3、helpTransfer二、查询二、删除总结前言  主要记录ConcurrentHashMap(笔记中简称CHM)的查询,删除,以及扩容方法的关键源码分析。一、分段扩容1、addCount  扩容的逻辑主要在addCount方法的后半段:private......
  • 爱码单车队-冲刺集合
    冲刺集合:日志名称日期当天完成工作量(一个量化指标)剩余工作量已完成工作量占总工作量百分比冲刺日志1(https://www.cnblogs.com/aaaauv/p/18550348)2024-11-1152516.67%冲刺日志2(https://www.cnblogs.com/aaaauv/p/18550688)2024-11-12101550.00%冲刺日志3......
  • Java集合框架高频面试问题精粹(下篇)
    书接上回,上一篇文章介绍了Java集合常见面试题全解(上),反响不错,也有很多同学发表了自己的观点,这次又来了,这次是Java集合常见面试题总结(下)了,主要讲解了Map集合原理,它的使用频率也是很高。那么它的存储结构和实现原理是怎么样的呢一、Collections工具类(不重要)Collections 工......
  • MapReduce经典案例————数据去重
    目录一、问题介绍二、实验工具 三、案例实现1.打开idea,单击“file->new->project”,设置项目名称为“Hadoop_test”,在对话框下部的“Advanced Settings”中设置Groupid为“cn.lyy”。​编辑2.从左侧项目结构中打开pom.xml,并输入如下依赖:​编辑 2.1pom.xml:3.从左......
  • IDEA不使用lombok,如何快速生成get和set方法
    前言大家好,我是小徐啊。我们在开发Java应用的时候,对于实体类,一般是entity或者pojo类,需要设置好属性的get和set方法。这是比较普通的操作。当然,现在已经有lombok这个插件和依赖来帮助我们不用写get和set方法了。不过,对于一些老系统,我还是习惯于手写get和set方法。当然,IDEA提供了......
  • 温故知新,基于播客形式学习英语之EnglishPod 365, Elementary集合41-50(音频、原文、讲
    未经作者授权同意,请勿随意转载!!!(https://www.cnblogs.com/taylorshi/p/18550339)简介Enishpod是一家公司叫做PraxisLanguage推出的收费讲座,相比较ESLPod,EnishPod为常速。Enishpod极具趣味性,两位主持人Marco和Amira的讲解很生动幽默,完全有别于新概念类型听力的乏味。同时,Enis......
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验一(下)----空间数据的编辑与处理(超超超详细
    续上篇博客(长期更新)《零基础入门ArcGIS(ArcMap)》实验一(上)----空间数据的编辑与处理(超超超详细!!!)-CSDN博客继续更新        本篇博客内容为道路拓扑检查与修正,有对本实验实验目的、实验介绍有不了解的,可以看下上篇博客。        上篇博客有宝子私信我下载......
  • Java集合框架
    一.综述Java集合框架分为(1)Collection和(2)Map Collection,主要由List、Set、Queue组成,Map,代表键值对的集合,典型代表就是HashMap。二.collection框架由List,Set和Queen组成。(1)List 代表有序可重复的集合 典型代表就是封装了动态数组的ArrayList和封装了链表的LinkedLi......
  • SCB-Dataset3:首个涵盖从幼儿园到大学的多行为类别学生课堂行为检测数据集
    2023-10-04,由成都东软学院创建首个涵盖从幼儿园到大学的多行为类别学生课堂行为检测数据集(SCB-dataset3),这个数据集通过提供丰富的学生行为图像和标签,为自动检测学生课堂行为提供了重要的资源,有助于分析学生课堂表现和提高教学效果。数据集地址:学生课堂行为数据集(SCB-dataset......