一、String類
● 字符串比較:== 和 equals()的區(qū)別窄陡?
·· ==:比較的是兩個(gè)字符串內(nèi)存地址的數(shù)值是否相同炕淮,屬于數(shù)值比較;
·· equals(): 比較的是兩個(gè)字符串的內(nèi)容泳梆,屬于內(nèi)容比較
● string類的兩種實(shí)例化方法的區(qū)別?
··直接賦值: 在每一個(gè)運(yùn)行的JVM低層存在一個(gè)字符串的對(duì)象池(方法區(qū)的運(yùn)行時(shí)常量池),直接賦值會(huì)將字符串的內(nèi)容放入到池中榜掌,以供其他繼續(xù)使用直接賦值方法的String對(duì)象使用优妙,如果新聲明的字符串內(nèi)容不再池之中,則會(huì)開辟一個(gè)新的憎账,繼續(xù)放到池中套硼,以供下次使用;String str = "hello" ----實(shí)際上開辟了兩塊空間
··構(gòu)造方法實(shí)例化:開辟兩塊堆內(nèi)存空間胞皱,一塊成為垃圾邪意,不能入池(除非手動(dòng)intern())
public class StringDemo {
public static void main(String args[]) {
String str1 = new String("Hello").intern();
String str2 = "Hello";// 入池
String str3 = "Hello";// 使用池對(duì)象
System.out.println(str1 == str2);// true
System.out.println(str1 == str3);// true
System.out.println(str2 == str3);// true
}
}
● String 、StringBuffer反砌、StringBuilder的區(qū)別雾鬼?
String s = "abcd";
s = s+1;
System.out.print(s);// result : abcd1
上述代碼解釋:首先創(chuàng)建對(duì)象s,賦予一個(gè)abcd宴树,然后再創(chuàng)建一個(gè)新的對(duì)象s用來(lái)執(zhí)行第二行代碼策菜,也就是說(shuō)我們之前對(duì)象s并沒(méi)有變化,所以我們說(shuō)String類型是不可改變的對(duì)象了酒贬,由于這種機(jī)制又憨,每當(dāng)用String操作字符串時(shí),實(shí)際上是在不斷的創(chuàng)建新的對(duì)象锭吨,而原來(lái)的對(duì)象就會(huì)變?yōu)槔唬牵没厥盏?/p>
StringBuilder與StringBuffer,前者線程非安全蠢莺,后者線程安全
● String類的常用方法:
//字符串與字符:
public String(char[] value) ---將全部字符數(shù)組轉(zhuǎn)變?yōu)樽址?public char[] toCharArray()---將字符串轉(zhuǎn)換為字符串?dāng)?shù)組
//字符串比較:
public boolean equals(String anObject)
public boolean equalsIgnoreCase(StringanotherString)
public int compareTo(String anotherString)---比較兩個(gè)字符串大小(1,0,-1)
//字符串查找:
public boolean contains(String s)
public int indexOf(String str)
public int indexOf(String str, int fromIndex)
//字符串替換:
public String replaceAll(String regex, String replacement)
public String replaceFirst(String regex, String replacement)
//字符串截攘闳纭:
public String substring(int beginIndex)---從指定位置開始截取到結(jié)尾
public String substring(int beginIndex, int endIndex) ---截取指定范圍的內(nèi)容
//字符串拆分:
public String[] split(String regex)
public String[] split(String regex, int limit)
二躏将、this關(guān)鍵字
⑴锄弱、this關(guān)鍵字用于區(qū)分局部變量和成員變量,比如在方法的參數(shù)中有名稱與成員變量相同的變量耸携,那么在該方法進(jìn)行賦值等其他操作運(yùn)算的時(shí)候棵癣,成員變量必須使用this來(lái)作為前綴,以此作為區(qū)分
⑵夺衍、類的方法中如果有對(duì)成員變量的操作狈谊,那么該方法會(huì)持有this兌現(xiàn)的引用地址,這樣能讓方法知道沟沙,它被哪個(gè)對(duì)象調(diào)用了
三河劝、static關(guān)鍵字
⑴、如果類中的某個(gè)方法并沒(méi)有涉及到任何成員變量矛紫,那么這個(gè)方法就沒(méi)有實(shí)例化的必要赎瞎,可以使用static修飾。
⑵颊咬、靜態(tài)方法只能訪問(wèn)類中的其他靜態(tài)方法务甥,或者靜態(tài)成員變量,而不能直接訪問(wèn)非靜態(tài)方法和非靜態(tài)的成員變量喳篇。
⑶敞临、靜態(tài)方法不能出現(xiàn)this關(guān)鍵字和super關(guān)鍵字,因?yàn)槌钟袑?duì)象的引用沒(méi)有意義的
⑸麸澜、主函數(shù)必須是靜態(tài)的
⑹挺尿、靜態(tài)成員變量即被static修飾的成員變量,可以直接通過(guò)類名.方法名直接進(jìn)行調(diào)用炊邦,而且同類的多個(gè)對(duì)象應(yīng)該是保有一份相同的靜態(tài)成員變量编矾,靜態(tài)成員變量?jī)?yōu)于對(duì)象的存在,不會(huì)因?yàn)橐粋€(gè)對(duì)象對(duì)靜態(tài)成員變量的修改而導(dǎo)致其他對(duì)象的靜態(tài)成員變量的修改馁害,并且靜態(tài)成員隨著類的加載而加載窄俏,而不是對(duì)象,會(huì)隨著類的消失而消失碘菜,并且存儲(chǔ)在方法區(qū)的靜態(tài)代碼區(qū)中
⑺裆操、靜態(tài)代碼塊是為了完成某個(gè)共同的初始化類操作而存在的,隨著類的加載而執(zhí)行炉媒,并且只加載一次
代碼塊只會(huì)隨著對(duì)象的加載而加載踪区,每次創(chuàng)建一次對(duì)象,就會(huì)加載一次
且靜態(tài)代碼塊優(yōu)先于構(gòu)造塊和主方法執(zhí)行吊骤,不管有多少個(gè)實(shí)例化對(duì)象產(chǎn)生缎岗,靜態(tài)塊都只調(diào)用一次
四、final白粉、finally传泊、finalize
1.final:如果一個(gè)類被final修飾鼠渺,意味著該類不能派生出新的子類,不能作為父類被繼承眷细。因此一個(gè)類不能被聲明為abstract拦盹,又被聲明為final。將變量或方法聲明為final溪椎∑沼撸可以保證他們?cè)谑褂玫臅r(shí)候不被改變。其初始化可以在兩個(gè)地方:一是其定義的地方校读,也就是在final變量在定義的時(shí)候就對(duì)其賦值沼侣;二是在構(gòu)造函數(shù)中。這兩個(gè)地方只能選其中的一個(gè)歉秫,要么在定義的時(shí)候給值蛾洛,要么在構(gòu)造函數(shù)中給值。被聲明為final的方法也只能使用雁芙,不能重寫轧膘。
2.finally:在異常處理的時(shí)候,提供finally塊來(lái)執(zhí)行任何的清除操作兔甘。如果拋出一個(gè)異常谎碍,那么相匹配的catch字句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入finally塊裂明,前提是有finally塊椿浓。
3.finalize:finalize是方法名太援,java技術(shù)允許使用finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作闽晦。這個(gè)方法是在垃圾收集器確認(rèn)一個(gè)對(duì)象沒(méi)有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在Object類中定義的提岔,因此仙蛉,所有的類都繼承了它。子類覆蓋finalize()方法已整理系統(tǒng)資源或者執(zhí)行其他清理工作碱蒙。finalize()方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的荠瘪。