https://www.aliyun.com/jiaocheng/2861.html?spm=5176.100033.1.35.2ed56b03CbsYFK
摘要:String、StringBuffer、StringBuilder來自JDKSpannableString、SpannableStringBuilder來自Android的API先簡單分析一下來自JDK的三個字符串的區別:String:“字符串常量”(即定義字符串過后,就不能改變對象本身)StringBuffer:“字符串變量”,線性安全StringBuilder:“字符串變量”,線性不安全我們再來分析一下Android中的API的字符串:SpannableString:“字
-
String、StringBuffer、StringBuilder來自JDK
SpannableString、SpannableStringBuilder來自Android的API
先簡單分析一下來自JDK的三個字符串的區別:
String:“字符串常量”(即定義字符串過后,就不能改變對象本身)
StringBuffer : “字符串變量”,線性安全
StringBuilder : “字符串變量”,線性不安全
我們再來分析一下Android中的API的字符串:
SpannableString: “字符串常量”,可與TextView搭配改變顯示樣式的字符串
SpannableStringBuilder : “字符串變量”,可與TextView搭配改變顯示樣式的字符串
具體分析:
來一段String的代碼:
String str = "Hello World";
str = str+"!";
System.out.print(str);// result : Hello World!
這兒的str對象就改變了,不是說str是“字符串常量”,不是不能改變嗎?但是上面說的是不能改變對象本身,這兒str的改變相當於是新建一個字符串對象,然后將新建的字符串對象賦值給str,也就說str已經不再是原來的str了
String與StringBuffer的對比
String str = "Hello " + "World" + "!";
StringBuffer strBuffer= new StringBuffer("Hello ").append("World").append("!");
上面的代碼你會發現String的創建速度很快,StringBuffer根本不占什么優勢,那是因為String的創建相當於直接是String str = “Hello World!”,如果你改成下面這段代碼,你就知道他們巨大的差別了
String str2 = "Hello "
String str3 = "World";
String str4 = "!";
String str1 = str2 +str3 + str4;
StringBuffer strBuffer= new StringBuffer("Hello ");
strBuffer.append("World")
strBuffer.append("!");
這時你會發現String與StringBuffer有很大的創建時間差別,String因為每次都需創建一個字符串對象,它的時間就會比StringBuffer耗時更久!
StringBuffer與StringBuilder的區別在於StringBuffer是線性安全的,StringBuilder是線性不安全的,什么是線性安全?線性安全是當程序中多個線程對同一個字符串操作時,StringBuilder無法保證在同一時刻只有一個線程對字符串操作,而StringBuffer它就能夠保證線性安全,當然在耗時上StringBuffer要比StringBuilder耗時更久一點,但平時我們一般都在單線程中操作字符串,所以一般建議我們使用StringBuilder
SpannableString、SpannableStringBuilder和String的對比:
先來張圖:
<textview
android:id="@+id/activity_main_content_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="love is foam"
android:layout_marginTop="20dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/activity_main_content_1"/>
<textview
android:id="@+id/activity_main_content_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="One's mind settles as still water"
android:layout_marginTop="20dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/activity_main_content_2"/>
<textview
android:id="@+id/activity_main_content_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Eat without words and sleep without words"
android:layout_marginTop="20dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/activity_main_content_3"/>
<textview
android:id="@+id/activity_main_content_5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="When the mountains are high, the mountains are small"
android:layout_marginTop="20dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/activity_main_content_4"/>
<textview
android:id="@+id/activity_main_content_6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Jungle law"
android:layout_marginTop="20dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/activity_main_content_5"/>最后聽說低版本的Android系統在TextView設置ClickableSpan與OnClickListener時,會出現兩個事件會被同時觸發,所以這兒給了個參考解決辦法
SpannableString與SpannableStringBuilder設置樣式的主要的方法:
通過使用setSpan(Object what, int start, int end, int flags)改變文本樣式。
對應的參數:
start: 指定Span的開始位置
end: 指定Span的結束位置,並不包括這個位置。
flags:取值有如下四個
Spannable. SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括,即在文本前插入新的文本會應用該樣式,而在文本后插入新文本不會應用該樣式
Spannable. SPAN_INCLUSIVE_INCLUSIVE:前面包括,后面包括,即在文本前插入新的文本會應用該樣式,而在文本后插入新文本也會應用該樣式
Spannable. SPAN_EXCLUSIVE_EXCLUSIVE:前面不包括,后面不包括
Spannable. SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括
what: 對應的各種Span,不同的Span對應不同的樣式。已知的可用類有:
BackgroundColorSpan : 文本背景色
ForegroundColorSpan : 文本顏色
MaskFilterSpan : 修飾效果,如模糊(BlurMaskFilter)浮雕
RasterizerSpan : 光柵效果
StrikethroughSpan : 刪除線
SuggestionSpan : 相當於占位符
UnderlineSpan : 下划線
AbsoluteSizeSpan : 文本字體(絕對大小)
DynamicDrawableSpan : 設置圖片,基於文本基線或底部對齊。
ImageSpan : 圖片
RelativeSizeSpan : 相對大小(文本字體)
ScaleXSpan : 基於x軸縮放
StyleSpan : 字體樣式:粗體、斜體等
SubscriptSpan : 下標(數學公式會用到)
SuperscriptSpan : 上標(數學公式會用到)
TextAppearanceSpan : 文本外貌(包括字體、大小、樣式和顏色)
TypefaceSpan : 文本字體
URLSpan : 文本超鏈接
ClickableSpan : 點擊事件
參考資料
String、StringBuffer與StringBuilder之間區別
【Android】強大的SpannableStringBuilder
Android項目實戰(一): SpannableString與SpannableStringBuilder 以上是
Android中五大字符串總結(String、StringBuffer、StringBuilder、Spanna
-
的內容,更多
字符串 StringBuilder StringBuffer 五大Android 總結 Spanna String
-
的內容,請您使用右上方搜索功能獲取相關信息。