1. 程式人生 > >C# 中的 String類型分析

C# 中的 String類型分析

body true println 因此 包括 概念 () 了解 自己

equals方法和==的區別

首先大家知道,String既可以作為一個對象類來使用,又可以作為一個基本類型來使用。這裏指的作為一個基本類型來使用只是指使用方法上的,比如String s = "Hello",它的使用方法如同基本類型int一樣,比如int i = 1;,而作為一個對象來使用,則是指通過new關鍵字來創建一個新對象,比如String s = new String("Hello")。但是它的內部動作其實還是創建了一個對象,這點稍後會說到。 其次,對String對象的比較方法需要了解。C#裏對象之間的比較有兩種概念,這裏拿String對象來說:一種是用"=="來比較,這種比較是針對兩個String類型的變量的引用
,也就是說如果兩個String類型的變量,它們所引用同一個String對象(即指向同一塊內存堆),則"=="比較的結果是true。另一種是用Object對象的equals()方法來比較,String對象繼承自Object,並且對equals()方法進行了重寫。兩個String對象通過equals()方法來進行比較時,其實就是對String對象所封裝的字符串內容進行比較,也就是說如果兩個String對象所封裝的字符串內容相同(包括大小寫相同),則equals()方法將返回true。 現在開始將對String對象的創建做具體的分析: 1、///////////////////////////////////////////////////////////////////////// String s1 = new String("Hello"); String s2 = new String("Hello"); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); 以上代碼段的打印結果是: false true 這個結果相信大家很好理解,兩個String類型的變量s1和s2都通過new關鍵字分別創建了一個新的String對象,這個new關鍵字為創建的每個對象分配一塊新的、獨立的內存堆。因此當通過"=="來比較它們所引用的是否是同一個對象
時,將返回false。而通過equals()方法來比較時,則返回true,因為這兩個對象所封裝的字符串內容是完全相同的。 2、////////////////////////////////////////////////////////////////////////////////// String s1 = new String("Hello"); String s2 = s1; System.out.println(s1 == s2); System.out.println(s1.equals(s2)); 以上代碼段的打印結果是: true true 這個結果應該更好理解,變量s1還是通過new關鍵字來創建了一個新的String對象,但這裏s2並沒有通過new關鍵字來創建一個新的String對象,而是直接把s1賦值給了s2,即把s1的引用賦值給了s2,所以s2所引用的對象其實就是s1所引用的對象
。所以通過"=="來比較時,返回true。既然它們引用的都是同一個對象,那麽通過equals()方法來比較時,肯定也返回true,這裏equals()方法其實在對同一個對象進行比較,自己肯定等於自己咯。 3、////////////////////////////////////////////////////////////////////////////// String s1 = "Hello"; String s2 = "Hello"; System.out.println(s1 == s2); System.out.println(s1.equals(s2)); 以上代碼段的打印結果是: true true 為什麽這個結果?那麽來分析一下。首先這兩個String對象都是作為一個基本類型來使用的,而不是通過new關鍵字來創建的,因此虛擬機不會為這兩個String對象分配新的內存堆,而是到String緩沖池中來尋找。 首先為s1尋找String緩沖池內是否有與"Hello"相同值的String對象存在,此時String緩沖池內是空的,沒有相同值的String對象存在,所以虛擬機會在String緩沖池內創建此String對象,其動作就是new String("Hello");。然後把此String對象的引用賦值給s1。 接著為s2尋找String緩沖池內是否有與"Hello"相同值的String對象存在,此時虛擬機找到了一個與其相同值的String對象,這個String對象其實就是為s1所創建的String對象。既然找到了一個相同值的對象,那麽虛擬機就不在為此創建一個新的String對象,而是直接把存在的String對象的引用賦值給s2。 這裏既然s1和s2所引用的是同一個String對象,即自己等於自己,所以以上兩種比較方法都返回ture。 到這裏,對String對象的基本概念應該都已經理解了。現在我來小結一下: 針對String作為一個基本類型來使用: 1。如果String作為一個基本類型來使用,那麽我們視此String對象是String緩沖池所擁有的。 2。如果String作為一個基本類型來使用,並且此時String緩沖池內不存在與其指定值相同的String對象,那麽此時虛擬機將為此創建新的String對象,並存放在String緩沖池內。 3。如果String作為一個基本類型來使用,並且此時String緩沖池內存在與其指定值相同的String對象,那麽此時虛擬機將不為此創建新的String對象,而直接返回已存在的String對象的引用。 針對String作為一個對象來使用: 1。如果String作為一個對象來使用,那麽虛擬機將為此創建一個新的String對象,即為此對象分配一塊新的內存堆,並且它並不是String緩沖池所擁有的,即它是獨立的。 理解了以上內容後,請看以下代碼段: 4、///////////////////////////////////////////////////////////////////////////// String s1 = "Hello"; String s2 = new String("Hello"); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); 以上代碼段的打印結果是: false true 根據上面的小結來進行分析。第一行是把String作為一個基本類型來使用的,因此s1所引用的對象是屬於String緩沖池內的。並且此時String緩沖池內並沒有與其值相同的String對象存在,因此虛擬機會為此創建一個新的String對象,即new String("Hello");。第二行是把String作為一個對象來使用的,因此s2所引用的對象不屬於String緩沖池內的,即它是獨立的。通過new關鍵字,虛擬機會為此創建一個新的String對象,即為它分配了一塊新的內存堆。因此"=="比較後的結果是false,因為s1和s2所引用的並不是同一個對象,它們是獨立存在的。而equals()方法所返回的是true,因為這兩個對象所封裝的字符串內容是完全相同的。

C# 中的 String類型分析