对象的比较(数据结构系列12)
目录
前言:
1.PriorityQueue
1.1PriorityQueue的特性
1.2PriorityQueue的构造器
1.3大根堆的创建
1.4PriorityQueue中函数的说明
2.java中对象的比较
2.1基本类型的比较
2.2对象的比较
2.2.1覆写基类的equals
2.2.2基于Comparable接口类的比较
2.2.3基于比较器比较
2.2.4三种方式对比
3.集合框架中PriorityQueue的比较方式
4.top—K问题
结束语:
前言:
1.PriorityQueue
1.1PriorityQueue的特性
我们先来简单的了解一下什么是PriorityQueue,然后再来了解java中的对象比较。
在java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,小编会在后续中给大家来介绍什么是线程安全什么是线程不安全的,我们现在先以PriorityQueue为例进行讲解。
我们先来看一下他是继承自哪些接口的。

我们可以看到他是继承自Queue这个接口的,所以我们以后在使用过程中可以直接使用Queue来定义一个优先级队列出来。
如下所示:
import java.util.PriorityQueue;
import java.util.Queue;public class Test1 {public static void main(String[] args) {PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();//使用接口Queue<Integer> priorityQueue1 = new PriorityQueue<>();}
}
关于PriorityQueue的使用我们需要注意这几方面的问题。
1.使用时必须要导入PriorityQueue所在的包,如下所示:
import java.util.PriorityQueue;
2.PriorityQueue中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出ClassCastException异常。
如下所示:
package 优先级队列;import java.util.PriorityQueue;
class Student{public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}
}
public class Test {public static void main(String[] args) {//下面的是可以的PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();priorityQueue.offer(1);priorityQueue.offer(2);//下面的是插入了两个类,两个类之间是不可以比较大小的PriorityQueue<Student> priorityQueue2 = new PriorityQueue<>();priorityQueue2.offer(new Student(13,"张三"));priorityQueue2.offer(new Student(14,"张三"));}
}

3.不能插入null对象,否则就会抛出NullPointerException。
package 优先级队列;import java.util.PriorityQueue;public class Test1 {public static void main(String[] args) {PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();priorityQueue.offer(null);}
}

4.没有容量限制,可以插入任意多个元素, 其内部可以自动扩容。但是也不说真的就是没有任何容量限制,最大容量为堆的大小。
5.插入和删除元素的时间复杂度为O(log2N)。
6.PriorityQueue 底层使用了堆数据结构。
7.PriorityQueue默认情况下是小堆——即每次获取到的元素都是最小的元素。
如下所示:
import java.util.PriorityQueue;
import java.util.Queue;public class Test2 {public static void main(String[] args) {Queue<Integer> priorityQueue = new PriorityQueue<>();priorityQueue.offer(12);priorityQueue.offer(2);priorityQueue.offer(89);//底层是最小堆实现的System.out.println("堆顶元素是:" + priorityQueue.poll());//2}
}
结果如下所示:

1.2PriorityQueue的构造器
| 构造器 | 功能介绍 |
| PriorityQueue() | 创建一个空的优先级队列,默认容量是11 |
| PriorityQueue(int initialCapacity) | 创建一个初始容量为initialCapacity的优先级队列,注意:initialCapacity不能小于1,否则就会抛IIIegalArgumentException异常。 |
| PriorityQueue(Collection<?extends E> c) | 用一个集合来创建优先级队列。 |
PriorityQueue(Collection<?extends E> c)的实例如下所示:
代码如下所示:
import java.util.*;public class Test3 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);Queue<Integer> priorityQueue = new PriorityQueue<>(list);//先构造list里面的在去构造自己的priorityQueue.offer(23);System.out.println("堆顶元素为:" + priorityQueue.poll());//1}
}
结果如下所示:

