String problem and StringBuilder
一、String存在的問題
Java開辟了兩類存儲區(qū)域,分別是棧和堆:
| 棧 | 基本類型的變量和對象的引用變量 | 存取速度比堆要快,僅次于寄存器,棧數(shù)據(jù)可以共享 | 存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量 | 當超過變量的作用域后,Java會自動釋放掉該變量,內(nèi)存空間可以立即被另作他用 |
| 堆 | 由new等指令創(chuàng)建的對象和數(shù)組 | 可以動態(tài)地分配內(nèi)存大小,生存期也不必事先告訴編譯器 | 由于要在運行時動態(tài)分配內(nèi)存,存取速度較慢 | 由Java虛擬機的自動垃圾回收器來回收不再使用的數(shù)據(jù) |
我們在學習前需要先了解Java對象和引用變量,這更有利于之后理解String中存在的問題
請記住,String類是不可改變的,一旦創(chuàng)建String對象,那它的值就無法改變了
此處我們創(chuàng)建兩個變量str1和str2,
將其相加后,并非更改了原本引用變量str1指向的堆中String對象內(nèi)容,
而是重新開辟了一塊新空間,用來存放相加后的“HelloWorld”內(nèi)容,
并將原本指向“Hello”空間的引用變量str1(指針)指向了“HelloWorld”這塊空間。
此時原本str1指向的那塊空間“Hello”并沒有被銷毀,
而是在一段時間后由垃圾回收機制自動進行處理,
如果我們需要對很多字符串進行頻繁操作的時候,
這種模式下在單位時間內(nèi)顯然是十分耗費內(nèi)存空間
二、StringBuilder以及鏈式調(diào)用
為解決上面提出的問題,可以使用StringBuffer 和 StringBuilder 類。
和 String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象。
StringBuilder 的方法不是線程安全的(不能同步訪問),
但StringBuilder 相較于 StringBuffer 有速度優(yōu)勢,
所以多數(shù)情況下建議使用 StringBuilder 類。
嘗試使用StringBuilder:
(引用菜鳥教程中例子,其實質(zhì)是操作一個線性表)
自己寫一個例子:
package com.google.study.string;import org.junit.Test;public class StringBuilderTest {@Testpublic void demo(){StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("Hello");stringBuilder.append(" world");System.out.println(stringBuilder);} }總結(jié)
以上是生活随笔為你收集整理的String problem and StringBuilder的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DSP与单片机各自优势与比较
- 下一篇: Leetcode考场就坐