java final String和String筆記


final String a="hello";
String b="hello";
String c="hellow";
String d=new String("hello"); 
System.out.println(a==b);
System.out.println("hell"+"ow"==c);
System.out.println((a+"w")==c);
System.out.println((b+"w")==c);
System.out.println(b==d);

上面代碼的執行結果為

true
true
true
false
false

下面是我在看了別人的文章后,結合對於C/C++的了解后得出的分析:
對於修飾變量的final關鍵字可以理解為C語言中的const關鍵字,表明了變量是一個常量。對於String類的底層實現,和C++中的類似,也可以理解為對const char的封裝。因此a,b,c的初始化都是將常量區中字符串的地址賦值給變量,不同的是對於變量a的理解為:typedef const char String; const String a="hello";即a指向地址不能變並且地址保存內容不能變。而d變量保存的則是通過new操作得到的堆上的地址,然后會把常量區字符串給拷貝到堆上的地址空間。java中對於final修飾的變量,在編譯前直接把變量替換為值,類似於宏,因此a+"w"會替換為"hello"+"w",對於這一個操作,java會直接在常量區中找"hellow",如果沒找到,就會在常量區創建一個"hellow",這一點可以從"hell"+"ow"c為true得到驗證。而對於b變量沒有被final修飾,所以b+"w"的操作,應該是String類型重載的+操作,這是在編譯后執行的,由於String底層是const char*,所以應該會重新在堆上開辟空間后將地址賦值給b。上面這些比較的都是地址值,所以會出現上述執行結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM