JAVA Doc
public final class String extends Object implements Serializable, Comparable, CharSequence
String 類代表字符串Java程序中的所有字符串字面值(如 "abc" )都作為此類的實例實現(xiàn)。 字符串是常量;它們的值在創(chuàng)建之后不能更改。字符串緩沖區(qū)支持可變的字符串。因為 String 對象是不可變的,所以可以共享。例如:String str = "abc"; //等效于: char data[] = {'a', 'b', 'c'}; String str = new String(data);
概述:
Java 把內(nèi)存劃分成兩種:一種是棧內(nèi)存,另一種是堆內(nèi)存。在函數(shù)中定義的一些基本類型的變量和對象的引用變量都是在函數(shù)的棧內(nèi)存中分配,當在一段代碼塊定義一個變量時,Java 就在棧中為這個變量分配內(nèi)存空間,當超過變量的作用域后,Java會自動釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作它用。
堆內(nèi)存用來存放由new創(chuàng)建的對象和數(shù)組,在堆中分配的內(nèi)存,由Java虛擬機的自動垃圾回收器來管理。在堆中產(chǎn)生了一個數(shù)組或者對象之后,還可以在棧中定義一個特殊的變量,讓棧中的這個變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址,棧中的這個變量就成了數(shù)組或?qū)ο蟮囊米兞浚院缶涂梢栽诔绦蛑惺褂脳V械囊米兞縼碓L問堆中的數(shù)組或者對象,引用變量就相當于是為數(shù)組或者對象起的一個名稱。
引用變量是普通的變量,定義時在棧中分配,引用變量在程序運行到其作用域之外后被釋放。而數(shù)組和對象本身在堆中分配,即使程序運行到使用 new 產(chǎn)生數(shù)組或者對象的語句所在的代碼塊之外,數(shù)組和對象本身占據(jù)的內(nèi)存不會被釋放,數(shù)組和對象在沒有引用變量指向它的時候,才變?yōu)槔荒茉诒皇褂茫匀徽紦?jù)內(nèi)存空間不放,在隨后的一個不確定的時間被垃圾回收器收走(釋放掉)。這也是Java比較占內(nèi)存的原因。
實際上,棧中的變量指向堆內(nèi)存中的變量,這就是Java中的指針!
String類是一個很特殊的類,它本身是final的,它是不可變的,String類是的本質(zhì)是字符數(shù)組char[], 并且其值不可改變,但StringBuilder也是final,為什么StringBuilder是可變的呢? 究其原因,String類的內(nèi)部是char[]數(shù)組構成,而String的加號(+)運算符的底層是由StringBuilder實現(xiàn)的,一個String每次“+“上一個String,都會創(chuàng)建一個新的StringBuilder,然后調(diào)用它的append()方法,該方法返回一個新形成的String。所以字符串的一些合并操作可以使用StringBuilder來提高效率。
用new String()創(chuàng)建的字符串不是常量,不能在編譯期就確定,而因為String是類,所以new String()創(chuàng)建的字符串不放入常量池中,它們有自己的地址空間。即Java中,只要使用new關鍵字來創(chuàng)建對象,則一定會(在堆區(qū)或棧區(qū))創(chuàng)建一個新的對象。而直接初始化則會形成字符串常量,分配到運行時常量池中,這會在編譯時確定。
JAVA String中null和""的區(qū)別String str; String str = null; String str = "";三種定義的區(qū)別:1,聲明一字符串對象 2,定義一空字符串對象 3,創(chuàng)建一個字符串為空的字符串對象
//定義后在后面程序判斷時用if(str == null || str == ""){} public class Test{ static String str1;//成員變量自動賦值 null public static void main(String[] args){ String str;//方法變量 不會賦值,需要顯式賦值 System.out.print(str1+" "+str);//str1輸出值為null str則會編譯不通過 } }
方法:
intern
常量池在運行期被JVM裝載后,是可以擴充的。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調(diào)用intern()方法時,Java查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個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(),但它的返回值沒有賦給s1 true //說明s1.intern()返回的是常量池中"kvill"的引用 true
其他方法:
獲取方法
char charAt(int index) //根據(jù)位置獲取某個字符
char ch="abc";ch.charAt(1);// 返回'b'
int indexOf(int ch) //返回的是ch在字符串中第一次出現(xiàn)的位置
int indexOf(int ch,int fromIndex) //從fromIndex指定位置開始,獲取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()方法比較字符串對象中的字符,==運算符比較兩個對象是否引用同一實例。 String s1="Hello"; String s2=new String(s1); s1.eauals(s2); //true s1==s2;//falseboolean equalsIgnoreCase(String str);忽略大小寫的比較
轉(zhuǎn)換方法
?將字符數(shù)組轉(zhuǎn)換為字符串
構造函數(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指定了子串開始字符的下標,sourceEnd指定了子串結(jié)束后的下一個字符的下標。因此,子串包含從sourceStart到sourceEnd-1的字符。接收字符的數(shù)組由target指定,target中開始復制子串的下標值是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)換成大小寫
String toUpperCase()和String toLowerCase()
將字符串兩端的空格去除 String trim()
對兩個字符串進行自然順序的比較 int compareTo(String str)
concat() 連接兩個字符串
String的亂碼解決:
--TODO