首先String是一個類。
1,實例化String類方法。
1)直接賦值:String name="haha";
2)通過關鍵字:String name=new String("haha");
?
2,String類的數據比較。
首先回顧一下,基礎數據的比較使用"=="比較。
public class StringDemo04{public static void main(String args[]){String str1 = "hello" ; // 直接賦值String str2 = new String("hello") ; // 通過new賦值String str3 = str2 ; // 傳遞引用,共用一個堆地址空間。System.out.println("str1 == str2 --> " + (str1==str2)) ; // falseSystem.out.println("str1 == str3 --> " + (str1==str3)) ; // falseSystem.out.println("str2 == str3 --> " + (str2==str3)) ; // true } };
現在使用的判斷相等是判斷地址空間相等,判斷的值是地址值。
如果要想判斷其內存是否相等,則必須要使用String類中提供的equals()方法完成。
此方法使用如下:
public class StringDemo05{public static void main(String args[]){String str1 = "hello" ; // 直接賦值String str2 = new String("hello") ; // 通過new賦值String str3 = str2 ; // 傳遞引用System.out.println("str1 equals str2 --> " + (str1.equals(str2))) ; // trueSystem.out.println("str1 equals str3 --> " + (str1.equals(str3))) ; // trueSystem.out.println("str2 equals str3 --> " + (str2.equals(str3))) ; // true } };
結論:String兩種比較方式:
1)一種是“==”比較的是地址值。
2)一種使用equals()完成,比較的是具體的內容,比較常用。
?
3,兩種實例化的區別。
字符串的特征:
1)一個字符串就是String的匿名對象。(即沒有分配棧內存空間)
public class StringDemo06{public static void main(String args[]){System.out.println("hello".equals("hello")) ;} };
了解此后,實際之前操作:
String name="hehe";
就表示將一個堆內存空間指給了棧內存空間。
只有掌握了這一點后,才能分析出使用哪種方式實例化更合適。
public class StringDemo07{public static void main(String args[]){String str1 = "hello" ; // 直接賦值String str2 = "hello" ; // 直接賦值String str3 = "hello" ; // 直接賦值System.out.println("str1 == str2 --> " + (str1==str2)) ; // trueSystem.out.println("str1 == str3 --> " + (str1==str3)) ; // trueSystem.out.println("str2 == str3 --> " + (str2==str3)) ; // true } };
這里沒有用equals()方法,但是都是ture。
以上三個的內存地址都一樣,
因為三個對象指向同一個堆內存空間,所有使用直接賦值能夠節省內存空間。
而使用new String()方式。
public class StringDemo08{public static void main(String args[]){String str1 = new String("hello") ; } };
、
使用直接賦值方式只要一個空間即可,而new String()則會開辟兩個地址空間。所以最好使用直接賦值。
?
2)字符串的內容不可改變。
這是一個重要特征。
public class StringDemo09{public static void main(String args[]){String str = "hello" ; // 聲明字符串str = str + " world!!!" ; // 修改字符串System.out.println("str = " + str) ;} };
這里字符串對象是改變了,但是字符串并沒有改變。
實際上字符串內容的改變,改變的只是內存地址的引用關系。
所以在開發中要避免以下情況出現。
public class StringDemo10{public static void main(String args[]){String str1 = "LiXingHua" ; // 聲明字符串對象for(int i=0;i<100;i++){ // 循環修改內容str1 += i ; // 字符串的引用不斷改變 }System.out.println(str1) ;} };
但是這樣的操作,要斷開連接100次才能完成。這種操作性能很低,應避免使用。