集合深入------理解底层。

news2024/9/21 20:51:28

集合的使用

前提:栈、堆、二叉树、hashcode、toString()、quesalus()的知识深入和底层理解。

1、什么是集合

集合就是咋们所说的容器
​
前面我们学习过数组  数组也是容器
​
容器:装东西的  生活中有多少的容器呀?  水杯  教室  酒瓶  水库  只要是能装东西的 都可以看成是容器
​
我们这个集合的容器 是用来装啥的呢?  装数据?
​
数据? 一切可以被计算机识别的 文字  图片  视频  音频都是数据
​
说白了 我们今天所学习的这个集合 就跟前面的数组类似  只是底层的实现不一样而已

2、集合的分类

主要根据我们的值的个数 可以分成 单例集合 和  双列集合
​
单例集合:简单的说 在这个容器中存放的的值 就是一个一个的  value
   单列集合的爹:Collection
​
双列集合:他在容器中存储的数据就是  键值对  key---value
   双列集合的爹:Map

3、单列集合

3.1、List集合
3.1.1、ArrayList
ArrayList<E>   这个集合中的泛型:表示的意思其实就是对这个容器中能存放数据类型的一种约束  比如我们的泛型的数据类型是:User  那么这个容器中只能存放User类型的数据
​
这个ArrayList底层就是数组 他是有序的  地址空间是连续的  地址空间连续 就意味着能通过开始地址+偏移量来为访问 而且能重复添加数据
​
有序:一定能通过下标访问数据
​
List中所有的内容都是可以重复的....
3.1.1.1、集合的使用
public class ArrayListTest {
​
    public static void main(String[] args) {
        //第一种方式
        List<String> list = new ArrayList<>();
        //接下来就可以向这个集合中存放数据了...
        list.add("123");
        list.add("456");
        list.add("789");
        list.add("789");
​
        List<String> list2 = new ArrayList<>();
        //接下来就可以向这个集合中存放数据了...
        list.add("12322");
        list.add("45622");
​
​
        //将list2集合中的数据 添加到 list中来
        list.addAll(list2);
​
​
        //能不能删除数据呢?
        //这个就是直接删除某一个元素
        list.remove("789");
​
        //还可以通过下标删除
        list.remove(0);
​
​
        //接下来玩下修改呢?
        list.set(0,"小波波");
​
        //获取某一个位置的元素
        String s = list.get(0);
​
        //判断这个集合中是否存在某一个元素
        boolean contains = list.contains("789");
​
        //判断集合是否为空
        boolean empty = list.isEmpty();
​
        //返货某一个元素的下标位置
        int i = list.indexOf("789");
​
        //截取集合中指定位置的元素 生成一个新的集合
        List<String> stringList = list.subList(0, 5);
​
        System.out.println("list集合的size:"+list.size());
​
        List<User> userList=new ArrayList<>();
        userList.add(new User(1,"小小","123"));
        userList.add(0,new User(0,"这里是测试","xxx"));
​
        System.out.println("userList集合的size:"+userList.size());
        System.out.println("userList中的数据是:"+userList.get(0));
    }
}
public class ArrayListTest1 {
​
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        //接下来就可以向这个集合中存放数据了...
        list.add("123");
        list.add("456");
        list.add("789");
        list.add("789");
​
        //第一种遍历方式:因为这个ArrayList本身底层是数组(Object类型的数组) 数组地址空间连续 所以我们能通过下标来访问
        for (int i = 0; i <list.size() ; i++) {
            System.out.println("集合中的值:"+list.get(i));
        }
        System.out.println("------------------------------");
​
​
        //第二种遍历方式 通过增强的for循环来玩
        for (String val:list){
            System.out.println("集合中的值:"+val);
        }
​
​
        System.out.println("------------------------------");
​
​
        //第三种遍历方式通过JDK8中的stream流来遍历
        list.stream().forEach(val->{
            System.out.println("集合中的值:"+val);
        });
​
        System.out.println("------------------------------");
​
        //第四种遍历方式:迭代器  迭代器的游标问题
        /**
         * 这种情况下不允许对元素进行修改和删除
         *
         * 其实不止是这种情况 在遍历的情况下 逻辑上都允许修改和删除的产生
         */
        Iterator<String> it = list.iterator();
        // it.hasNext():判断下一个节点是否有元素
        while (it.hasNext()){
            //  it.next() :取出当前位置的元素
            String val = it.next();
            System.out.println("通过迭代器取出来的值:"+val);
        }
​
        System.out.println("------------------------------");
​
        //第五种遍历方式
        ListIterator<String> it1 = list.listIterator();
        while (it1.hasNext()){
            String next = it1.next();
            System.out.println("通过迭代器取出来的值:"+next);
        }
    }
}
3.1.2、LinkedList
LinkedList底层是链表 
​
链表中包含 一个一个的链条   每一个链条都包含了两部分
​
当前节点的值  和 下一个元素的地址
​
链表中 数据存储的地址空间不连续  所以不能使用偏移量来访问

