JAVA Doc
public final class String extends Object implements Serializable, Comparable, CharSequence
String 類代表字符串Java程序中的所有字符串字面值(如 "abc" )都作為此類的實(shí)例實(shí)現(xiàn)杭攻。 字符串是常量银觅;它們的值在創(chuàng)建之后不能更改团甲。字符串緩沖區(qū)支持可變的字符串惠况。因?yàn)?String 對(duì)象是不可變的娄蔼,所以可以共享。例如:String str = "abc"; //等效于: char data[] = {'a', 'b', 'c'}; String str = new String(data);
概述:
Java 把內(nèi)存劃分成兩種:一種是棧內(nèi)存剖笙,另一種是堆內(nèi)存未妹。在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配呻逆,當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java 就在棧中為這個(gè)變量分配內(nèi)存空間菩帝,當(dāng)超過(guò)變量的作用域后咖城,Java會(huì)自動(dòng)釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作它用呼奢。
堆內(nèi)存用來(lái)存放由new創(chuàng)建的對(duì)象和數(shù)組宜雀,在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理握础。在堆中產(chǎn)生了一個(gè)數(shù)組或者對(duì)象之后辐董,還可以在棧中定義一個(gè)特殊的變量,讓棧中的這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址禀综,棧中的這個(gè)變量就成了數(shù)組或?qū)ο蟮囊米兞考蚝妫院缶涂梢栽诔绦蛑惺褂脳V械囊米兞縼?lái)訪問(wèn)堆中的數(shù)組或者對(duì)象,引用變量就相當(dāng)于是為數(shù)組或者對(duì)象起的一個(gè)名稱定枷。
引用變量是普通的變量孤澎,定義時(shí)在棧中分配,引用變量在程序運(yùn)行到其作用域之外后被釋放欠窒。而數(shù)組和對(duì)象本身在堆中分配覆旭,即使程序運(yùn)行到使用 new 產(chǎn)生數(shù)組或者對(duì)象的語(yǔ)句所在的代碼塊之外,數(shù)組和對(duì)象本身占據(jù)的內(nèi)存不會(huì)被釋放岖妄,數(shù)組和對(duì)象在沒(méi)有引用變量指向它的時(shí)候型将,才變?yōu)槔荒茉诒皇褂眉雠埃匀徽紦?jù)內(nèi)存空間不放七兜,在隨后的一個(gè)不確定的時(shí)間被垃圾回收器收走(釋放掉)。這也是Java比較占內(nèi)存的原因缚俏。
實(shí)際上惊搏,棧中的變量指向堆內(nèi)存中的變量贮乳,這就是Java中的指針!
String類是一個(gè)很特殊的類恬惯,它本身是final的向拆,它是不可變的,String類是的本質(zhì)是字符數(shù)組char[], 并且其值不可改變,但StringBuilder也是final酪耳,為什么StringBuilder是可變的呢浓恳? 究其原因,String類的內(nèi)部是char[]數(shù)組構(gòu)成碗暗,而String的加號(hào)(+)運(yùn)算符的底層是由StringBuilder實(shí)現(xiàn)的颈将,一個(gè)String每次“+“上一個(gè)String,都會(huì)創(chuàng)建一個(gè)新的StringBuilder,然后調(diào)用它的append()方法言疗,該方法返回一個(gè)新形成的String晴圾。所以字符串的一些合并操作可以使用StringBuilder來(lái)提高效率。
用new String()創(chuàng)建的字符串不是常量噪奄,不能在編譯期就確定死姚,而因?yàn)镾tring是類,所以new String()創(chuàng)建的字符串不放入常量池中勤篮,它們有自己的地址空間都毒。即Java中,只要使用new關(guān)鍵字來(lái)創(chuàng)建對(duì)象碰缔,則一定會(huì)(在堆區(qū)或棧區(qū))創(chuàng)建一個(gè)新的對(duì)象账劲。而直接初始化則會(huì)形成字符串常量,分配到運(yùn)行時(shí)常量池中金抡,這會(huì)在編譯時(shí)確定瀑焦。
JAVA String中null和""的區(qū)別String str; String str = null; String str = "";三種定義的區(qū)別:1,聲明一字符串對(duì)象 2竟终,定義一空字符串對(duì)象 3蝠猬,創(chuàng)建一個(gè)字符串為空的字符串對(duì)象
//定義后在后面程序判斷時(shí)用if(str == null || str == ""){} public class Test{ static String str1;//成員變量自動(dòng)賦值 null public static void main(String[] args){ String str;//方法變量 不會(huì)賦值,需要顯式賦值 System.out.print(str1+" "+str);//str1輸出值為null str則會(huì)編譯不通過(guò) } }
方法:
intern
常量池在運(yùn)行期被JVM裝載后,是可以擴(kuò)充的统捶。String的intern()方法就是擴(kuò)充常量池的一個(gè)方法榆芦;當(dāng)一個(gè)String實(shí)例str調(diào)用intern()方法時(shí),Java查找常量池中是否有相同Unicode的字符串常量喘鸟,如果有匆绣,則返回其的引用,如果沒(méi)有什黑,則在常量池中增加一個(gè)Unicode等于str的字符串并返回它的引用崎淳;看下面的例子就清楚了
String s0= "kvill"; String s1=new String("kvill"); String s2=new String("kvill"); System.out.println( s0==s1 ); System.out.println( "**" ); s1.intern(); s2=s2.intern(); //把常量池中"kvill"的引用賦給s2 System.out.println( s0==s1); System.out.println( s0==s1.intern() ); System.out.println( s0==s2 );結(jié)果為:
false
false //雖然執(zhí)行了s1.intern(),但它的返回值沒(méi)有賦給s1 true //說(shuō)明s1.intern()返回的是常量池中"kvill"的引用 true
其他方法:
獲取方法
char charAt(int index) //根據(jù)位置獲取某個(gè)字符
char ch="abc";ch.charAt(1);// 返回'b'
int indexOf(int ch) //返回的是ch在字符串中第一次出現(xiàn)的位置
int indexOf(int ch,int fromIndex) //從fromIndex指定位置開(kāi)始愕把,獲取ch在字符串中第一次出現(xiàn)的位置
int indexOf(String str)
int indexOf(String str,int fromIndex)
int lastIndexOf(int ch)
判斷方法
boolean contains(String str) //另一種判斷方法:
if(str.index(str)!=-1)
boolean startsWith(String str)和boolean endsWith(String str)
bolean isEmpty(String str)
boolean equals(String str)//和==//equals()方法比較字符串對(duì)象中的字符拣凹,==運(yùn)算符比較兩個(gè)對(duì)象是否引用同一實(shí)例森爽。 String s1="Hello"; String s2=new String(s1); s1.eauals(s2); //true s1==s2;//falseboolean equalsIgnoreCase(String str);忽略大小寫(xiě)的比較
轉(zhuǎn)換方法
?將字符數(shù)組轉(zhuǎn)換為字符串
構(gòu)造函數(shù)
String(char[] chs) String(char[] chs,offset,count)將字符數(shù)組中的一部分轉(zhuǎn)成字符串。
靜態(tài)方法
static String copyValueOf(char[] chs)
static String copyValueOf(char[] chs,int offset,int count)
static String valueOf(char[] )
static String valueOf(char[] chs,int offset,int count)
?將字符串轉(zhuǎn)換成字符數(shù)組 char[] toCharArray
?將字符數(shù)組轉(zhuǎn)換成字符串
?將字符串轉(zhuǎn)換成字節(jié)數(shù)組 byte[] toBytes
替換方法
String replace(olderStr,newStr)
切割截取方法
String split(regex)
void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)
sourceStart指定了子串開(kāi)始字符的下標(biāo)嚣镜,sourceEnd指定了子串結(jié)束后的下一個(gè)字符的下標(biāo)爬迟。因此,子串包含從sourceStart到sourceEnd-1的字符菊匿。接收字符的數(shù)組由target指定付呕,target中開(kāi)始復(fù)制子串的下標(biāo)值是targetStart。String s="this is a demo of the getChars method."; char buf[]=new char[20];s.getChars(10,14,buf,0);
獲取子串
String subString(begin)
String subString(begin,end)包含頭不包含尾
將字符串轉(zhuǎn)換成大小寫(xiě)
String toUpperCase()和String toLowerCase()
將字符串兩端的空格去除 String trim()
對(duì)兩個(gè)字符串進(jìn)行自然順序的比較 int compareTo(String str)
concat() 連接兩個(gè)字符串
String的亂碼解決:
--TODO