---------------------- android培訓、java培訓、期待與您交流! ---------------------
Java中的String類,即字串類,它的對象往往與其他對象有很多不同的地方,讓人琢磨不透。經過幾天的學習,我想總結一下String類的一些特點。
1. 相當於常量:
String字串是常量,建好之後不可以修改(想要隨時修改可以使用StringBuffer類)。
2. 儲存位置:
通常定義一個對象是以這樣的方式
String str = new String("test");
但是String類還可以直接賦值
String str = “test”;
這兩種方式到底有什麼區別呢?這就需要弄清楚Java中的字串是怎麼儲存的。這個問題要涉及到Java中兩個重要的儲存區——堆(Heep)和字串池(String Pool)。堆是用來儲存物件的,包括該對象的特有屬性(即非靜態屬性,方法存放在方法區,這裡暫時不討論)。字串池用來存放當前用到的不重複的字串,方便使用,以免重複定義相同字串。
語句String str = new String("test");的過程是這樣的,首先看字串池中有沒有“test”字串,如果沒有就在池中加入“test”字串,之後在堆中建立一個對象(也有一份“test”字串資訊),將對象的地址返回給str變數。
語句String str = “test”;的執行過程是這樣的,首先查看字串池中有沒有‘“test”字串,如果沒有就在池中加入“test”字串,之後將池中“test”字串的地址返回給str變數。可以看到,這裡並沒有建立對象。
這樣一來,就會有一些重要的特性產生
(1)String str1 = “test”;
String str2 = “test”;
str1與str2的值相等。因為他們的值都是池中“test”的地址(每個字串在池中只有一份)
(2)String str1 = new String(“test”);
String str2 = new String("test");
str1與str2的值不相等。因為他們的值是兩個獨立的對象的地址,只不過對象裡面儲存的字串相同而已(第一句話執行後,pool中有“test”字串)。
3. equals方法與“==”
判斷兩個對象(a和b)是否是同一個對象,可以有兩種方法供選擇
(1)System.out.println(a.equals(b));
(2) System.out.println(a==b);
equals和“==”又有什麼區別呢?
“==”是直接比較兩個變數的值(對象的地址)是否相同,如果相同就是同一個對象,返回true,否則返回false。
equals是一個判斷對象是否相同的方法,Object類中定義它與“==”的功能一樣,地址一致則返回true,否則返回false。但是String類複寫(Overide)了這個方法,功能變為,如果兩個String對象指定的字串相同則返回true,不同則返回false,也就是說,他比較的是對應字串的值是否相同。
故:
String a = new String("abc");
String b = new String("abc");
String c = "abc";
String d = "abc";
a.equals(b)的結果是true
a==b的結果是false
c.equals(d)的結果的true
c==d的結果是true
a.equals(c) 的結果是true
以上三點是我的一點小總結,有不妥的地方歡迎指正,謝謝大家。
----------------------- android培訓、java培訓、期待與您交流! ----------------------
詳細請查看:http://edu.csdn.net/heima