Date:2021.12.29
Author:qyan.li
Reference:https://blog.csdn.net/qq_43576028/article/details/90347117
文章目录
-
- 前言
- 一、Java中“==”
- 二、Java中CompareTo()方法
- 三、Java中equals()方法
前言 最近,利用Java学习数据结构,涉及到相等情况的判断,想起曾经阅读过类似知识点,故整理一下,方便后续查看。
一、Java中“==” Java中等号使用最为普遍,同时也最容易理解,“==”的使用主要分为两种情况:
- 比较双方为基本数据类型->比较二者的数值大小
此种情况下主要包含int ,double 等基本数据类型
- 比较双方为Object或者自定义对象(class)->比较二者在内存中地址是否相同
Student s1 = new Student("liqiyan",10); Student s2 = new Student("liqiyan",10); System.out.println(s1 == s2); // output->false
Tips:比较对象为string字符串需注意声明字符串和new String的区别
以程序为例进行说明:
String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System.out.println(s1 == s2); // ouput -> true System.out.println(s1 == s3); // output->false
说明:
- 在Java中,String存在String pool,其中存放可以共享的字符串对象,在声明一个字符串对象时,会先去其中寻找是否存在相同的String内容,假设存在是不会创建新对象,故此时二者的内存地址相同。
- 但是new String会重新开辟地址,因此与之前String对象地址不同
ctrl+shift+i
/*CompareTo源码*/
public int compareTo(String anotherString) {
byte v1[] = value;
byte v2[] = anotherString.value;
// 转换为Byte数组
byte coder = coder();
if (coder == anotherString.coder()) { // 判断字符编码并比较单个字符ASCII码
return coder == LATIN1 ? StringLatin1.compareTo(v1, v2)
: StringUTF16.compareTo(v1, v2);
}
return coder == LATIN1 ? StringLatin1.compareToUTF16(v1, v2)
: StringUTF16.compareToLatin1(v1, v2);
}
关于CompareTo源码的说明:总结一下:CompareTo逐个比较String单个字符的ASCII,并返回ASCII的差值
- return type为int类型变量
- 源码大体意思在于将字符串对象转换为Byte数组,逐个比较单个字符的ASCII码,最终返回ASCII的int差值
- 依据源码分析,CompareTo方法传入为String对象,而非Object
/*Testing Code*/
String s1 = "abc";
String s2 = "bcd";
String s3 = new String("add");
System.out.println(s1.compareTo(s2));
// output->-1
System.out.println(s1.compareTo(s3));
// output->-2
三、Java中equals()方法 类似于CompareTo方法,equals方法同样借助于sourse code进行分析:
/*equals源码*/
public boolean equals(Object anObject) {
if (this == anObject) { // 判断地址是否相同
return true;
}
return (anObject instanceof String aString) // 类似于CompareTo逐个字符进行比较
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}
关于equals源码的说明:【Java知识点|Java判定相等---==和equals()和“compareTo()”】总结一下:个人认为equals方法与CompareTo方法类似,先行加入地址判断,而后根据字符逐个分析
- return type为Boolean类型的变量
- 判断规则:
- 首先判断地址是否相等,若地址相同,两对象一定相同
- 其次根据字符逐个进行判断,最终返回Boolean类型的变量
- 依据源码进行分析,equals方法传入Object对象进行判断
/*Testing code*/
String s1 = "abc";
String s2 = "bcd";
String s3 = new String("abc");
System.out.println(s1.equals(s3));
// output->true
System.out.println(s1.equals(s2));
// output->false
推荐阅读
- GWAS|颜值即正义 | 只知道qqman而不知道cmplot是不专业的
- python|10 款最好的 Python IDE(十)
- python|Python入门
- python|10个最好用的Python开发工具(IDE)
- C++|【C++】类和对象(上篇)
- ITI 1121 体系计算
- 被 P8 大佬面试的 2 小时,面试全过程记录..
- Linux|给自己一首歌的时间学习来Linux基本开发工具
- 运维|Anolis龙蜥升级kernel