當前位置:編程學習大全網 - 源碼下載 - java高手來啊,字符串相等問題

java高手來啊,字符串相等問題

這個其實很簡單,但是實際中這麽寫代碼的人會被人鄙視死的。

先說第壹點

String對象是不可變的。String類中每壹個看起來會修改String值的方法,實際上的都是創建了壹個全

新的String對象。而用於String的+和+=是java中僅有的兩個重載過的操作符。而java(1.6)編譯器是

通過引入StringBuilder(妳可以打開妳所寫的class文件看字節碼,裏邊肯定會有invokespecial和

invokevirtual這就是初始化init方法了壹個StringBuilder對象和調用其append方法,如果不想了解這

麽深,括號裏的內容可以忽略)來實現的+或者+=的重載,最後通過toString返回其產生的新對象(源代碼裏是new的)。

然而要註意壹點(只針對這個題目),對於壹個class來說當其成員變量是String的靜態final域時,在類被編譯時編譯器會進行優化和改進。這裏的優化就是String替換.舉個例子

public static final String c="c";

public static final String d="d";

public static final String dddccc=d+d+d+c+c+c;

public static void main(String[] args){

String ccd = c+c+d;

}

會優化變成

public static final String c="c";

public static final String d="d";

public static final String dddccc="dddccc";

public static void main(String[] args){

String ccd = "ccd";

}

原因很簡單編譯器為了提高效率和無效代碼。而如果將上述變量(a和b)的初始化話放在構造方法(雖然這裏的a,b必須在static域中初始化,但非static在構造方法裏)或者static域中進行的話就不能進行替換啦。static域是在類的init方法後執行(至於神馬是init方法和有什麽特點,妳可以看看JVM相關的資料,還有至於為什麽編譯器可以這麽優化,如果樓主對final域比較了解的話就能理解了)。

2。字符串池

這個可以把它理解成是java對字符串的壹種緩存機制(雖然實際並非如此),由於字符串操作頻繁,

如果沒有字符串池的話,會造成大量String對象被頻繁的創建和銷毀。這對於java這種語言的效率來說

是不可接受的。因此java在內存中會單獨開辟壹塊內存用來存放字符串對象(只能由String類來維護)。程序中出現的字符串常量都是在池中的。比如String a = “ab”,String c =”cd“。而new操作符產生的String對象將不會放在字符串池中。如String cd = new String("cd");是在堆中的(java中所有的對象的存放地)至於為什麽,還是那句話:說來話長。

好我可以開始解釋了

String ab=a+b;//通過+運算符返回新的String對象

System.out.println(ab=="ab");//"ab"是池中對象,ab沒有在池中的對象不壹樣

結果false 不解釋。

String cd=c+d;

System.out.println(cd=="cd");

編譯器優化後

String cd="cd';//池中對象

System.out.println(cd=="cd");//跟自身相比肯定相等 true 不解釋

String tmp=new String(new char[]{'c','d'});

這裏解釋壹下intern的實現邏輯

如果池中已經有相同的字符串了,直接返回池中字符串,否則將tmp拷貝壹份放入池中並返回池中對象

註意這裏是拷貝而不是將引用指向池中對象(String是final的)

String t=tmp.intern();// 返回池中的"cd",因為已經存在了cd所以這個返回的對象跟cd沒有半毛錢的關系。

System.out.println(cd==t);// 肯定是true不解釋

我寫了這麽多,只是覺得大家對於String這個對象特別的執著,不論是面試還是考試 ,其實妳只要不再循環裏+或者+=字符串的話其實是沒有什麽問題。妳平時寫個 Stirng aaa = "a'+"b"的話編譯器是會幫妳優化的。無關痛癢。

  • 上一篇:引擎源代碼
  • 下一篇:MACD背離抄底法是什麽?
  • copyright 2024編程學習大全網