本文目錄一覽:
java關於字元串拼接的問題
這是描述Java編譯器對字元串常量的優化方法。
眾所周知,數據內容是要定義在數據段的,假設下面的代碼:
String s1 = “abc” ;
String s2 = “abc” ;
假如不進行優化的話,結果就是內存中有兩個重複的”abc”內容,也就是說有兩個「對象」。
Java編譯器會針對這種情況進行優化,對於常量字元串”abc”,java編譯器會只產生一個”abc”對象。這樣,s1和s2是指向同一個內存區域的。
但假如字元串的值無法在編譯時確定,如:String g = a.concat(“3”);
那麼Java編譯器將會為g變數分配一個空間。注意也不是立即分配,因為Java編譯器是在全局對動態分配內存。
補充: 編譯器不會檢查 “test” + “3” 的結果是否就是”test3″,因此創建新對象。
java字元串拼接
不是指向同一個對象的。
假設再有個語句,String e = “test3”;因為String是final的,不可修改,所以可以把e看成常量。
當再遇到String d=”test”+”3″時,編譯器在這裡做了優化,把這條語句優化為String d=”test3″,由於存在一個相同的對象e,所以d也指向了e.
所以d、e是同一個對象。
而編譯器在處理String c=a+b時,認為是兩個變數相加,不會做優化。所以c,d不是同一個對象。
如果將a,b定義為
final String a = “test”;
final String b=”3″;
這時String c=a+b就變成了常量相加,所以編譯器會對其進行優化,即這時c,d就相等了
ps:推薦樓主一本書《深入java虛擬機》,對java的底層機制有很好的介紹。
Java字元串拼接問題
因為String類型是引用類型,s3和s4的引用值是不一樣的,儘管他們存儲的數據一樣,直接使用==進行比較,比較的是引用值的大小,所以是false,字元串這種引用類型比較大小的話一定要使用equals來比較,即System.out.println(s3.equals(s4));這樣,輸出結果就是true了。
java中string類concat方法和+的區別
java中string類concat方法和+的區別如下:
concat:將指定字元串連接到此字元串的結尾。如果參數字元串的長度為 0,則返回此 String 對象。否則,創建一個新的 String 對象,用來表示由此 String,對象表示的字元序列和參數字元串表示的字元序列連接而成的字元序列。示例:
“cares”.concat(“s”) returns “caress”
“to”.concat(“get”).concat(“her”) returns “together”參數:
str – 連接到此 String 結尾的 String。
返回:
一個字元串,它表示在此對象字元後連接字元串參數字元而成的字元。
+可以把任何類型的數據連接起來
C#拼接字元串的幾種方式和性能
C# 拼接字元串的幾種方式和性能
開發過程中常用到的拼接字元串的方法有三種:
1 簡單 「+=」 拼接法
1
2
3
4
5
string str=”a”;
str+=”c”+”d”;
string str_1=”a”+”b”;
首先需要明白的是string類型,string是引用類型,保留在堆上,而不是棧上,用的時候傳的是內存中的地址,每次修改就會重新創建一個新的string對象來存儲字元串,原有的會被自動回收。
第一種方式的實現原理,第一步先在內存中分配空間,存儲str變數的對象,值為”a”, 「+=」時,又會重新創建一個對象來存儲新的字元串(「abc”),把str指向這個新的地址。所以只有簡單幾步的拼寫時,一般不會有太大問題,如果有時候需要循環拼接時,就會不斷創建新的對象,很浪費性能和內存。
2 String.Format()
1
string str= String.Format(“{0}{1}{2}”,”a”,”b”,”c”);
這就需要先看看他的源代碼了,
public static String Format(IFormatProvider provider, String format, params Object[] args) br data-filtered=”filtered”{
if (format == null || args == null)
throw new ArgumentNullException((format==null)?”format”:”args”);
StringBuilder sb = new StringBuilder(format.Length + args.Length * 8);
sb.AppendFormat(provider,format,args);
return sb.ToString();
}
可以看到是先創建一個StringBuilder類型的變數,長度為第一個參數的長度+參數長度的8倍。.Net自動分配一個比較大的容量來存儲。StringBuilder的介紹請看第3種方法.
這種方式的代碼看起來比較整潔,易於月度,效率也比+=高效很多。
3 StringBuilder.Append
StringBuilder str=new StringBuilder();
str.Append(“a”);
StringBuilder 是預先創建一個比較大的內存,以後每次操作時判斷容量上限是否不夠用,如果不夠用就自動把容量擴大一倍,修改的還是第一次創建的對象的值。
如果是簡單的拼寫時,可以用 “+=”, string.format
循環內拼寫很長的字元串時,就需要用到StringBuilder來節省性能和內存了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/190101.html