1. 程式人生 > >C#和java中String的異同

C#和java中String的異同

JavaC#是極其的相似,兩種語言都各有優劣,這裡對JavaC#string的異同進行一下介紹。

相同點:

1/ javaC#string都被看做物件來處理,都有處理字串的豐富的方法。

2/ javaC#string都是不可變類。

亦即,當兩個string變數s1,s2指向同一個字串物件ss時,如果通過s1改變ss的值,將不會對s2指向的string例項產生影響,而是開闢另一塊記憶體空間儲存新的string,這也是和其他普通類最大的不同。對於下面的程式碼,javaC#都會輸出相同的結果,先輸出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/ javaC#中,比較字串時“==”和“equals()方法”的異同。

String s1="123";

String s2=new String(xxx);//javaxxx"123"C#xxx為儲存"123"的字元陣列

上面的s1s2代表的都是字串"123",分別在java中和C#中執行下列操作,比較異同。

2.1 程式碼如下:

if (s1 == s2)

{

//輸出true

}

else

{

//輸出false

}

執行上面的程式碼,在C#中輸出地會是true,而在java中輸出地會是false,原因在於在C#中“s1==s2”比較的是s1s2指向字串的實際內容,而在java中“s1==s2”比較的是s1s2這兩個變數指向的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容易理解,因為s3s4在堆的不同區域中,而前者為什麼會輸出true呢?這是因為,在java中當採用string s="test"的形式定義字串時,會先檢查string池中是否已經有test,如果有就將s指向已經有的這個test所在的記憶體區域中,本例中s1s2指向的是同一個“123”,所以會輸出為true