淺談java中String相關問題
首先我們先說一下java堆內存和棧內存
java中八個基本數據類型就是值類型,存放在棧內存中;引用類型存放在堆內存中。
然后我們再看一看兩種不同比較字符串的方法
(1)equals比較兩個String對象的值是否相等
String str1 = "hello quanjizhu";
String str2 =str1+"haha";
String str3 = new String("hello quanjizhu");
System.out.println(str1.equals(str2)); //false
System.out.println(str1.equals(str3)); //true
(2)= =:比較兩個String對象的指向的內存地址是否相等
String str1 = "hello quanjizhu";
String str2 =str1+"haha";
String str3 = new String("hello quanjizhu");
System.out.println(str1==str2);//false
System.out.println(str1==str3); //false
3.String 創建
String str1 = new String("abc");
Stirng str2 = "abc";
前者str1的創建會直接在堆中創建一個String對象,然后將該對象的引用返回給用戶,注意前者jvm不會自己將字符串放入常量池中,除非運用intern方法。
后者jvm會現在常量池中尋找是否有該常量,如果有則返回給用戶,沒有則會先創建一個常量放入常量池中,然后再堆中創建一個對象指向這個常量,最后返回給用戶
下面舉個例子吧
String str1 = new String("abc"); //jvm 在堆上創建一個String對象
//jvm 在strings pool中找不到值為“abc”的字符串,因此
//在堆上創建一個String對象,并將該對象的引用加入至常量池中
//此時堆上有兩個String str1 str2 對象
Stirng str2 = "abc";
if(str1 == str2){
System.out.println("str1 == str2");
}else{
System.out.println("str1 != str2");
//打印結果是 str1 != str2,因為它們是堆上兩個不同的對象
再舉個例子
String str1 = new String("abc"); //jvm 在堆上創建一個String對象
str1 = str1.intern(); //將abc放入常量池中
//此時,jvm發現strings pool中已有“abc”對象了
//因此直接返回str1指向的對象給str2,也就是說str2和str1引用著同一個對象,
//此時,堆上的有效對象只有一個。
Stirng str2 = "abc";
if(str1 == str2){
System.out.println("str1 == str2");
}else{
System.out.println("str1 != str2");
}
//打印結果是 str1 == str2
4.字符串的串接
因為存在常量池中的常量一經創建后不可以改變,但是出現串接的操作會改變字符串的內容和長度,這不就矛盾了么,所以再出現串接時,java會自己new一個新的對象一步步的存儲內容,但是這樣做又非常麻煩啊,畢竟需要一步步的new對象,存對象。所以java又提供了StringBuffer/SringBulider類,他在做串接的時候改變的是內部的值,而不會new對象。
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。