Java中==運算符與equals方法的區(qū)別及intern方法詳解
Java中==運算符與equals方法的區(qū)別及intern方法詳解
1. ==運算符與equals()方法
2. hashCode()方法的應(yīng)用
3. intern()方法
/*
Come from xixifeng.com
Author: 習(xí)習(xí)風(fēng)(StellAah)
*/
public class AboutString2
{
public static void main(String[]arsgs)
{
String myName="xixifeng.com";
String myName3="xixifeng";
String myName4=".com";
String myName5=myName3+myName4;
String myName6="xixifeng.com";
if(myName==myName5)
{
System.out.println("myName==myName5");
}
else
{
System.out.println("myName="+myName);
System.out.println("myName5="+myName5);
System.out.println("myName!=myName5");
}
//經(jīng)運行打印出: myName!=myName5
if(myName==myName6)
{
System.out.println("myName==myName6");
}
else
{
System.out.println("myName!=myName6");
}
//經(jīng)運行得出: myName!=myName5,myName==myName6
//myName,myName5(myName5的值是由myName3+myName4得到的),myName6 這三個對象的值是相等的, 為什么 它們之間用==進(jìn)行運算的結(jié)果是 myName!=myName5,myName==myName6呢?
//原因在于==運算符
//顯然==參與String運算中不是用來比較值的,而是用來比較對象是否相等的.
//那么在String運算中,通過什么方法來比較它們的值是否相等呢,java 提供了equals()方法 ,主要用于比較對象的值是否相等
//示例如下:
//myName==myName5 是false (不是同一個對象)
if(myName.equals(myName5))
{
System.out.println("myName.equals(myName5) 比較的結(jié)果是true !");
}
else
{
System.out.println("myName.equals(myName5) 比較的結(jié)果是false !");
}
//經(jīng)運行輸出:myName.equals(myName5) 比較的結(jié)果是true ! 在由于myName與myName5不是同一個對象,充分說明:
//equals()方法[是用來比較對象的值是否相等]
//再拋出疑問:是不是兩個對象的哈希值相等就說明這兩個對象相等呢?
//(由上述測試myName==myName5 得出false ①表明myName與myName5不是同一個對象)
System.out.println(myName.hashCode());
System.out.println(myName5.hashCode());
//經(jīng)測試 ②myName與myName5的哈希值相等
//由①,② 得出: 兩個對象的hashCode值相等,不能表明其對象也相等.
//拋出疑問: 怎樣使myName與myName5的對象相等呢?
//引入intern()方法
myName5=myName5.intern();
if(myName==myName5)
{
System.out.println("(myName==myName5) 得true");
}
else
{
System.out.println("(myName==myName5) 得false");
}
//經(jīng)運行打印出: (myName==myName5) 得true
//結(jié)論: intern()方法能使兩個(對象不相等而值相等的)對象變得相等
//myName5.intern();的意思,可以解釋為: myName5在內(nèi)存中查找對象嫁給自己,條件是,該對象要與自己的值相等. 找到了,就指定該對象.
//myName5找到對象,并認(rèn)定,就不必再創(chuàng)建對象了,所以說這樣做,可以節(jié)約內(nèi)存資源.
//拋出疑問: 什么樣的對象建議使用intern()呢?
// myName="xixifeng.com" myName6="xixifeng.com", myName與myName6的對象是相等的,上述已經(jīng)證實.
// 所以說,對象在直接賦予同樣的值的時候沒有必要用intern().
//myName="xixifeng.com" myName5=myName3+myName4,它們的值相等,但是對象不相等,上述已經(jīng)證實.
//所以說, 對象在間接賦予(有可能與已有對象)同樣的值的時候,建議用一下intern()方法,從而可公用內(nèi)存中存在的對象.
//==參與int型運算中,也營造類似的比較
int i=8;
int j=3;
int k=5;
int m=j+k;
int n=8;
if(i==m)
{
System.out.println("i="+i);
System.out.println("m="+m);
System.out.println("i==m");
}
else
{
System.out.println("i!=m");
}
if(i==n)
{
System.out.println("... ... ... ...");
System.out.println("i="+i);
System.out.println("n="+n);
System.out.println("i==n");
}
else
{
System.out.println("i!=n");
}
//經(jīng)運行得出i=m(m的值由j+k得到),i=n
//i,m,n的值都相等 , 由于i==m 得出true i==n得出true
//所以可以得出結(jié)論: ==參與非對象類型運算時,是用來比較常量的值是否相等
}
}
綜上所屬,得出如下結(jié)論:
1) ==運算符參與對象類型運算時是用來比較對象是否想得的.
2) ==運算符參與非對象類型運算時是用來比較值是否相等的.
3) equals()方法用于比較兩個對象的值是否相等
4) 兩個對象的hashCode()值相等,并不代表其對象也相等
5) intern()方法能使兩個(對象不相等而值相等的)對象變得相等,從而可以公用內(nèi)存已有的對象,這樣做可以節(jié)約內(nèi)存資源.
6) 對象在間接賦予(有可能與已有對象)同樣的值的時候,建議用一下intern()方法,從而可公用內(nèi)存中存在的對象.
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
解決BeanUtils.copyProperties不支持復(fù)制集合的問題
這篇文章主要介紹了解決BeanUtils.copyProperties不支持復(fù)制集合的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Java Management Extensions管理擴(kuò)展原理解析
這篇文章主要介紹了Java Management Extensions管理擴(kuò)展原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04
Java通過python命令執(zhí)行DataX任務(wù)的實例
今天小編就為大家分享一篇Java通過python命令執(zhí)行DataX任務(wù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08
springboot構(gòu)造樹形結(jié)構(gòu)數(shù)據(jù)并查詢的方法
本文主要介紹了springboot怎樣構(gòu)造樹形結(jié)構(gòu)數(shù)據(jù)并查詢,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
IDEA調(diào)試小技巧之Evaluate調(diào)試工具詳解
這篇文章主要介紹了IDEA調(diào)試小技巧之Evaluate調(diào)試工具,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
在已有spring的基礎(chǔ)上集成hibernate的實例講解
下面小編就為大家?guī)硪黄谝延衧pring的基礎(chǔ)上集成hibernate的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11