输出的值是连续的。

public class LinkedListTest01 {
​
    public static void main(String[] args) {
        //申明对象
        List<String> linkedList1 = new LinkedList<>();
        linkedList1.add("001");
        linkedList1.add("002");
        linkedList1.add("003");
        linkedList1.add("004");
​
        for (int i = 0; i < linkedList1.size(); i++) {
            String val = linkedList1.get(i);
            System.out.println("val:"+val);
        }
        for (String val:linkedList1){
            System.out.println("val:"+val);
        }
​
        linkedList1.stream().forEach(val->{
            System.out.println("val:"+val);
        });
    }
}
​
3.1.3、Vector的使用(不常用)
这个底层也是数组  线程安全的  效率不高
​
这个集合基本不使用 不也用记住
public class VectorTest {
    public static void main(String[] args){
        List<String> vector=new Vector<>();
        vector.add("中国好");
        vector.add("小日子");
        for (int i = 0; i <vector.size() ; i++) {
            System.out.println("数据是:"+vector.get(i));
        }
​
    }
}
3.1.4、Stack(栈)
public class StackTest {
​
   public static void main(String[] args){
    //这个其实是栈的数据结构
​
      Stack<String> list=new Stack<String>();
      list.push("1");
      list.push("2");
      list.push("3");
      list.push("4");
      list.push("5");
​
      System.out.println("pop:"+list.pop());
      System.out.println("pop:"+list.pop());
      System.out.println("pop:"+list.pop());
      System.out.println("pop:"+list.pop());
      System.out.println("pop:"+list.pop());
​
   }
}
3.2、Set集合
逻辑上 Set集合逻辑上是无序的  而且Set集合能排重  不能通过下标直接访问

Set<E> 的爹 依然是Collection   

Set这个接口是所有Set集合的爹

Set排重的原则是啥?
  如果在Set集合中存放的是对象比如User 那么他就首先会去调用这个User中的 hashCode方法 然后获取到当前的这个要添加数据的hashCode值去和已经添加数据的HashCode值 做比较 如果是不等 那么说明肯定不是一个元素 那么直接添加元素  如果是HashCode值 遇到了在已经添加的数据中的HashCode值是相等的话 那么都说明有可能这个值是重复的 如果是这个值是重复的话 那就去调用当前这个对象的equals方法 判断equals方法是不是返回true  如果返回true 那么说明值重复  不添加数据  如果返回的是false  那么说明值 不重复 那么就可以添加数据
3.2.1、Set集合的排重问题(HashSet)
 public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("123");
        set.add("345");
        set.add("234");
        set.add("345");
        System.out.println("数据的个数:" + set.size());
        System.out.println("-----------------------------");
        Set<User> setUser = new HashSet<>();
        setUser.add(new User(1, "小小", "112"));
        setUser.add(new User(1, "小小", "134"));
        setUser.add(new User(1, "小小", "165"));
        setUser.add(new User(1, "小小", "178"));
        System.out.println("数据的个数:" + setUser.size());
    }
