java基礎(chǔ)之 “==”與“equals”區(qū)別詳解
對(duì)于初學(xué)java的人來(lái)說(shuō),在面對(duì)數(shù)值比較的時(shí)候,我們大多數(shù)會(huì)采用 “==”的方式來(lái)進(jìn)行比較,但是java中給我們提供了equals()方法,這時(shí)候很多人就會(huì)忽略這兩種方式的區(qū)別,在學(xué)習(xí)中產(chǎn)生了很多錯(cuò)誤,本文將詳細(xì)區(qū)分equals和 == 兩種方式的區(qū)別。
“==” 解讀
對(duì)于基本類型和引用類型,==的作用效果是不同的,對(duì)于 基本類型 來(lái)說(shuō),比較的是值是否相同,對(duì)于 引用類型 來(lái)說(shuō),比較的是引用是否相同。
代碼示例:
public static void main(String[] args) {
String x = "hello";
String y = "hello";
String z = new String("hello");
System.out.println(x.equals(y)); //true
System.out.println(x.equals(z)); //true
System.out.println(x == y); //true
System.out.println(x == z); //flase
}
因?yàn)閤,y指向的是同一個(gè)引用,所以== 和equals都是true,而new String()又開(kāi)辟了一個(gè)新的空間,所以 ==為false,但是equals始終比較的是值,所以為true。
equals解讀
在本質(zhì)上,equals就是==,只是String和Integer等重寫了equals方法,使得equals只用于值比較。
public class Demo1 {
private String name;
public Demo1(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Demo1 demo1 = new Demo1("張三");
Demo1 demo2 = new Demo1("張三");
String s = new String("李四");
String s2 = new String("李四");
System.out.println(demo1.equals(demo2));//false
System.out.println(s.equals(s2)); //true
}
}
可以看到demo1和demo2的值一樣,但是輸出結(jié)果卻是false,而s和s2的值一樣卻輸出結(jié)果為true, 怎么回事?
equals代碼
public boolean equals(Object obj){
return (this == obj);
}
可以看到,原始的equals方法本質(zhì)上就是==
String類中的equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
可以看到,String重寫了Object的equals的方法,把引用比較改成了值的比較。
本文主要介紹了java基礎(chǔ)開(kāi)發(fā)中“==”與“equals”區(qū)別如果想了解更多關(guān)于java基礎(chǔ)開(kāi)發(fā)相關(guān)信息請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
Spring中的BeanFactory對(duì)象實(shí)例化工廠詳解
這篇文章主要介紹了Spring中的BeanFactory對(duì)象實(shí)例化工廠詳解,BeanFactory及其子類是Spring IOC容器中最重要的一個(gè)類,BeanFactory由類名可以看出其是一個(gè)Bean工廠類,其實(shí)它確實(shí)是一個(gè)Bean工廠類,完成Bean的初始化操作,需要的朋友可以參考下2023-12-12
Spring事件監(jiān)聽(tīng)機(jī)制使用和原理示例講解
Spring事件監(jiān)聽(tīng)機(jī)制是一個(gè)很不錯(cuò)的功能,我們?cè)谶M(jìn)行業(yè)務(wù)開(kāi)發(fā)的時(shí)候可以引入,在相關(guān)的開(kāi)源框架中也是用它的身影,比如高性能網(wǎng)關(guān)ShenYu中就使用了Spring事件監(jiān)聽(tīng)機(jī)制來(lái)發(fā)布網(wǎng)關(guān)的更新數(shù)據(jù),它可以降低系統(tǒng)的耦合性,使系統(tǒng)的擴(kuò)展性更好2023-06-06
Java并發(fā)編程之CountDownLatch源碼解析
這篇文章主要介紹了Java并發(fā)編程之CountDownLatch源碼解析,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java并發(fā)編程的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04
SpringBoot中讀取jar包中的resources目錄下的文件的三種方式
這篇文章給大家總結(jié)了SpringBoot讀取 jar 包中的 resources 目錄下的文件的三種方式,文中有詳細(xì)的代碼示例供大家參考,,需要的朋友可以參考下2023-06-06
淺析final,finally,finalize 的區(qū)別
以下是對(duì)final,finally,finalize的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09
淺談shiro的SecurityManager類結(jié)構(gòu)
下面小編就為大家?guī)?lái)一篇淺談shiro的SecurityManager類結(jié)構(gòu)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
SpringCloud微服務(wù)的調(diào)用與遠(yuǎn)程調(diào)用測(cè)試示例
這篇文章主要介紹了SpringCloud微服務(wù)的調(diào)用與遠(yuǎn)程調(diào)用測(cè)試示例,服務(wù)調(diào)用者-可以暫時(shí)認(rèn)為是與用戶交互的角色(因?yàn)榇嬖谖⒎?wù)之間的調(diào)用),可以根據(jù)該用戶的類型將其賦予不同的服務(wù)調(diào)用權(quán)限,通過(guò)一次http請(qǐng)求訪問(wèn)調(diào)用對(duì)應(yīng)的微服務(wù)獲取想要的數(shù)據(jù)2023-04-04
Spring Boot超詳細(xì)講解請(qǐng)求處理流程機(jī)制
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架,本篇讓我們一起分析請(qǐng)求處理流程機(jī)制2022-07-07

