### 从结果中可以看出Java中引用类型的比较不能直接按照‘<’,’>’比较。编译器会报错,那为什么‘’可以呢?因为对于自定义的类型,都默认的继承了Object类,而Object类中提供了equal方法,而‘’默认情况下调用的就是equal方法,equal方法比较的并不是两个变量的值的大小,而是直接比较两个引用变量的地址。


## 三:对象的比较


### 3.1 覆写基类的equal方法


在2.2中自定义类型equal方法比较的是两个变量的地址而不是大小,那要是硬要比较大小应该怎么做呢?我们可以覆写基类的equal方法
@Override
 public boolean equals(Object o) {
 // 自己和自己比较
 if (this == o) {
 return true;
 }
 // o如果是null对象,或者o不是Card的子类
 if (o == null || !(o instanceof Card)) {
 return false;
 } /
 / 注意基本类型可以直接比较,但引用类型最好调用其equal方法
 Card c = (Card)o;
 return rank == c.rank
 && suit.equals(c.suit);
 }
 }
覆写的格式大同小异  
 1. 如果两个变量都指向同一个变量那么返回true;  
 2. 如果有传入的变量为null,那么返回false;  
 3. 如果传入的类型不同,(如上面的例子不是“card“),也返回false;  
 4. 按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌  
 总结:覆写基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行  
 比较。


 


---


### 3.2 基于Comparble接口类的比较


对于自定义类型比较大小的话,在定义类的时候实现它的Comparble接口,然后在类中重写CompareTo方法  
 Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:
public interface Comparable {
 // 返回值:
 // < 0: 表示 this 指向的对象小于 o 指向的对象
 // == 0: 表示 this 指向的对象等于 o 指向的对象
 // > 0: 表示 this 指向的对象等于 o 指向的对象
 int compareTo(E o);
 }
 public class Card implements Comparable {
 public int rank; // 数值
 public String suit; // 花色
 public Card(int rank, String suit) {
 this.rank = rank;
 this.suit = suit;
 } /
 / 根据数值比较,不管花色
 // 这里我们认为 null 是最小的
 @Override
 public int compareTo(Card o) {
 if (o == null) {
 return 1;
 } r
 eturn rank - o.rank;
 } p
 ublic static void main(String[] args){
 Card p = new Card(1, “♠”);
 Card q = new Card(2, “♠”);
 Card o = new Card(1, “♠”);
 System.out.println(p.compareTo(o)); // == 0,表示牌相等
 System.out.println(p.compareTo(q));// < 0,表示 p 比较小
 System.out.println(q.compareTo§);// > 0,表示 q 比较大
 }
 }### 3.3基于比较器的比较


具体步骤如下:  
 1:自定义比较器类,实现Comparator接口public interface Comparator {
 // 返回值:
 // < 0: 表示 o1 指向的对象小于 o2 指向的对象
 // == 0: 表示 o1 指向的对象等于 o2 指向的对象
 // > 0: 表示 o1 指向的对象等于 o2 指向的对象
 int compare(T o1, T o2);
 }2:覆写Comparator中的compare方法`import java.util.Comparator;
 class Card {
 public int rank; // 数值
 public String suit; // 花色
 public Card(int rank, String
 this.rank = rank;
 this.suit = suit;
 }
 } c
 lass CardComparator implements C
 // 根据数值比较,不管花色
 // 这里我们认为 null 是最小的
 @Override
 public int compare(Card o1, Card o2) {
 if (o1 == o2) {
 return 0;
 } i
 f (o1 == null) {
 return -1;
 } i
 f (o2 == null) {
 return 1;
 } r
 eturn o1.rank - o2.rank;
 } p
 ublic static void main(String[] args){
 Card p = new Card(1, “♠”);
 Card q = new Card(2, “♠”);
 Card o = new Card(1, “♠”);
 // 定义比较器对象
 CardComparator cmptor = new CardComparator();
 // 使用比较器对象进行比较
 System.out.println(cmptor.compare(p, o)); // == 0,表示牌相等
 System.out.println(cmptor.compare(p, q)); // < 0,表示 p 比较小
 System.out.println(cmptor.compare(q, p)); // > 0,表示 q 比较大
 }
 }
3.4 三种比较方式的对比  
 ![在这里插入图片描述]()


## 四:结尾


上面的就是java中常用的比较变量的方法,由于侵入性不同,需要跟需求选择。






### 如何自学黑客&网络安全


#### 黑客零基础入门学习路线&规划


**初级黑客**  
 **1、网络安全理论知识(2天)**  
 ①了解行业相关背景,前景,确定发展方向。  
 ②学习网络安全相关法律法规。  
 ③网络安全运营的概念。  
 ④等保简介、等保规定、流程和规范。(非常重要)


**2、渗透测试基础(一周)**  
 ①渗透测试的流程、分类、标准  
 ②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking  
 ③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察  
 ④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等


**3、操作系统基础(一周)**  
 ①Windows系统常见功能和命令  
 ②Kali Linux系统常见功能和命令  
 ③操作系统安全(系统入侵排查/系统加固基础)


**4、计算机网络基础(一周)**  
 ①计算机网络基础、协议和架构  
 ②网络通信原理、OSI模型、数据转发流程  
 ③常见协议解析(HTTP、TCP/IP、ARP等)  
 ④网络攻击技术与网络安全防御技术  
 ⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现


**5、数据库基础操作(2天)**  
 ①数据库基础  
 ②SQL语言基础  
 ③数据库安全加固


**6、Web渗透(1周)**  
 ①HTML、CSS和JavaScript简介  
 ②OWASP Top10  
 ③Web漏洞扫描工具  
 ④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)  
 恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k