public class User {
    private Integer id;
    private String username;
    private String password;
​
    public User(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
​
    public User() {
    }
​
    public Integer getId() {
        return id;
    }
​
    public void setId(Integer id) {
        this.id = id;
    }
​
    public String getUsername() {
        return username;
    }
​
    public void setUsername(String username) {
        this.username = username;
    }
​
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
​
    @Override
    public int hashCode() {
        return this.username.hashCode();
    }
​
    /**
     * 用户名一样 那么我们就认为这是同一个数据
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof User){
            User user= (User) obj;
            return this.username.equals(user.getUsername());
        }
        return false;
    }
}
3.2.2、Set集合的遍历问题(HashSet)
public class HashSetTest1 {
​
    public static void main(String[] args) {
        Set<User> set = new HashSet<>();
        set.add(new User(1,"xiaobobo","123"));
        set.add(new User(-1,"tiedan","777"));
        set.add(new User(3,"gousheng","0"));
        set.add(new User(4,"gouwa","234"));
        set.add(new User(1,"ergouzi","234"));
​
        //通过增强的for循环能访问
        for (User val:set){
            System.out.println("数据:"+val);
        }
​
        System.out.println("--------------------------");
​
        Iterator<User> it = set.iterator();
        while (it.hasNext()){
            User next = it.next();
            System.out.println("拿到的数据是:"+next);
        }
​
        System.out.println("--------------");
        
        set.stream().forEach(user -> {
            System.out.println("读取到的数据是:"+user);
        });
    }
}
​
3.2.3、LinkedHashSet的使用
这个集合的底层是链表
​
这个集合的数据保存是有序的
public class LinkedHashSetTest {
    public static void main(String[] args) {
        Set<User> set = new LinkedHashSet<>();
        set.add(new User(1, "xiaobobo", "123"));
        set.add(new User(-1, "tiedan", "777"));
        set.add(new User(3, "gousheng", "0"));
        set.add(new User(4, "gouwa", "234"));
        set.add(new User(1, "gouwa", "234"));
        Iterator<User> it = set.iterator();
        while (it.hasNext()) {
            User next = it.next();
            System.out.println(next);
        }
    }
}
3.2.4、TreeSet(底层实现是红黑树)
TreeSet和其他的Set集合一样 具有 排重的特性
​
TreeSet的底层是红黑树--->二叉树--->数据结构--->有大小关系
​
TreeSet集合自动具有排序的功能
​
这个排序 就涉及到一个大小的问题
​
自然数的大小  
​
字符串如何比较大小呢?  unicode编码值
3.2.5、两个字符串如何比较大小呢?通过编码
// 在String这个类中为我们提供了这个比较两个字符串大小的方法 
public static void main(String[] args) {
        String str = "Ab";
        String str2 = "Ab";
        /**
         * 返回值 0:表示的是前后相等
         * 返回值-1:表示的是前面小于后面
         * 返回值是1:表示的是前面大于后面
         */
        System.out.println(str2.compareTo(str));
}
3.2.6、TreeSet的使用
TreeSet的底层使用的是红黑树来实现的
3.2.6.1、TreeSet的基本使用
package com.qfedu.edu.collection.set;
​
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
​
​
public class TreeSetTest {
​
    public static void main(String[] args) {
        Set<Integer> set = new TreeSet<>();
        set.add(123);
        set.add(0);
        set.add(345);
        set.add(77);
        set.add(77);
        set.add(89);
​
        //遍历这些数据
        Iterator<Integer> it = set.iterator();
​
        while (it.hasNext()) {
            Integer next = it.next();
            System.out.println("数据是:" + next);
        }
​
        //--------------下面研究字符串的排序------------
        System.out.println("-------------------");
​
        Set<String> setStr = new TreeSet<>();
        setStr.add("Abc");
        setStr.add("Bc");
        setStr.add("Ac");
​
        //遍历这些数据
        Iterator<String> it1 = setStr.iterator();
​
        while (it1.hasNext()) {
            String next = it1.next();
            System.out.println("数据是:" + next);
        }
​
    }
}
​
3.2.6.2、Comparable接口实现对象的比较

1、编写Employee对象

public class Employee implements Comparable<Employee>{
​
    private Integer id;
    private String name;
    private Integer salary;
    private String address;
​
    public Employee(Integer id, String name, Integer salary, String address) {
        this.id = id;
        this.name = name;
        this.salary = salary;
        this.address = address;
    }
​
    public Employee() {
    }
​
    public Integer getId() {
        return id;
    }
​
    public void setId(Integer id) {
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public Integer getSalary() {
        return salary;
    }
​
    public void setSalary(Integer salary) {
        this.salary = salary;
    }
​
    public String getAddress() {
        return address;
    }
​
    public void setAddress(String address) {
        this.address = address;
    }
​
    /**
     * 比较的方法
     *    你需要按照谁排序 那么下面你就按照什么来比较
     *
     *      我要通过薪资排序
     *         薪资是int类型 那么下面就直接做减法
     * @param o the object to be compared.
     * @return
     */
//    @Override
//    public int compareTo(Employee o) {
//        return this.salary-o.getSalary();
//    }
​
    /**
     * 下面演示通过姓名来排序
     *  姓名是字符串类型
     * @param o the object to be compared.
     * @return
     */
 /*   @Override
    public int compareTo(Employee o) {
        return this.getName().compareTo(o.getName());
    }*/
​
    /**
     * 如果薪资不为空 那么按照薪资排序
     *   如果薪资为空 并且姓名不为空 那么按照姓名排序
     *   如果姓名为空 那么就按照id排序....
     * @param o the object to be compared.
     * @return
     */
    @Override
    public int compareTo(Employee o) {
        if(o.getSalary()!=null){
            return this.getSalary()-o.getSalary();
        }else if(o.getName()!=null&&!("".equals(o.getName()))){
            return this.getName().compareTo(o.getName());
        }else{
          return this.id-o.getId();
        }
    }
​
    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                ", address='" + address + '\'' +
                '}';
    }
}
​

2、编写测试类

public class TreeSetTest1 {
​
    public static void main(String[] args) {
​
        Set<Employee> set = new TreeSet<>();
        set.add(new Employee(1,"xiaobobo",3500,"四川成都"));
        set.add(new Employee(2,"xiaowangzi",1800,"四川巴中"));
        set.add(new Employee(3,"tiedan",2600,"四川自贡"));
        set.add(new Employee(4,"gousheng",15000,"四川绵阳"));
        set.add(new Employee(5,"gouwa",2700,"四川德阳"));
​
​
        Iterator<Employee> iterator = set.iterator();
        while (iterator.hasNext()){
            Employee next = iterator.next();
            System.out.println("获取到的数据是:"+next);
        }
    }
}
​
3.2.6.3、使用Comparator来实现对象的排序

1、对象的编写

public class Employee1{
​
    private Integer id;
    private String name;
    private Integer salary;
    private String address;
​
    public Employee1(Integer id, String name, Integer salary, String address) {
        this.id = id;
        this.name = name;
        this.salary = salary;
        this.address = address;
    }
​
    public Employee1() {
    }
​
    public Integer getId() {
        return id;
    }
​
    public void setId(Integer id) {
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public Integer getSalary() {
        return salary;
    }
​
    public void setSalary(Integer salary) {
        this.salary = salary;
    }
​
    public String getAddress() {
        return address;
    }
​
    public void setAddress(String address) {
        this.address = address;
    }
​
​
    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", salary=" + salary +
                ", address='" + address + '\'' +
                '}';
    }
}
​

2、测试的编写

package com.qfedu.edu.collection.set;
​
import com.qfedu.edu.pojo.Employee;
import com.qfedu.edu.pojo.Employee1;
​
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
​
/**
 * @author xiaobobo
 * @title: TreeSetTest
 * @projectName CD-Java-JY-2401-Simple-Parent
 * @description: 这个研究下TreeSet的对象的排序问题
 * @date 2024/3/19  15:26
 */
public class TreeSetTest2 {
​
    public static void main(String[] args) {
​
        Set<Employee1> set = new TreeSet<>(new MyComparator());
        set.add(new Employee1(1,"xiaobobo",3500,"四川成都"));
        set.add(new Employee1(2,"xiaowangzi",1800,"四川巴中"));
        set.add(new Employee1(3,"tiedan",2600,"四川自贡"));
        set.add(new Employee1(4,"gousheng",15000,"四川绵阳"));
        set.add(new Employee1(5,"gouwa",2700,"四川德阳"));
​
        Iterator<Employee1> iterator = set.iterator();
        while (iterator.hasNext()){
            Employee1 next = iterator.next();
            System.out.println("获取到的数据是:"+next);
        }
​
​
    }
​
​
    /**
     * 自定义了一个比较器 这个跟上一个接口是一样的
     */
    static class MyComparator implements Comparator<Employee1>{
        /**
         *
         * @param o1 新数据
         * @param o2 老数据
         *  按照薪资排序  做减法 按照谁排序 就用谁来做比较
         * @return
         */
        @Override
        public int compare(Employee1 o1, Employee1 o2) {
            return o1.getSalary()-o2.getSalary();
        }
    }
}

4、双列的集合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1536971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文速读】| 视觉对抗样本:突破对齐的大语言模型

本次分享论文为&#xff1a;Visual Adversarial Examples: Jailbreak Aligned Large Language Models 基本信息 原文作者&#xff1a;Xiangyu Qi, Peter Henderson, Kaixuan Huang, Ashwinee Panda, Mengdi Wang, Prateek Mittal 作者单位&#xff1a;普林斯顿大学、斯坦福大…

算法打卡day20|二叉树篇09|Leetcode 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

算法题 Leetcode 669. 修剪二叉搜索树 题目链接:669. 修剪二叉搜索树 大佬视频讲解&#xff1a;修剪二叉搜索树视频讲解 个人思路 把这道题想复杂了&#xff0c;还想着如何去重构树 解法 递归法 依旧递归三步走 1.确定递归函数的参数以及返回值 这题递归需要返回值&#…

NVMe开发——NAND Flash的基本原理

1. 存储单元 1.1. 半导体 半导体&#xff08;semiconductor&#xff09;指常温下导电性能介于导体与绝缘体之间的材料。纯净半导体一般是四价原子(如硅或锗)。 1.1.1. P型半导体 P型半导体是通过将一个纯净的半导体材料&#xff08;如硅或锗&#xff09;中掺杂少量的三价杂…

软件管理rpm与yum

源代码包下载 Compare, Download & Develop Open Source & Business Software - SourceForgehttps://sourceforge.net/ rpm包下载 Welcome to the RPM repository on fr2.rpmfind.nethttp://rpmfind.net/linux/RPM/ 软件包管理 1.rpm包管理: 1)查询: 安装…

Linux网络协议栈从应用层到内核层②

文章目录 1、bind 源码剖析2、listen 源码剖析3、accept 源码剖析4、connect 源码剖析客户端调用connect成功&#xff0c;但三次握手并未完成&#xff0c;进程是如何阻塞自己客户端在connect时&#xff0c;如何选择源端口客户发送syn封包以及重传服务端收到syn封包&#xff0c;…

python通过tcp协议发送二进制数据

写c程序时经常会有发送私有化协议的过程&#xff0c;比如头结构数据包&#xff0c;数据包往往是一个结构体&#xff0c;有时为了方便调试会用python写一些测试程序。 发送的包的结构图示例如下&#xff1a; 接收包的结构图如下&#xff1a; 当然接收的RespBody会很多&#xf…

【Flask开发实战】防火墙配置文件解析(三)之python加工处理

一、前言 上一篇文章中&#xff0c;介绍了通过shell脚本读取配置文件获取到IP地址组、服务端口组、规则清单这三个模块类别基础数据。基础数据中还需要进一步进行展开处理&#xff0c;生成三类扩展表。如IP地址组中&#xff0c;同一个地址组下存在多个IP地址&#xff0c;每组I…

sy4文件、目录操作命令-补充find

补充下find的命令实例把&#xff0c;我搜了下发现这篇文章的笔记符合课程的实例&#xff1a; 参考< How to Find a File in Linux | Find Command - GeeksforGeeks> 这里做了实验&#xff0c;给大家参考&#xff1a; Linux, renowned for its robust command-line int…

【GIT】最好用的git可视化教程网站推荐

最好用可视化学习git 网站:https://learngitbranching.js.org/?demo&localezh_CN 玩遍所有关卡&#xff0c;花半天时间便能掌握git &#x1f603; 本地仓库 基础命令介绍 git commit 提交 git branch <分支名> 创建分支 git checkout <分支名> 切换分支 git…

定制红酒:品质与口感,双重保障

在葡萄酒的世界里&#xff0c;云仓酒庄的洒派定制红酒以其卓着的品质和迷人的口感&#xff0c;成为了无数品鉴者的心头好。这款红酒&#xff0c;不仅是对品质的追求&#xff0c;更是对生活的热爱和品味的体现。 云仓酒庄深知品质是红酒的灵魂&#xff0c;因此对洒派定制红酒的品…

栈和队列的学习

存储方式分两类&#xff1a;顺序存储和链式存储 栈&#xff1a;只允许从一端进行数据插入和删除的线性表&#xff1a;先进后出 FILO 队列&#xff1a;只允许从一端进行数据插入&#xff0c;另一端进行数据删除的线性表&#xff1a;先进先出 FIFO 栈 创建空栈&#xff0c;创建…

wmv转换成mp4能无损吗?这样设置~

WMV和MP4是两种不同的视频格式&#xff0c;它们使用不同的编解码算法和容器格式。在将WMV转换为MP4时&#xff0c;通常会发生一定程度的重新编码&#xff0c;因此不能完全保证无损转换。无损转换意味着输出的MP4文件与输入的WMV文件在视听上没有任何质量损失&#xff0c;这在实…

基于springboot的反诈宣传平台

技术&#xff1a;springbootmysqlvue 一、系统背景 反欺诈平台可以对公交信息进行集中管理&#xff0c;可以真正避免传统管理的缺陷。反欺诈平台是一款运用软件开发技术设计实现的应用系统&#xff0c;在信息处理上可以达到快速的目的&#xff0c;不管是针对数据添加&#xff…

spring cloud项目微服务间互相调用使用自定义标注进行鉴权方案

来吧&#xff0c;贴代码。 一、背景 我们有一个项目使用了spring cloud&#xff0c;有的微服务需要调用别的微服务&#xff0c;但这些调用没有鉴权&#xff1b;当初项目时间非常紧&#xff0c;同时这部分微服务有的对外也没有鉴权&#xff0c;在代码中设置了无须鉴权&#xf…

真机笔记(2)项目分析

目录 1. 项目&#xff1a; 2. 网络工程师工作流程 3. 实验 设备命名 登录密码 使用SSH协议 1. 项目&#xff1a; 竞标方&#xff1a;集成商、厂商、代理商、服务商、监理检测公司 在一个网络项目中&#xff0c;不同的角色承担着不同的职责和任务。以下是集成商、厂商、代…

程序人生——Java异常使用建议

目录 引出异常建议110&#xff1a;提倡异常封装&#xff1b;建议111&#xff1a;采用异常链传递异常 建议112&#xff1a;受检异常尽可能转化为非受检异常建议113&#xff1a;不要在finally块中处理返回值 建议114&#xff1a;不要在构造函数中抛异常建议115&#xff1a;使用Th…

VMD + CEEMDAN 二次分解,CNN-Transformer预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…

Data.olllo:一键数据“分组统计”!

引言&#xff1a; 数据统计是数据分析中的重要环节&#xff0c;而如何快速、准确地进行数据分组统计是许多数据工作者关注的焦点。现在&#xff0c;借助Data.olllo的神奇功能&#xff0c;您可以轻松进行一键式的数据分组统计&#xff0c;为您的数据分析提供更强大的支持&…

什么是浏览器指纹识别?指纹浏览器有用吗?

浏览器指纹识别是好是坏&#xff1f;这现在确实是一个有争议的话题。83%的消费者经常或偶尔会根据浏览历史记录看到广告。其实这就是利用了浏览器指纹技术。 如果您想了解浏览器指纹识别是什么&#xff0c;那就看下去&#xff01; 一、什么是浏览器指纹识别 浏览器指纹是指无…

Quartz完全开发手册(一篇学会Quartz所有知识点)

目录 一、Quartz概念 1.1、Quartz介绍 1.2、使用场景 1.3、特点 二、Quartz运行环境 三、Quartz设计模式 四、Quartz学习的核心概念 4.1、任务Job 4.2、触发器Trigger 4.3、调度器Scheduler 五、Quartz的体系结构与工作流程 5.1、体系结构 5.2、工作流程 六、Quar…