String 句喷、StringBuffer、StringBuilder的區(qū)別:
String 字符串常量
StringBuffer字符串變量(線程安全的可變字符序列)
StringBuilder字符串變量(非線程安全)
String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同于生成了一個新的 String 對象兔毙,然后將指針指向新的 String 對象
每次結(jié)果都會對StringBuffer對象本身進行操作唾琼,而不是生成新的對象,再改變對象引用澎剥。
StirngBuffer和StringBuilder都是一個類似于 String 的字符串緩沖區(qū)锡溯,只要字符緩沖區(qū)包含的字符串沒有超過容量,就無需分配新的內(nèi)部緩沖數(shù)組哑姚,如果溢出祭饭,則容量會自動增大。但是StringBuilder通常情況下會更快叙量,因為他不執(zhí)行同步倡蝙,
java的九種基本類型以及他們的封裝類:
java提供了一組基本數(shù)據(jù)類型,包括
boolean, byte, char, short,? int, long, float, double, void.
同時绞佩,java也提供了這些類型的封裝類寺鸥,分別為
Boolean, Byte, Character, Short, Integer, Long, Float, Double, Void
在java中使用基本類型來存儲語言支持的基本數(shù)據(jù)類型,這里沒有采用對象品山,而是使用了傳統(tǒng)的面向過程語言所采用的基本類在型胆建,主要是從性能方面來考慮的:因為即使最簡單的數(shù)學(xué)計算,使用對象來處理也會引起一些開銷谆奥,而這些開銷對于數(shù)學(xué)計算本來是毫無必要的眼坏。但是在java中拂玻,泛型類包括預(yù)定義的集合酸些,使用的參數(shù)都是對象類型,無法直接使用這些基本數(shù)據(jù)類型檐蚜,所以java又提供了這些基本類型的包裝器魄懂。
基本數(shù)據(jù)類型只能按值傳遞,而封裝類按引用傳遞闯第。
基本類型在堆棧中創(chuàng)建市栗;而對于對象類型,對象在堆中創(chuàng)建咳短,對象的引用在堆棧中創(chuàng)建填帽。基本類型由于在堆棧中咙好,效率會比較高篡腌,但是可能會存在內(nèi)存泄漏的問題。
Switch能否用string做參數(shù)勾效?
到目前為止switch支持這樣幾種數(shù)據(jù)類型:byte short int char String
在java7中才開始支持String嘹悼,所以java7以前是不支持的叛甫。
那么這兒就出現(xiàn)一個問題,在Switch中杨伙,判斷兩個String是否相等是值相等還是引用相等其监?
其實swich只支持一種數(shù)據(jù)類型,那就是整型限匣,其他數(shù)據(jù)類型都是轉(zhuǎn)換成整型之后在使用switch的抖苦。
而char類型的比較就是在比較他們的ascii碼,而String的比較就是在比較他們的hashcode和equals是否相等米死。
而hashcode是根據(jù)String類型的值是否一樣睛约,但是也有可能hashcode碰撞,所以在加一層equals哲身。(為什么要這么做辩涝,因為獲取他的hashcode快,所以只有當相同時再判斷equal會提高效率)勘天。
equals和== 的區(qū)別:
當他們用(==)進行比較的時候怔揩,比較的是他們在內(nèi)存中的存放地址,所以脯丝,除非是同一個new出來的對象商膊,他們的比較后的結(jié)果為true,否則比較后結(jié)果為false宠进。 JAVA當中所有的類都是繼承于Object這個基類的晕拆,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內(nèi)存地 址材蹬,但在一些類庫當中這個方法被覆蓋掉了实幕,如String,Integer,Date在這些類當中equals有其自身的實現(xiàn),而不再是比較類在堆內(nèi)存中的存放地址了堤器。
Object有哪些公用方法昆庇?
1.clone方法
保護方法,實現(xiàn)對象的淺復(fù)制闸溃,只有實現(xiàn)了Cloneable接口才可以調(diào)用該方法整吆,否則拋出CloneNotSupportedException異常。
主要是JAVA里除了8種基本類型傳參數(shù)是值傳遞辉川,其他的類對象傳參數(shù)都是引用傳遞表蝙,我們有時候不希望在方法里講參數(shù)改變,這是就需要在類中復(fù)寫clone方法乓旗。
2.getClass方法
final方法府蛇,獲得運行時類型。
3.toString方法
該方法用得比較多寸齐,一般子類都有覆蓋欲诺。
4.finalize方法
該方法用于釋放資源抄谐。因為無法確定該方法什么時候被調(diào)用,很少使用扰法。
5.equals方法
該方法是非常重要的一個方法蛹含。一般equals和==是不一樣的,但是在Object中兩者是一樣的塞颁。子類一般都要重寫這個方法浦箱。
6.hashCode方法
該方法用于哈希查找,可以減少在查找中使用equals的次數(shù)祠锣,重寫了equals方法一般都要重寫hashCode方法酷窥。這個方法在一些具有哈希功能的Collection中用到。
一般必須滿足obj1.equals(obj2)==true伴网∨钔疲可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就滿足equals澡腾。不過為了提高效率沸伏,應(yīng)該盡量使上面兩個條件接近等價。
如果不重寫hashcode(),在HashSet中添加兩個equals的對象动分,會將兩個對象都加入進去毅糟。
7.wait方法
wait方法就是使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者澜公,也就是具有該對象的鎖姆另。wait()方法一直等待,直到獲得鎖或者被中斷坟乾。wait(long timeout)設(shè)定一個超時間隔迹辐,如果在規(guī)定時間內(nèi)沒有獲得鎖就返回。
調(diào)用該方法后當前線程進入睡眠狀態(tài)糊渊,直到以下事件發(fā)生右核。
(1)其他線程調(diào)用了該對象的notify方法。
(2)其他線程調(diào)用了該對象的notifyAll方法渺绒。
(3)其他線程調(diào)用了interrupt中斷該線程。
(4)時間間隔到了菱鸥。
此時該線程就可以被調(diào)度了宗兼,如果是被中斷的話就拋出一個InterruptedException異常。
8.notify方法
該方法喚醒在該對象上等待的某個線程氮采。
9.notifyAll方法
該方法喚醒在該對象上等待的所有線程殷绍。
hashcode 的作用 :
hashode 主要是用于查找的,而equals是用于比較兩個對象是否相等鹊漠。(在switch中用String做參數(shù)主到,會看到他們兩個的配合使用)茶行。
public native int hashCode();它是一個本地方法,它的實現(xiàn)與本地機器有關(guān)登钥,這里我們暫且認為他返回的是對象存儲的物理位置(實際上不是畔师,這里寫是便于理解)。
Java的四種引用牧牢,強弱軟虛看锉,用到的場景:
強引用:如“Object obj = new Object()”,這類引用是 Java 程序中最普遍的塔鳍。只要強引用還存在伯铣,垃圾收集器就永遠不會回收掉被引用的對象。
軟引用:它用來描述一些可能還有用轮纫,但并非必須的對象腔寡。在系統(tǒng)內(nèi)存不夠用時,這類引用關(guān)聯(lián)的對象將被垃圾收集器回收掌唾。JDK1.2 之后提供了 SoftReference 類來實現(xiàn)軟引用
弱引用:它也是用來描述非需對象的蹬蚁,但它的強度比軟引用更弱些,被弱引用關(guān)聯(lián)的對象只能生存到下一次垃圾收集發(fā)生之前郑兴。當垃圾收集器工作時犀斋,無論當前內(nèi)存是否足夠,都會回收掉只被弱引用關(guān)聯(lián)的對象情连。在 JDK1.2 之后叽粹,提供了 WeakReference 類來實現(xiàn)弱引用。
虛引用:最弱的一種引用關(guān)系却舀,完全不會對其生存時間構(gòu)成影響虫几,也無法通過虛引用來取得一個對象實例。為一個對象設(shè)置虛引用關(guān)聯(lián)的唯一目的是希望能在這個對象被收集器回收時收到一個系統(tǒng)通知挽拔。JDK1.2 之后提供了 PhantomReference 類來實現(xiàn)虛引用辆脸。