字符串:在java中將與字符串有關的內容面向對象了,形成的類叫String,字符串表示的方法--""
分兩類:對字符串的處理是可變還是不可變的,和地址無關
對于字符串整體有兩個地方可能會發(fā)生變化:1.引用的指向 2.字符串本身
1.不可變字符:String:說的是字符串本身沒有變化,與引用無關(這里的意思是不管引用指向哪個地方空骚,String類型的本身一定不變,只是沒有引用來指向擂仍,原本的引用指向變了)
2.可變字符串:StringBuffer/StringBuilder:說的是字符串本身發(fā)生了變化,與引用無關
字符串常量(不可變字符串)的保存位置:被放在了常量區(qū)熬甚,可以認為在堆中的一塊特殊區(qū)域
變量的特點:同一個名字的字符串在內存中只允許存在一個
String s1 = "1000phone";
String s2 = "1000phone";
String s3 = new String("1000phone");
String s4 = new String("1000phone");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
原理:
(1)如果不可變字符串后面直接賦值逢渔,其工作原理是,會到常量區(qū)找叫1000phone的字符串乡括,如果有直接保存他的賦值肃廓,如果沒有才會在常量區(qū)開辟一塊空間存儲1000phone
(2)如果是new的話,就是在堆區(qū)單獨開辟一塊空間诲泌,而1000phone作為參數(shù)傳給了對象盲赊,保存在了對象內一個String類型的成員變量里面
注意點:字符串的比較用equals方法,因為字符串自動重寫了equals方法敷扫,重新定義了比較的規(guī)則哀蘑,規(guī)則變成讓s1和s3的內容(保存1000phone地址的常量)去比較
System.out.println(s1.equals(s2));//true System.out.println(s1.equals(s3));//true,String類中自動重寫了,是拿對象里面保存的指向常量的地址和直接指向常量的地址進行比較