1.3大根堆的创建
我们在了解上述PriorityQueue的基本知识之后,我们知道它的底层是由小根堆构成的,那么我们如果是要构建一个大跟堆要怎么构建呢?
我们可以提供一个比较器,如下述代码所示:
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;class IntCmp implements Comparator<Integer>{@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);//由于比较类型是Integer,也可以写作o2 - o1//如果是小根堆就是o1 - o2;}
}
public class Test4 {public static void main(String[] args) {//提供一个从大到小排序的比较器。IntCmp intCmp = new IntCmp();Queue<Integer> priorityQueue = new PriorityQueue<>(intCmp);priorityQueue.offer(1);priorityQueue.offer(2);priorityQueue.offer(4);System.out.println("堆顶元素为:" + priorityQueue.poll());}
}
结果如下所示:

我们发现堆顶元素是最大的,这样我们就通过一个比较器来实现了大根堆的构建了。
1.4PriorityQueue中函数的说明
| 函数名 | 功能介绍 |
| boolean offer(E e) | 插入元素e,插入成功后返回true,如果e对象为空,抛出空指针异常,当空间不够的时候会自动扩容 |
| E peek() | 获取优先级最高的元素,如果优先级队列为空,则返回null |
| E poll() | 移除优先级队列最高的元素并返回,如果优先级队列为空,则返回null |
| int size() | 获取有效元素的个数 |
| void clear() | 清空 |
| boolean isEmpty() | 检测优先级队列是否为空,空返回true |
代码实例如下所示:
import java.util.PriorityQueue;
import java.util.Queue;public class Test5 {public static void main(String[] args) {Queue<Integer> priorityQueue = new PriorityQueue<>();//插入元素priorityQueue.offer(1);priorityQueue.offer(2);priorityQueue.offer(3);priorityQueue.offer(4);priorityQueue.offer(5);priorityQueue.offer(6);//查看优先级队列的队首元素System.out.println("peek一次的队首元素为:" + priorityQueue.peek());//1System.out.println("peek两次的队首元素为:" + priorityQueue.peek());//1//弹出优先级队列的队首元素System.out.println("第一次弹出队首元素为:" + priorityQueue.poll());//1System.out.println("第二次弹出队首元素为:" + priorityQueue.poll());//2//优先级队列的有效元素个数System.out.println("队列中有效元素的个数为:" + priorityQueue.size());//4//判断是否为空System.out.println("clear之前队列是否为空:" + priorityQueue.isEmpty());//false//清空priorityQueue.clear();//判断是否为空System.out.println("clear之后队列是否为空:" + priorityQueue.isEmpty());//true}
}
结果如下所示:

2.java中对象的比较
2.1基本类型的比较
代码如下所示:
public class Test1 {public static void main(String[] args) {int a = 10;int b = 10;;System.out.println("a == b : " + (a == b));//trueSystem.out.println("a > b : " + (a > b));//falseSystem.out.println("a < b : " + (a < b));//falsechar c = 'A';char d = 'B';System.out.println("c == d : " + (c == d));//falseSystem.out.println("c > d : " + (c > d));//falseSystem.out.println("c < d : " + (c < d));//true}
}
结果如下所示:

2.2对象的比较
2.2.1覆写基类的equals
我们直接根据代码来说明问题。
代码如下所示:
class Student{public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}
}
public class Test2 {public static void main(String[] args) {Student student1 = new Student(14,"张三");Student student2 = new Student(14,"张三");
// System.out.println(student1 > student2);
// System.out.println(student1 < student2);System.out.println(student1 == student2);//false}
}
结果如下所示:

在自定义对象中我们是不可以使用 > 和 < 来进行比较的,如下所示:

这里我们就有很多人好奇了,为什么==就可以比较而>和 < 就不可以比较了?我们在继续往下看。
我们根据上述的代码可以看出来student1 和student2 用== 来进行比较是不相等的,但是在我们主观上认为student1和student2是同一个人的话那这个比较的结果就与我们预期的不符,那么为什么会出现这种情况呢?其实我们在进行对象之间的比较的时候我们是根据给每一个对象分配的地址来进行比较的,那么我们给他们分配的地址可定是不一样的,所以就会导致我们的比较结果出现问题,那么我们如果要比较两个地址空间内的内容是否一样我们该怎么进行比较呢?
我们之前也有过了解我们可以根据equals来进行比较,equals是专门用来比较两个地址空间内的内容是否一样的,一样则返回true,不同则返回false。
但是我们在使用之前得重写它的一些方法,否则还是会出现上述的问题,因为对于用户自定义实现的类型,都默认继承自Object类。在Object类中提供了equals方法,而==默认情况下调用的就是equals方法。

当我们重写了equals方法之后就可以进行比较了。快捷方法是在自定义类中使用Alt + Insert选择下面的这个方法一路回车就好了。

生成的equals方法,其中他是和hashCode是同时出现的,这个我们后面在给大家细说。
代码如下所示:
import java.util.Objects;class Student{public int age;public String name;public Student(int age, String name) {this.age = age;this.name = name;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(age, name);}
}
public class Test2 {public static void main(String[] args) {Student student1 = new Student(14,"张三");Student student2 = new Student(14,"张三");
// System.out.println(student1 > student2);
// System.out.println(student1 < student2);
// System.out.println(student1 == student2);//falseSystem.out.println(student1.equals(student2));}
}
结果如下所示:

但是我们又会发现equals的一个缺点就是我们只能判断里面的值是否相同,但是不能判断谁大谁小,这样我们就引入了另一种比较方式,基于Comparable接口的比较。
2.2.2基于Comparable接口类的比较
什么是Comparable接口呢? Comparable接口就是JDK提供的一种泛型的比类接口。具体的源码实现如下所示:

中间的红框内容我们可以直接理解为下面的这些:
返回值:
- <0:表示this指向的对象小于o指向的对象。
- ==0:表示this所指向的对象等于o指向的对象。
- >0:表示this所指向的对象大于o所指向的对象。
对于我们上述代码中自己实现的自定义类Student来说要想用Comparable来进行比较的话我们就只需要实现Comparable接口即可,然后在类中重写CompareTo方法。
代码如下所示:
class Student1 implements Comparable<Student1>{public int age;public String name;public Student1(int age, String name) {this.age = age;this.name = name;}@Overridepublic int compareTo(Student1 o) {return o.age - this.age;}
}
public class Test3 {public static void main(String[] args) {Student1 student1 = new Student1(14,"李四");Student1 student12 = new Student1(14,"李四");System.out.println(student1.compareTo(student12));}
}
结果如下所示:
2.2.3基于比较器比较
我们如果是按照上述的Comparable接口进行比较的话我们就会把方法写死了,我们就只能按一个来进行比较,比如上述中的Student是按照age来进行排序的,按照比较器方式进行比较,具体步骤如下:
用户自定义比较器类,实现Comparator接口。
代码如下所示:
import java.util.Comparator;class Student2{public int age;public String name;public Student2(int age, String name) {this.age = age;this.name = name;}
}//按照年龄进行比较
class AgeInCmp implements Comparator<Student2> {@Overridepublic int compare(Student2 o1, Student2 o2) {return o1.age - o2.age;}
}
//按照姓名进行比较
class NameInCmp implements Comparator<Student2> {@Overridepublic int compare(Student2 o1, Student2 o2) {return o1.name.compareTo(o2.name);}
}public class Test4 {public static void main(String[] args) {Student2 student21 = new Student2(14,"李四");Student2 student22 = new Student2(14,"张四");AgeInCmp ageInCmp = new AgeInCmp();NameInCmp nameInCmp = new NameInCmp();System.out.println(ageInCmp.compare(student21,student22));System.out.println(nameInCmp.compare(student21,student22));}
}
结果如下所示:
2.2.4三种方式对比
| 覆写的方法 | 说明 |
| Object.equals | 因为所有类都是继承自Object的,所以直接覆写即可,不过只能比较相等与否 |
| Comparable.compareTo | 需要手动实现接口,侵入性比较,但一旦实现,每次用该类都有顺序,属于内部顺序,不够灵活。 |
| Comparator.Compara | 需要实现一个比较器对象,对待比较类的侵入性弱,但对于算法代码实现侵入性强 |
3.集合框架中PriorityQueue的比较方式
集合框架中的PriorityQueue底层使用结构,因此其内部的元素,必须要能够比较大小,PriorityQueue采用了Comparator和Comparable两种方式。
- Comparable是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparable接口,并覆写ComparaTo方法。
- 用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现Comparator接口并覆写compare方法。
我们可以使用比较器创建大跟堆。
1.我们可以采用传比较器的方法来进行构建。
代码如下所示:
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
class InCmp implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}
}
public class Test6 {public static void main(String[] args) {//1.采用传送传感器来进行比较InCmp inCmp = new InCmp();Queue<Integer> priorityQueue = new PriorityQueue<>(inCmp);priorityQueue.offer(1);priorityQueue.offer(2);priorityQueue.offer(3);System.out.println("堆的根结点是:" + priorityQueue.peek());}
}
结果如下所示:
2.我们也可以采用匿名内部类法。
代码如下所示:
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;public class Test7 {public static void main(String[] args) {//2.匿名内部类法Queue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});priorityQueue.offer(1);priorityQueue.offer(2);priorityQueue.offer(3);System.out.println("堆的根结点是:" + priorityQueue.peek());}
}
结果如下所示:
3.lambda表达式法。
这个大家先做一个了解,后期小编会主要和大家讲解的。
代码如下所示:
import java.util.PriorityQueue;
import java.util.Queue;public class Test8 {public static void main(String[] args) {//3.lambda表达式Queue<Integer> priorityQueue = new PriorityQueue<>(((o1, o2) -> {return o2.compareTo(o1);}));priorityQueue.offer(1);priorityQueue.offer(2);priorityQueue.offer(3);System.out.println("堆的根结点是:" + priorityQueue.peek());}
}
结果如下所示:
4.top—K问题
问题描述:即求数据集合中前k个最大的元素或者是最小元素,一般情况下数据量都比较大。
比如专业前十名,世界500强,富豪榜,游戏中前100的活跃玩家等。
我们就可以用优先级队列来解决这个问题了,我们将这些建成大跟堆来弹出前k个元素。
代码如下所示:
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
class InCmp implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}
}
public class Test1 {public static void find_Top_k(int[] array, int k) {int[] ret = new int[array.length];InCmp inCmp = new InCmp();Queue<Integer> maxHeap = new PriorityQueue<>(inCmp);for (int i = 0; i < array.length; i++) {maxHeap.offer(array[i]);}System.out.println("前" + k + "个是:");for (int i = 0; i < k; i++) {System.out.print(maxHeap.poll() + " ");}}public static void main(String[] args) {int[] array = {1,22,1,2,3,4,51,47,43,15,55,5,6,7,64};int k = 4;find_Top_k(array,k);}
}
结果如下所示:
结束语:
好啦这节小编就与大家分享到这里啦,里面有些可能大家还是有些看不懂,不重要大家可以先记着它,后期小编会一个一个给大家解释的,希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)
相关文章:
对象的比较(数据结构系列12)
目录 前言: 1.PriorityQueue 1.1PriorityQueue的特性 1.2PriorityQueue的构造器 1.3大根堆的创建 1.4PriorityQueue中函数的说明 2.java中对象的比较 2.1基本类型的比较 2.2对象的比较 2.2.1覆写基类的equals 2.2.2基于Comparable接口类的比较 2.2.3基于…...
31.下一个排列
1. 题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地&…...
ToBeWritten之理解嵌入式Web HTTP协议
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...
顶级程序员的成长之路1
本文关注的问题是程序员的水平究竟应该按照什么样的不同层级而逐渐提高?或者说,在学习编程的过程中,每一个阶段究竟应当设定什么样的目标才比较合理?本文的内容主要借鉴了周伟明先生的专栏文章《程序员的十层楼》[86]。注意本文讨…...
第三代api自动化测试框架使用教程(pytest+allure+sql+yaml)
使用教程一、配置1、环境配置2、框架配置3、启动入口二、用例编写1、用例模板2、参数依赖写法2、函数(方法插件)写法3、接口上传文件和表单参数4、接口上传json参数5、接口无数据填写6、code断言7、body断言7、json断言8、sql断言9、完整断言写法&#x…...
Qt——实现一个获取本机网络信息的界面
效果展现 代码实现 networkinformation.h: #ifndef NETWORKINFORMATION_H #define NETWORKINFORMATION_H#include <QMainWindow> #include <QLabel> #include <QLineEdit> #include <QPushButton>class NetworkInformation : public QMai…...
全面深入了解接口自动化,看完还不会我报地址
一、自动化分类 (1)接口自动化 python/javarequestsunittest框架来实现 python/javaRF(RobotFramework)框架来实现——对于编程要求不高 (2)Web UI功能自动化 python/javaseleniumunittestddtPO框架来实…...
Python 小型项目大全 61~65
六十一、ROT13 密码 原文:http://inventwithpython.com/bigbookpython/project61.html ROT13 密码是最简单的加密算法之一,代表“旋转 13 个空格”密码将字母A到Z表示为数字 0 到 25,加密后的字母距离明文字母 13 个空格: A变成N&…...
Hlog
Hlog 简介 Hlog是Hbase实现WAL(Write ahead log )方式产生的日志信息 , 内部是一个简单的顺序日志。每个RegionServer对应1个Hlog(备注:1.X版本的可以开启MultiWAL功能,允许对应多个Hlog),所有对于该RegionServer的写入都会被记录到Hlog中。H…...
学编程应该选择什么操作系统?
今天来聊一个老生常谈的问题,学编程时到底选择什么操作系统?Mac、Windows,还是别的什么。。 作为一个每种操作系统都用过很多年的程序员,我会结合我自己的经历来给大家一些参考和建议。 接下来先分别聊聊每种操作系统的优点和不…...
Oracle基础部分二(伪列/表、单个函数、空值处理、行列转换、分析函数、集合运算)
Oracle基础部分二(伪列/表、单个函数、空值处理、行列转换、分析函数、集合运算)1 伪列、伪表1.1 伪列1.2 伪表2 单个函数2.1 常用字符串函数2.1.1 length() 询指定字符的长度2.1.2 substr() 用于截取字符串2.1.3 concat() 用于字符串拼接2.2 常用数值函…...
c/c++:原码,反码,补码和常见的数据类型取值范围,溢出
c/c:原码,反码,补码和常见的数据类型取值范围,溢出 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学,可手握…...
Java题目训练——年终奖和迷宫问题
目录 一、年终奖 二、迷宫问题 一、年终奖 题目描述: 小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物, 每…...
ORACLE EBS系统应用基础概述(1)
一、前言 有网友在论坛发帖惊呼:好不容易把EBS系统安装好了,进去一看傻眼了,不知道从哪儿下手?发出惊叹的这位网友所遇到的问题,实际上也是很多人曾经遇到或正在遇到的问题。长期以来,国内的非专业人士&am…...
电子科技大学信息与通信工程学院2023考研复试总结
一、笔试 笔试主要考察数字逻辑(数电)的相关知识,满分200分,需要复习的内容不多且知识点比较集中。根据考场上实际感受,题目难度不大但是题量稍大,2h完成试卷几乎没有多少剩余时间。笔试的体型分为填空题、…...
神经网络激活函数
神经网络激活函数神经网络激活函数的定义为什么神经网络要用激活函数神经网络激活函数的求导Sigmoid激活函数Tanh激活函数Softmax激活函数神经网络激活函数的定义 所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数…...
2.C 语言基本语法
文章目录二、C 语言基本语法1.语句2.表达式3.语句块4.空格5.注释6.printf()函数基本用法7.占位符8.输出格式10.标准库,头文件提示:以下是本篇文章正文内容,下面案例可供参考 二、C 语言基本语法 1.语句 C语言的代码由一行行语句࿰…...
Qt 6.5 LTS 正式发布
Qt 6.5 LTS 已正式发布。此版本为图形和 UI 开发者以及应用程序后端引入了许多新功能,还包含许多修复和通用的改进。Qt 6.5 将成为商业许可证持有者的长期支持 (LTS) 版本。 部分更新亮点: 改进主题和样式 使用 Qt 6.5,应用程序能够便捷地支持…...
Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权
Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权1. 前言1.1. 如何找编译好的EXP2. 定时任务提权2.1. 查看定时任务2.2. 通配符注入提权2.2.1. 创建执行脚本2.2.2. 创建定时任务2.2.3. 查看效果2.2.4. 提权操作2.2.4.1. 切换普通用户2.2.4.2. 执行命令2.2.4.3. …...
Python爬虫——使用requests和beautifulsoup4库来爬取指定网页的信息
以下是一个简单的Python代码,使用requests和beautifulsoup4库来爬取指定网页的信息: import requests from bs4 import BeautifulSoupurl "https://example.com"# 发送GET请求,获取网页内容 response requests.get(url)# 将网页内…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
