本章目標
- 掌握String類的兩種實例化方式
- 掌握String的兩種比較操作
- 深入分析String類兩種實例化方式的區(qū)別
- 掌握String的使用特點
1痛倚、具體內(nèi)容
1.1、實例化String對象
public class StringDemo01{
public static void main(String args[]){
String name = "LiXingHua" ; // 實例化String對象
System.out.println("姓名:" + name) ;
}
};
輸出結(jié)果:
姓名:LiXingHua
public class StringDemo02{
public static void main(String args[]){
String name = new String("LiXingHua") ; // 實例化String對象
System.out.println("姓名:" + name) ;
}
};
輸出結(jié)果:
姓名:LiXingHua
1.2忌穿、String的內(nèi)容比較
現(xiàn)在先簡單回顧一下连躏,基本數(shù)據(jù)類型使用“==”進行比較
范例:使用“==”進行比較
public class StringDemo03{
public static void main(String args[]){
int x = 30 ;
int y = 30 ;
System.out.println("兩個數(shù)字的比較結(jié)果:" + (x==y)) ;
}
};
兩個數(shù)字的比較結(jié)果:true
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)) ; // false
System.out.println("str1 == str3 --> " + (str1==str3)) ; // false
System.out.println("str2 == str3 --> " + (str2==str3)) ; // true
}
};
輸出結(jié)果
str1 == str2 --> false
str1 == str3 --> false
str1 == str2 --> true
此時就必須進行內(nèi)存的分析石景。
現(xiàn)在使用的判斷相等更舞,是判斷地址空間是否相等畦幢,判斷的是地址值。
如果想要判斷其內(nèi)容是否相等缆蝉,則就必須使用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))) ; // true
System.out.println("str1 equals str3 --> " + (str1.equals(str3))) ; // true
System.out.println("str2 equals str3 --> " + (str2.equals(str3))) ; // true
}
};
輸出結(jié)果:
str1 == str2 --> true
str1 == str3 --> true
str1 == str2 --> true
結(jié)論:String有兩種比較方式
- 一種是使用“==”完成,比較的是地址值刊头。
- 另一種是使用“equals()”方法完成黍瞧,比較的是具體的內(nèi)容,開發(fā)中比較常用芽偏。
1.3雷逆、兩種實例化方式的區(qū)別
在String中可以使用直接賦值和new調(diào)用構(gòu)造方法的方式完成,那么使用哪種更合適呢污尉?
如果想解決這樣的問題膀哲,則必須從字符串的特征說起。
public class StringDemo06{
public static void main(String args[]){
System.out.println("hello".equals("hello")) ;
}
};
輸出結(jié)果:
true
了解此處之后被碗,實際上之前的操作:
String name = "LiXingHua";
就表示將一個堆內(nèi)存空間的指向給了棧內(nèi)存空間某宪。
只有掌握了這一點之后,才可以分析出使用哪種實例化方式更合適锐朴,例如現(xiàn)在有以下的題目:
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)) ; // true
System.out.println("str1 == str3 --> " + (str1==str3)) ; // true
System.out.println("str2 == str3 --> " + (str2==str3)) ; // true
}
};
輸出結(jié)果:
str1 == str2 --> true
str1 == str3 --> true
str1 == str2 --> true
以上三個對象的內(nèi)存地址都一樣兴喂。
因此,使用直接賦值的方式焚志,可以有效的節(jié)省內(nèi)存衣迷。
那么,如果現(xiàn)在使用new String()的方式呢酱酬?
public class StringDemo08{
public static void main(String args[]){
String str1 = new String("hello") ;
}
};
開辟了兩個空間壶谒。
使用直接賦值的方式只需要一個實例化對象即可,而是用new String()的方式則需要開辟兩個內(nèi)存對象膳沽。開發(fā)中最好使用直接賦值的方式完成汗菜。
1.4、字符串的內(nèi)容不可改變
這是一個重要的特征挑社。
public class StringDemo09{
public static void main(String args[]){
String str = "hello" ; // 聲明字符串
str = str + " world!!!" ; // 修改字符串
System.out.println("str = " + str) ;
}
};
輸出結(jié)果:
str = hello world!!!
此時陨界,字符串對象是改變了,但是字符串變了嗎痛阻?
實際上字符串內(nèi)容的改變菌瘪,改變的是內(nèi)存地址的引用關系。
所以阱当,在開發(fā)匯總應該避免如下的使用操作:
public class StringDemo10{
public static void main(String args[]){
String str1 = "LiXingHua" ; // 聲明字符串對象
for(int i=0;i<100;i++){ // 循環(huán)修改內(nèi)容
str1 += i ; // 字符串的引用不斷改變
}
System.out.println(str1) ;
}
};
輸出結(jié)果:
LiXingHua0123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
但是這樣的操作麻车,要斷開連接引用100次才可以完成缀皱。這樣的操作性能很低斗这,應該避免使用动猬,而如果非要使用這種操作,在后面的Java常用類庫中將介紹StringBuffer類表箭,專門完成這樣的功能赁咙。
2、總結(jié)
1免钻、String要是用直接賦值的方式彼水,因為使用new會開辟兩個空間,造成空間浪費
2极舔、一個字符串就是String的匿名對象
3凤覆、字符串的比較方式有兩種:“==”、“equals()”