C#和java中String的異同
Java和C#是極其的相似,兩種語言都各有優劣,這裡對Java和C#中string的異同進行一下介紹。
相同點:
1/ 在java和C#中string都被看做物件來處理,都有處理字串的豐富的方法。
2/ 在java和C#中string都是不可變類。
亦即,當兩個string變數s1,s2指向同一個字串物件ss時,如果通過s1改變ss的值,將不會對s2指向的string例項產生影響,而是開闢另一塊記憶體空間儲存新的string,這也是和其他普通類最大的不同。對於下面的程式碼,java和C#都會輸出相同的結果,先輸出true後輸出false。
string s1 = "123";
string s2 = s1;
if (s1 == s2)
{
//輸出true;
}
else
{
//輸出false
}
s2 = "456";
if (s1 == s2)
{
//輸出true;
}
else
{
//輸出false
}
不同點:
1/ C#中所有string物件都放在堆中,而java根據定義的形式,既可以放到堆疊中(有一個string池)也可以放到堆中。
String s="";
String s=new String();
對於上面的兩種定義方式,C#都會將相應的string物件放到堆中,而在java中,用第一種方式定義的字串會被放到堆疊中的string池中,第二種方式定義的字串會放到對中,相應的第一種方式中的s儲存的是堆疊中字串的地址,第二種方式中的s儲存的是堆中string物件的起始地址。
2/ java和C#中,比較字串時“==”和“equals()方法”的異同。
String s1="123";
String s2=new String(xxx);//java中xxx為"123",C#中xxx為儲存"123"的字元陣列
上面的s1,s2代表的都是字串"123",分別在java中和C#中執行下列操作,比較異同。
2.1 程式碼如下:
if (s1 == s2)
{
//輸出true;
}
else
{
//輸出false
}
執行上面的程式碼,在C#中輸出地會是true,而在java中輸出地會是false,原因在於在C#中“s1==s2”比較的是s1和s2指向字串的實際內容,而在java中“s1==s2”比較的是s1和s2這兩個變數指向的string的地址,一個在堆疊中,一個在堆中,輸出地肯定是false。
2.2 程式碼如下
if (s1.equals(s2))
{
//輸出true;
}
else
{
//輸出false
}
這次在C#和java中輸出地都是true,現在可以總結出:在C#中s1 == s2和(s1.equals(s2)表示的意義相同,都是比較字串的實際內容;而在java中前者比較的是地址,後者比較的才是字串實際的內容。
這裡我們再介紹點兒java中字串的其它特性。
2.3 程式碼如下
String s1="123";
String s2="123";
String s3=new String("123");
String s4=new String("123");
if (s1 == s2)
{
//輸出true;
}
else
{
//輸出false
}
if (s3 == s4)
{
//輸出true;
}
else
{
//輸出false
}
執行上面的程式碼你會發現,會先輸出true,再輸出false。後者輸出false容易理解,因為s3和s4在堆的不同區域中,而前者為什麼會輸出true呢?這是因為,在java中當採用string s="test"的形式定義字串時,會先檢查string池中是否已經有test,如果有就將s指向已經有的這個test所在的記憶體區域中,本例中s1和s2指向的是同一個“123”,所以會輸出為true。