java中String的使用十分頻繁,是咱們要學習的重點,在說String以前,咱們要知道堆跟棧的區別。java
java中的數據類型分原生數據類型(primitived types)有八種(byte,char,boolean,int,short,float,double,long)跟包裝類型(把原生數據類型包裝起來)也是八種,有Byte,String,Boolean,Integer,Short,Float,Double,Long。其中原生數據類型所有存在棧中,包裝類數據存在堆中。ide
棧的優勢:學習
一、棧的存取速度快,差很少僅次於位於cpu內的寄存器;對象
二、數據可共享。繼承
缺點:內存
一、存在棧中的數據大小與生存期必須是肯定的,因此缺少靈活性。字符串
堆的優勢:編譯器
一、可動態分配內存大小,生存期也沒必要事先告訴編譯器;it
二、java的垃圾回收會自動的回收再也不使用的數據。編譯
缺點:
一、因爲在運行時動態分配內存,會致使存取速度變慢。
因爲String類是final,因此其內容是不可改變的,這點很重要。因爲程序可能要使用到大量的字符串,而字符串類的內容一旦建立將不能被改變,因此java中提供了字符串池(String pool)的機制,在裏面存放字符串,能夠避免重複建立相同內容的字符串。建立字符串能夠採用字面賦值(eg:String str = "hello"; )和new方法(eg: String str = new String("hello");),當採用字面賦值時,首先會在String pool中查找是否存在"hello"這個對象,若是不存在,則在String pool中建立一個"hello"對象,而後將這個對象的地址返回來,賦給引用str,這樣str會指向String pool中的這個"hello"字符串對象;若是存在則不建立任何對象,直接將String pool中的這個對象地址返回來,賦值給str引用;當採用String s = new String("hello");首先會在String pool中查找是否有"hello"字符串對象,有的話就不會在String pool中再去建立這個對象,直接在堆中建立一個"hello"字符串對象,而後將堆中的這個對象地址返回來,賦給s引用,這樣s就指向堆中建立的字符串對象;若是沒有,就會先在String pool中建立"hello"對象,而後再在堆中建立一個"hello"對象,最後將堆中的字符串對象的地址返回來並賦給s引用,此時s指向堆中所建立的字符串對象。
java中有一個特殊的類Object類,除了它,全部的類都直接或間接地繼承它,Object類中定義了八個方法,其中一個是equals()方法,對於Object類的equals()方法來講,它是判斷調用該方法的引用與傳進來的引用是否相等,即地址是否同樣,是否指向同一個對象,可等價於==,但String類重寫(override)了改方法,使得該方法判斷的是當前字符串與傳進來的字符串的內容是否一致(不是判斷引用)。因此對於String對象的相等性判斷要使用equals()方法,而不適用"=="。
String是常量,其對象一旦建立完畢就沒法改變,若是使用"+"拼接字符串,會生成新的String對象,而不是向原有對象追加內容。