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)建,這兩者存儲的內(nèi)存地址是不一樣的。
如果是字面值創(chuàng)建的方式,如 String a="a",JVM會先去字符串常量池中尋找有沒有“a”這個字符串,若有,則將其地址給 a;若沒有,則先在常量池里創(chuàng)建“a”,然后再把地址給a;而通過 new a = new String("a")的方式創(chuàng)建對象,則是在堆中創(chuàng)建“a”對象,a 指向這個對象。
當(dāng)字符串進(jìn)行拼接時,如果是字面值進(jìn)行拼接,在編譯階段會進(jìn)行優(yōu)化,直接變成字符串”abc“。
當(dāng)字符串變量相加時,因被final修飾,字符串不能修改,會 先生成StringBuilder對象,通過append()方法進(jìn)行字符串拼接,在調(diào)用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 對象,然后對兩個字符串進(jìn)行append,最后調(diào)用StringBuilder的toString方法進(jìn)行返回 新的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調(diào)用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就不講了,第一個由于是字符串字面量進(jìn)行+操作,編譯階段直接有一個 javaandpython的字符串再常量池中,而不是通過StringBuilder.
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id
這篇文章主要介紹了如何用注解的方式實現(xiàn)Mybatis插入數(shù)據(jù)時返回自增的主鍵Id,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
如何解決Idea沒有elementui標(biāo)簽的代碼提示問題
這篇文章主要介紹了如何解決Idea沒有elementui標(biāo)簽的代碼提示問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04

