Object類和String類equals方法的區別
String類的equals方法和“==”
相信很多學習過Java的同學都知道,在比較兩個String物件的內容是否相同時是使用equals方法的
如:String str1=new String(“A”);
String str2=new String(“B”);
String str3=new String(“B”);
boolean result1= str1.equals(str2);
boolean result2= str2.equals(str3);
System.out.println(result1);
System.out.println(result2);
則輸入的result1為false,result2為true。因為str1與str2的內容不相同,而str2與str3內容相同都是“B”。
而在String類中使用“==”時,比較的是兩個String物件的引用是否指向同一個物件,如
String str4=new String(“B”);
String str5=new String(“B”);
String str6=str5;
boolean result3=(str4==str5);
boolean result4= (str5==str6);
System.out.println(result3);
System.out.println(result4);
則輸入的result3為false,result4為true。因為str4、str5雖然內容相同但它們是不同的物件,就像兩個同樣的杯子裝著同樣多的水,可它們是不同的,result3為false。而str5、str6是指向同一個String物件的,所以result4為true。
equals()方法在String類中的定義
string 類的成員變數
<span style="font-size:14px;">public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
</span>
equals方法原始碼
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
在String類的equals方法中,先使用“==”比較兩個物件是否是同一個物件的引用,如果是,返回true;如果不是,怎麼繼續比較兩個String物件的大小以及內容。equals()方法在Object類中的定義
equals方法原始碼
<span style="font-size:24px;"> </span><span style="font-size:14px;">public boolean equals(Object obj) {
return (this == obj);
}</span>
比較基本資料型別,如果兩個值相同,則結果為true ,而在比較引用時,如果引用指向記憶體中的同一物件,結果為true.
"=="在這裡是在比較兩個物件是否指向記憶體中的同一物件。在Object類的equals方法的本質其實是和“==”一樣的,都是比較兩個物件引用是否指向同一個物件(即兩個物件是否為同一物件)
我們通常自定義的物件,通常需要重寫Equals方法。
equals()方法
<span style="font-size:14px;">class Person
{
private String name;
private int age;
public Person(String name, int age)
{
this.name = name ;
this.age = age ;
}
public void show()
{
System.out.println(name + ", " + age);
}
public boolean equals (Object obj)
{
if(!(obj instanceof Person)) //如果不是Person型別,直接返回false
return false;
//this是p1 ,obj是p2
Person p = (Person)obj; s //由於訪問person特有的成員,需要把obj裝換成person類.
//if(this.name != p.name)
if(this.name == null)
{
if (p.name != null) //比較名字
return false;
}
else if(!this.name.equals(p.name))
return false;
if (this.age != p.age)
return false;
return true;
//return (this = obj);
}
}</span>
相關文章
- String類中的equals方法與Object類中的equals方法的不同點Object
- Object類-equals()、==、hashCode()Object
- ==和equals方法的區別
- Java中 equals() 方法和 == 的區別Java
- String的equals和hashCode方法
- Python 靜態方法和類方法的區別Python
- 重寫Object.equals()方法和Object.hashCode()方法Object
- 【Java】equals 和 == 的區別Java
- Java之String的equals與contentEquals區別Java
- StringBuffer類的delete()方法和deleteCharAt()方法的區別delete
- 【轉】Object類的常用方法Object
- C 風格字串,C++string類,MFC,CString類的區別。字串C++
- Java Object類 和 String類 常見問答 6k字+總結JavaObject
- JAVA集合類簡要筆記 - 內部類 包裝類 Object類 String類 BigDecimal類 system類Java筆記ObjectDecimal
- 介面和抽象類的區別抽象
- java 中equals和==的區別Java
- equals()和hashCode()的區別
- Java中equals和==的區別Java
- equals和equalsIgnoreCase的區別
- Java Object類的各個方法JavaObject
- Java中Object類的常用方法JavaObject
- Java String類的replaceAll方法Java
- java基礎:Object的equals方法JavaObject
- java String的equals,intern方法Java
- python新式類和舊式類區別Python
- MVC下的DAO介面類和SERVICE介面類區別?MVC
- Object類有哪些公用方法?Object
- 深入理解equals和==的區別
- 【ASP.net】Equals 和 == 的區別ASP.NET
- 在java中“equals”和“==”的區別Java
- Object所有類的超類之幾個方法詳析Object
- JavaBean重寫Object類中的方法JavaBeanObject
- Java中String類的常用方法Java
- 抽象類和介面的區別抽象
- "a".equals(b)和b.equals("a")有什麼區別
- Python中類方法和例項方法有什麼區別?Python
- JAVA中介面和抽象類的區別Java抽象
- MDIFrameWnd類GetActiveFrame和MDIGetActive的區別