Java?String相加底層原理分析
Java String相加底層原理
代碼
?? ??? ?String a = "a"; ? ? ? ? String b = "b"; ? ? ? ? String c = "c"; ? ? ? ? String s1 ?= "a"+"b"+"c"; ? ? ? ? String s2 = a+b+c; ? ? ? ? System.out.println(s2==s1); ? ? ? ? System.out.println(System.identityHashCode(s1)); ? ? ? ? System.out.println(System.identityHashCode(s2));
粗略解釋
首先了解字符串常量池,創(chuàng)建字符串對象分別有兩種,一種是字面值創(chuàng)建,一種是 new 創(chuàng)建,這兩者存儲的內存地址是不一樣的。
如果是字面值創(chuàng)建的方式,如 String a="a",JVM會先去字符串常量池中尋找有沒有“a”這個字符串,若有,則將其地址給 a;若沒有,則先在常量池里創(chuàng)建“a”,然后再把地址給a;而通過 new a = new String("a")的方式創(chuàng)建對象,則是在堆中創(chuàng)建“a”對象,a 指向這個對象。
當字符串進行拼接時,如果是字面值進行拼接,在編譯階段會進行優(yōu)化,直接變成字符串”abc“。
當字符串變量相加時,因被final修飾,字符串不能修改,會 先生成StringBuilder對象,通過append()方法進行字符串拼接,在調用toString()方法形成新的字符串,所以s1可以理解為
? ? ? ? StringBuilder stringBuilder = new StringBuilder();
? ? ? ? stringBuilder.append("a");
? ? ? ? stringBuilder.append("b");
? ? ? ? stringBuilder.append("c");
? ? ? ? String s = stringBuilder.toString();上好的String 相加

//底層底層底層底層底層底層底層底層底層底層底層底層底層底層 //底層底層底層底層底層底層底層底層底層底層底層底層底層底層 //底層底層底層底層底層底層底層底層底層底層底層底層底層底層 //底層底層底層底層底層底層底層底層底層底層底層底層底層底層 //底層底層底層底層底層底層底層底層底層底層底層底層底層底層 //底層底層底層底層底層底層底層底層底層底層底層底層底層底層 //底層底層底層底層底層底層底層底層底層底層底層底層底層底層 //底層底層底層底層底層底層底層底層底層底層底層底層底層底層 return new String(result, 0, len + resultOffset);
兩個String 對象相加,底層先生成一個StringBulider 對象,然后對兩個字符串進行append,最后調用StringBuilder的toString方法進行返回 新的String對象 return new String()
String a="a";
String b="b";
String c=a+b;
String d=new String("ab");
System.out.println(a+b==c); //false
System.out.println((a+b).equals(c)); //ture調用equals方法時候,String重寫了equals ,比較的是String的值, 而==比較的是引用的地址的值,所以只要a+b一次就會返回一個新的String對象
看一個新的方法類似
public static boolean isAdmin(String userId){
return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
System.out.println(isAdmin("Admin"));
}以上代碼返回false 還是一樣底層上面方法返回 new String()

注意注意注意
String test="javaandpython";
String str1="java";
String str2="and";
String str3="python";
System. out. println(test=="java"+"and"+"python");
System. out. println(test ==str1 + str2 + str3);第一個true 第二個false就不講了,第一個由于是字符串字面量進行+操作,編譯階段直接有一個 javaandpython的字符串再常量池中,而不是通過StringBuilder.
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
如何解決SpringBoot2.x版本對Velocity模板不支持的方案
這篇文章主要介紹了如何解決SpringBoot2.x版本對Velocity模板不支持的方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
JAVA入門教學之快速搭建基本的springboot(從spring boot到spring cloud)
本文主要入門者介紹怎么搭建一個基礎的springboot環(huán)境,本文通過圖文并茂的形式給大家介紹從spring boot到spring cloud的完美搭建過程,適用java入門教學,需要的朋友可以參考下2021-02-02
java核心編程之文件過濾類FileFilter和FilenameFilter
這篇文章主要為大家詳細介紹了java文件過濾類FileFilter和FilenameFilter,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
SpringBoot項目中使用騰訊云發(fā)送短信的實現(xiàn)
本文主要介紹了SpringBoot項目中使用騰訊云發(fā)送短信的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04

