1、瞭解“==” 和 “equals”的區別。
在java中,所有的對象名其實中一個引用,這一點在字符串比較中可以很清楚的看到。如下:
String s1=new String("hello");
String s2=new String("hello");
boolean b1=(s1==s2)?true:false;//b1=false;
b1=(s1.equals(s2))?true;false;//b1=true
當用“==”操作符時,比較的是s1和s2兩個引用是否是指向同一個對象,而只有equals纔是真正比較兩個字符串對象的值是否相同。
但要注意這種情況:
String s1="hello";
String s2="hello";
boolean b1=(s1==s2)?true:false;//b1=true;
由於String是不可變類,所以如果不是通過new方法創建的字符串對象,只要值相同,都是指向的同一個對象。
2、用“+”操作符操作字符串:
注意 null 和 ""
String st1=null;
String st2="st2";
String st3=""
System.out.println(st1+st2);//output: nullst2
System.out.println(st3+st2);//output: st2
所以在執行+號運算時,一定要注意字符串賦值爲null和""的區別。
3、String變了嗎?
String是一個不可變類,即它是隻讀的。如下面的操作:
String s1="hello";
s1+="world";
這個操作的過程其實是這樣的,s1首先指向一個"hello"的String對象,在執行“+”操作後,s1指向一個“hello world”的String對象。而之前的“hello”對象是沒有釋放的。
從這可以得出下面兩個結論:
1)如果程序中有大量的String類值的變更操作,就會帶來比較大的內存消耗。
2)在創建一個字符串時,沒必要這麼做:new String() 來構造新的字符串對象。因爲如果是這種方式創建String的話,如果兩個字符串引用s1和s2的值相等,它們仍然指向不同的對象。但是如果是這樣,s1="hello";s2="hello",這時,s1和s2指向的是同一個對象。