電話面
自我介紹
String星立、StringBuffer與StringBuilder之間區(qū)別
Java中字符串常量相加
HashMap和Hashtable的區(qū)別
主要的區(qū)別有:線程安全性,同步(synchronization)葬凳,以及速度。
HashMap幾乎可以等價(jià)于Hashtable室奏,除了HashMap是非synchronized的火焰,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)胧沫。
HashMap是非synchronized昌简,而Hashtable是synchronized,這意味著Hashtable是線程安全的绒怨,多個(gè)線程可以共享一個(gè)Hashtable纯赎;而如果沒有正確的同步的話,多個(gè)線程是不能共享HashMap的南蹂。Java 5提供了ConcurrentHashMap犬金,它是HashTable的替代,比HashTable的擴(kuò)展性更好六剥。
另一個(gè)區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器晚顷,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素)疗疟,將會(huì)拋出ConcurrentModificationException该默,但迭代器本身的remove()方法移除元素則不會(huì)拋出ConcurrentModificationException異常。但這并不是一個(gè)一定發(fā)生的行為策彤,要看JVM栓袖。這條同樣也是Enumeration和Iterator的區(qū)別。
由于Hashtable是線程安全的也是synchronized店诗,所以在單線程環(huán)境下它比HashMap要慢裹刮。如果你不需要同步,只需要單一線程必搞,那么使用HashMap性能要好過Hashtable必指。
HashMap不能保證隨著時(shí)間的推移Map中的元素次序是不變的。
HashMap的工作原理
HashMap基于hashing原理恕洲,我們通過put()和get()方法儲(chǔ)存和獲取對(duì)象塔橡。當(dāng)我們將鍵值對(duì)傳遞給put()方法時(shí)梅割,它調(diào)用鍵對(duì)象的hashCode()方法來計(jì)算hashcode,讓后找到bucket位置來儲(chǔ)存值對(duì)象葛家。當(dāng)獲取對(duì)象時(shí),通過鍵對(duì)象的equals()方法找到正確的鍵值對(duì)癞谒,然后返回值對(duì)象底燎。HashMap使用鏈表來解決碰撞問題,當(dāng)發(fā)生碰撞了弹砚,對(duì)象將會(huì)儲(chǔ)存在鏈表的下一個(gè)節(jié)點(diǎn)中双仍。 HashMap在每個(gè)鏈表節(jié)點(diǎn)中儲(chǔ)存鍵值對(duì)對(duì)象。HashMap是在bucket中儲(chǔ)存鍵對(duì)象和值對(duì)象桌吃,作為Map.Entry朱沃。
關(guān)于hashMap的key和value的理解
HashMap 負(fù)載因子
HashMap中的數(shù)據(jù)量/HashMap的總?cè)萘?initialCapacity),當(dāng)loadFactor達(dá)到指定值或者0.75時(shí)候,HashMap的總?cè)萘孔詣?dòng)擴(kuò)展一倍茅诱,以此類推逗物。
判斷樹是否為平衡二叉樹
1.遞歸求樹的深度
2.判斷該樹是否為平衡二叉樹
方法一:調(diào)用上述函數(shù)求每個(gè)節(jié)點(diǎn)的左右孩子深度;
方法二:由于上述方法在求該結(jié)點(diǎn)的的左右子樹深度時(shí)遍歷一遍樹瑟俭,再次判斷子樹的平衡性時(shí)又遍歷一遍樹結(jié)構(gòu)翎卓,造成遍歷多次。因此方法二是一邊遍歷樹一邊判斷每個(gè)結(jié)點(diǎn)是否具有平衡性摆寄。
樹的遍歷
image.png
統(tǒng)計(jì)一個(gè)無序數(shù)組中出現(xiàn)次數(shù)最多的元素
方法一:先對(duì)數(shù)組排序失暴,所有相同的元素都會(huì)集中到一起,再進(jìn)行一次遍歷就能解決問題椭迎。
方法二:用哈希表統(tǒng)計(jì)出各個(gè)元素出現(xiàn)次數(shù) - count()锐帜,用容量為K的最小堆找出最大的K個(gè)數(shù) - topK()
Java的接口和抽象類
1.語法層面上的區(qū)別
1)抽象類可以提供成員方法的實(shí)現(xiàn)細(xì)節(jié),而接口中只能存在public abstract 方法畜号;
2)抽象類中的成員變量可以是各種類型的缴阎,而接口中的成員變量只能是public static final類型的;
3)接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法简软,而抽象類可以有靜態(tài)代碼塊和靜態(tài)方法蛮拔;
4)一個(gè)類只能繼承一個(gè)抽象類,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口痹升。
2.設(shè)計(jì)層面上的區(qū)別
1)抽象類是對(duì)一種事物的抽象建炫,即對(duì)類抽象,而接口是對(duì)行為的抽象疼蛾。
2)設(shè)計(jì)層面不同肛跌,抽象類作為很多子類的父類,它是一種模板式設(shè)計(jì)。而接口是一種行為規(guī)范衍慎,它是一種輻射式設(shè)計(jì)转唉。
JAVA多線程實(shí)現(xiàn)的三種方式
1.繼承Thread類實(shí)現(xiàn)多線程
2.實(shí)現(xiàn)Runnable接口方式實(shí)現(xiàn)多線程
3.使用ExecutorService、Callable稳捆、Future實(shí)現(xiàn)有返回結(jié)果的多線程
Activity的四種啟動(dòng)模式及區(qū)別
standard
默認(rèn)模式赠法,可以不用寫配置。在這個(gè)模式下乔夯,都會(huì)默認(rèn)創(chuàng)建一個(gè)新的實(shí)例砖织。因此,在這種模式下末荐,可以有多個(gè)相同的實(shí)例侧纯,也允許多個(gè)相同Activity疊加。
singleTop
可以有多個(gè)實(shí)例鞠评,但是不允許多個(gè)相同Activity疊加茂蚓。即,如果Activity在棧頂?shù)臅r(shí)候剃幌,啟動(dòng)相同的Activity,不會(huì)創(chuàng)建新的實(shí)例晾浴,而會(huì)調(diào)用其onNewIntent方法负乡。
singleTask
只有一個(gè)實(shí)例。在同一個(gè)應(yīng)用程序中啟動(dòng)他的時(shí)候脊凰,若Activity不存在抖棘,則會(huì)在當(dāng)前task創(chuàng)建一個(gè)新的實(shí)例,若存在狸涌,則會(huì)把task中在其之上的其它Activity destory掉并調(diào)用它的onNewIntent方法切省。
如果是在別的應(yīng)用程序中啟動(dòng)它,則會(huì)新建一個(gè)task帕胆,并在該task中啟動(dòng)這個(gè)Activity朝捆,singleTask允許別的Activity與其在一個(gè)task中共存,也就是說懒豹,如果我在這個(gè)singleTask的實(shí)例中再打開新的Activity芙盘,這個(gè)新的Activity還是會(huì)在singleTask的實(shí)例的task中。
singleInstance
只有一個(gè)實(shí)例脸秽,并且這個(gè)實(shí)例獨(dú)立運(yùn)行在一個(gè)task中儒老,這個(gè)task只有這個(gè)實(shí)例,不允許有別的Activity存在记餐。
HTTP請(qǐng)求過程
1.域名解析
2.發(fā)起TCP的3次握手
3.建立TCP連接后發(fā)起http請(qǐng)求
http://www.cnblogs.com/engeng/articles/5959335.html
HTTP請(qǐng)求報(bào)文和響應(yīng)報(bào)文是什么格式
起始行:如 GET / HTTP/1.0 (請(qǐng)求的方法 請(qǐng)求的URL 請(qǐng)求所使用的協(xié)議)
頭部信息:User-Agent Host等成對(duì)出現(xiàn)的值
主體
http://www.cnblogs.com/engeng/articles/5959335.html