stringequals源碼
1. api中怎麼看equals 和string的源碼
在你的%java_HOME%\src.zip裡面,你把那裡面的源文件解壓一下,就可以看到.java文件了
2. 關於java的String類的equals方法的源碼
比的是n!=0 然後n=n-1
你可以理解為
for(n=n;n>0;n--){
}
3. C# string類型的Equals方法
比較的是值。下面是用Reflector反編譯出來的String類的部分源碼,供參考:
[ReliabilityContract(Consistency.WillNotCorruptState,
Cer.MayFail)]
public
bool
Equals(string
value)
{
if
((value
==
null)
&&
(this
!=
null))
{
return
false;
}
return
EqualsHelper(this,
value);
}
主要的是EqualsHelper這個方法的實現,具體如下:
[ReliabilityContract(Consistency.WillNotCorruptState,
Cer.MayFail)]
private
static
unsafe
bool
EqualsHelper(string
strA,
string
strB)
{
int
length
=
strA.Length;
if
(length
!=
strB.Length)
{
return
false;
}
fixed
(char*
str
=
((char*)
strA))
{
char*
chPtr
=
str;
fixed
(char*
str2
=
((char*)
strB))
{
char*
chPtr2
=
str2;
char*
chPtr3
=
chPtr;
char*
chPtr4
=
chPtr2;
while
(length
>=
10)
{
if
((((*(((int*)
chPtr3))
!=
*(((int*)
chPtr4)))
||
(*(((int*)
(chPtr3
+
2)))
!=
*(((int*)
(chPtr4
+
2)))))
||
((*(((int*)
(chPtr3
+
4)))
!=
*(((int*)
(chPtr4
+
4))))
||
(*(((int*)
(chPtr3
+
6)))
!=
*(((int*)
(chPtr4
+
6))))))
||
(*(((int*)
(chPtr3
+
8)))
!=
*(((int*)
(chPtr4
+
8)))))
{
break;
}
chPtr3
+=
10;
chPtr4
+=
10;
length
-=
10;
}
while
(length
>
0)
{
if
(*(((int*)
chPtr3))
!=
*(((int*)
chPtr4)))
{
break;
}
chPtr3
+=
2;
chPtr4
+=
2;
length
-=
2;
}
return
(length
<=
0);
}
}
}
可見比較的絕對是值,而不是引用。
比較引用的話
strA
==
strB就行了(其實呢,==運算符重載也是調用了下面的靜態Equals方法),下面的源碼就比較典型,比較引用(引用相同,值必相同)也比較值。
public
static
bool
Equals(string
a,
string
b)
{
return
((a
==
b)
||
(((a
!=
null)
&&
(b
!=
null))
&&
EqualsHelper(a,
b)));
}
public
static
bool
operator
==(string
a,
string
b)
{
return
Equals(a,
b);
}
不知這個回答可以否?
更正一點,Contains方法中沒有用到Equals方法,源碼如下:
public
bool
Contains(string
value)
{
return
(this.IndexOf(value,
StringComparison.Ordinal)
>=
0);
}
不過確實也是逐字元比較的,比較的是值。
4. Java,求Object的equals源代碼
"同一個對象的應用"
其實是指兩個對象的內容一樣。"equals"可以理解為兩個對象引用所指向的內容相同;"=="是指對象引用相同
;例如:string
str1=new
string("abc");string
str2=str1;string
str3=new
string("abc");string
str4=new
string("abc");str1==str2;為true,因為str1,str2都指向同一個"abc";str1.equals(str2);為true,因為str1,str2所指內容一樣就是"abc";str1==str3;為false,因為str3
又new了一塊新內存空間來放"abc",str1和str3不是指向同一個"abc";str1.equals(str3);為true,因為str1,str3所指內容一樣就是"abc";str1==str4;為false,因為str1和str4指向不同;str1.equals(str4);為false,因為str1,str4所指內容不一樣,一個是"abc"
一個是"abc"
5. .equals()到底是什麼意思
.equals() 在Java中判斷是否相等,與 == 的區別是 .equals() 只判斷值是否相等,不管兩者是否存在同一地址。而 == 則是判斷值與存在地址都得相等
(5)stringequals源碼擴展閱讀:
由equals的源碼可以看出這里定義的equals與==是等效的(Object類中的equals沒什麼區別),不同的原因就在於有些類(像String、Integer等類)對equals進行了重寫,但是沒有對equals進行重寫的類(比如我們自己寫的類)就只能從Object類中繼承equals方法,其equals方法與==就也是等效的,除非我們在此類中重寫equals。
另外,"=="比"equals"運行速度快,因為"=="只是比較引用。
6. String equals方法的疑問
String s2="123456789".substring(1,6);
這句代碼執行時,會在字元串緩存池中建立一個新的字元串,值為「23456」,並讓s2指向這個值。
執行完之後,s2也是「23456」,原來s1也是「23456」。
因為s1和s2引用的位置不同,所以s1 == s2返回false
因為s1和s2的值相同,所以s1.equals(s2)返回true
7. 關於JAVAString類equals方法的源代碼
Sting創建的是兩個對象,一個是存在常量池中,還有一個是存在對象棧中。
8. JAVA中equals的用法
String類對equals()方法進行了覆蓋,只要引用指向的對象的內容是一樣的就認為他們相等。你可以看一下String的equals()的源碼:
publicbooleanequals(ObjectanObject){
if(this==anObject){
returntrue;
}
if(anObjectinstanceofString){
StringanotherString=(String)anObject;
intn=value.length;
if(n==anotherString.value.length){
charv1[]=value;
charv2[]=anotherString.value;
inti=0;
while(n--!=0){
if(v1[i]!=v2[i])
returnfalse;
i++;
}
returntrue;
}
}
returnfalse;
}
而Object類默認的equals()方法就是比較兩個引用指向的對象本身,如果指向同一個對象,那就認為他們是相等的,否則不相等,除非你像String類那樣對其進行覆蓋重寫。
9. 在java中String中的equals方法的源代碼有很多不懂啊求大神解惑!!
anObject instanceof String;
首先上邊的語句,先判斷anObject是不是String類的一個實例,如果是運行下邊的語句
String anotherString = (String)anObject;
字元串是一個引用數據類型,本身是String個對象,
在這里把傳進來的anObject這個對象,賦給anotherString (需要類型轉換)
他當然可以調用String類里的成員,你說的count、value、offset都是String的成員
int n = count;//這個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;//在遍歷的過程中如果有不同的就返回false;
} //你如果用過equals這個方法應該知道它返回的是boolean值
return true;
}
}
return false;
}