摘要:把內(nèi)存分成兩種,一種叫做棧內(nèi)存,一種叫做堆內(nèi)存在函數(shù)中定義的一些基本類型的變量和對象的引用變量都是在函數(shù)的棧內(nèi)存中分配。堆內(nèi)存用于存放由創(chuàng)建的對象和數(shù)組。
一次慘痛的阿里技術(shù)面
就在昨天,有幸接到了阿里的面試通知,本來我以為自己的簡歷應該不會的到面試的機會了,然而機會卻這么來了,我卻沒有做好準備,被面試官大大一通血虐。因此,我想寫點東西紀念一下這次的經(jīng)歷,也當一次教訓了。其實面試官大大問的問題我也都聽說過,卻知其然不知其所以然。在這里就整理一下了。
1. JAVA中的容器用過那些? 本人不才,用過的也就ArrayList、LinkedList、HaseSet、HashMap這幾個。然后面試官大大就問了,ArrayList和LinkedList的區(qū)別是啥呀,我心想不就是數(shù)組和鏈表的區(qū)別嗎,自己還手寫過這玩意,就簡單說了一說,發(fā)現(xiàn)還真的不知道說啥,特此整理一下。
ArrayList和LinkedList的區(qū)別大致來源于內(nèi)部的實現(xiàn):
前者是基于可變長數(shù)組的,數(shù)組的特性就是連續(xù)存儲的,可以方便的根據(jù)下標去查詢數(shù)據(jù),根據(jù)下標去修改數(shù)據(jù),而如果插入數(shù)據(jù)的話,插入到中間的話,這條數(shù)據(jù)之后的數(shù)據(jù)都需要后移,因此效率比較低,而且數(shù)組增長的時候,需要創(chuàng)建新的一個數(shù)組,并將數(shù)據(jù)拷貝一份,也會影響性能。
后者是基于雙向鏈表的,鏈表的特性就是不連續(xù)的,根據(jù)下標去查詢的話,需要移動鏈表的指針,必然會導致效率的降低,而數(shù)據(jù)的插入?yún)s方便了很多,只需要修改那條數(shù)據(jù)的指針即可實現(xiàn)數(shù)據(jù)的插入。
除了這一個,還問了HashSet和HashTable的區(qū)別(ps:what?什么是HashTable,沒見過呀,當時就沒答上來),后面查了一些東西才知道,HashTable就是和HashMap類似的東西,而且這玩意幾乎是面試必考的東西(ps:后悔沒有好好準備了),這里就記錄下HashSet、HashMap以及HashTable的區(qū)別。
* HashSet:set的實現(xiàn)類,內(nèi)部使用HashMap存放數(shù)據(jù),數(shù)據(jù)不允許重復,這玩意就是他添加元素的實現(xiàn)啦
public boolean add(Object o) { return map.put(o, PRESENT)==null; }
* HashMap:map的一個實現(xiàn)類,內(nèi)部的方法在默認情況下是非同步的。HashMap可以視為數(shù)組和鏈表的結(jié)合體,而他的內(nèi)部可以分為三部分:key的Set,value的Collection,Entry的Set,HashMap的存儲就是根據(jù)key的hash值找到元素的位置,統(tǒng)一位置的數(shù)據(jù)按鏈表的形式存儲,新加入的在鏈頭,后加入的在鏈尾。
* HashTable:繼承自Dictionary,同樣實現(xiàn)了Map的接口,HaseTable的方法是同步的,而且HashTable中的key和value都不允許null值。在HashMap中可以出現(xiàn)一個唯一的null主鍵,因此HashMap中g(shù)et()返回空時不代表不存在,需要使用containsKey()方法判斷。HashMap和HashTable都使用了iterator,同時HashTable也使用了Enumeration的方式。HashTable中直接使用了對象的hashcode,HashMap重新計算了hash值。
是否有序 | 是否可重復 | 線程安全性 | |
Vector | 是 | 是 | 安全(同步集合類) |
List | 是 | 是 | 不安全 |
CopyOnWriteArrayList | 是 | 是 | 讀寫分離,并發(fā)集合,數(shù)據(jù)最終一致,沒有實時一致性 |
AbstractSet | 否 | 否 | 不安全 |
HashSet | 否 | 否 | 不安全 |
TreeSet | 是(二叉樹) | 否 | 不安全 |
CopyOnWriteHashSet | 否 | 否 | 讀寫分離,并發(fā)集合,數(shù)據(jù)最終一致,沒有實時一致性 |
AbstractMap | 否 | 使用key-value來映射和存儲數(shù)據(jù),Key必須惟一,value可以重復 | 不安全 |
HashMap | 否 | 同上 | 不安全 |
TreeMap | 是(二叉樹) | 同上 | 不安全 |
HashTable | 否 | 同上 | 安全(同步集合類) |
ConcurrentHashMap | 否 | 同上 | 并發(fā)集合,采用可重入鎖 |
當時遇到這個問題直接蒙圈了,這東西的我一般最大值設(shè)置為cpu線程數(shù)+1,還真的沒研究過到底怎么設(shè)置的,說白了就是只會拿來用,沒有深入了解他的機制,所以面試完了,還是回來查查資料記錄下吧。
簡單來說就是cpu核心數(shù)cpu利用率(1+等待時間/計算時間)。因此,如果是IO密集型的任務,就分配多一點咯,至于多少嗎,可以自己在服務器上測下,如果懶得測,直接取極端情況,cpu利用率100%,等待時間和計算時間一致,也就是直接取到2Ncpu左右。如果是運算密集型的話,可以直接取等待時間為0,也就是Ncpu。其實這只是比較懶的做法,盡量還是在服務器上測試下更好。
3.JAVA中的gc機制是怎么樣的?當聽到這個問題的時候,感覺自己還是太年輕呀,沒有深入的去了解這些東西,只是簡單的看過,僅此而已。后悔自己沒有好好的研究這些了,所以只是簡單的回答當對象用不到的時候,由虛擬機自己負責回收。那么問題來了,對象什么時候用不到,怎么判斷用不到了呢。
這里只是做些簡單的記錄,等有時間的時候在深入的去研究吧,畢竟大三狗,考研黨。
gc的方法:引用計數(shù)算法、根搜索算法、標記/清除算法、復制算法、標記/整理算法
這一塊我只知道一些簡單的知識,內(nèi)存中的棧就是存放基本類型的變量和對象的引用變量,堆用來存放由new創(chuàng)建的對象和數(shù)組。深入的知識只能查資料咯。
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ù)組或者對象在堆內(nèi)存中的首地址,在棧中的這個特殊的變量就變成了數(shù)組或者對象的引用變量,以后就可以在程序中使用棧內(nèi)存中的引用變量來訪問堆中的數(shù)組或者對象,引用變量相當于為數(shù)組或者對象起的一個別名,或者代號。
引用變量是普通變量,定義時在棧中分配內(nèi)存,引用變量在程序運行到作用域外釋放。而數(shù)組&對象本身在堆中分配,即使程序運行到使用new產(chǎn)生數(shù)組和對象的語句所在地代碼塊之外,數(shù)組和對象本身占用的堆內(nèi)存也不會被釋放,數(shù)組和對象在沒有引用變量指向它的時候,才變成垃圾,不能再被使用,但是仍然占著內(nèi)存,在隨后的一個不確定的時間被垃圾回收器釋放掉。這個也是java比較占內(nèi)存的主要原因,實際上,棧中的變量指向堆內(nèi)存中的變量,這就是 Java 中的指針!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68867.html
摘要:當我們的需求出現(xiàn)變動時,工廠模式會需要進行相應的變化??偨Y(jié)來說,要想成功進行一次阿里巴巴的面試,你需要了解甚至掌握以下內(nèi)容語言,尤其是線程原理數(shù)據(jù)庫事務,加鎖,重點分布式設(shè)計模式可以說是涉及范圍非常廣了。 showImg(https://segmentfault.com/img/bV8cSY?w=576&h=432); 前言 今天本是一個陽光明媚,鳥語花香的日子。于是我決定在逛街中感受...
摘要:正確的思路是等概率隨機只取出共個數(shù),每個數(shù)出現(xiàn)的概率也是相等的隨機輸出把一段代碼改成,并增加單元測試。代碼本身很簡單,即使沒學過也能看懂,改后的代碼如下但是對于單元測試則僅限于聽過的地步,需要用到,好像也有別的模塊。 在拉勾上投了十幾個公司,大部分都被標記為不合適,有兩個給了面試機會,其中一個自己覺得肯定不會去的,也就沒有去面試,另一個經(jīng)歷了一輪電話面加一輪現(xiàn)場筆試和面試,在此記錄一下...
摘要:獲取的對象范圍方法獲取的是最終應用在元素上的所有屬性對象即使沒有代碼,也會把默認的祖宗八代都顯示出來而只能獲取元素屬性中的樣式。因此對于一個光禿禿的元素,方法返回對象中屬性值如果有就是據(jù)我測試不同環(huán)境結(jié)果可能有差異而就是。 花了很長時間整理的前端面試資源,喜歡請大家不要吝嗇star~ 別只收藏,點個贊,點個star再走哈~ 持續(xù)更新中……,可以關(guān)注下github 項目地址 https:...
摘要:寫在最前本次分享一下在作者上一次失利即拿到畢業(yè)證第二天突然收到阿里社招面試通知失敗之后,通過分析自己的定位與實際情況,做出的未來一到兩年的規(guī)劃。在博客有一定曝光度的積累中,陸續(xù)收到了一些面試邀請,基本上是阿里的但是我知道我菜。。 寫在最前 本次分享一下在作者上一次失利即拿到畢業(yè)證第二天突然收到阿里社招面試通知失敗之后,通過分析自己的定位與實際情況,做出的未來一到兩年的規(guī)劃。以及本次社招...
摘要:浪費青春話不多說,之前投的簡歷,有家公司忽然聯(lián)系說,想和我約個時間點電話面試。不了解自己的水平,永遠都會止步于眼前的安逸。電話面試流程面試官簡單介紹一下來意,然后先了解工作經(jīng)驗,再問技術(shù)問題。 最近換了個項目,現(xiàn)階段處于項目啟動階段,沒有開發(fā)任務,天天悠悠哉哉地都快把自己的本職忘了。浪費青春!?。≡挷欢嗾f,之前投的簡歷,有家公司HR忽然聯(lián)系說,想和我約個時間點電話面試。雖然這段時間一直...
閱讀 3386·2021-11-23 10:09
閱讀 2081·2021-10-26 09:51
閱讀 1000·2021-10-09 09:44
閱讀 3932·2021-10-08 10:04
閱讀 2767·2021-09-22 15:14
閱讀 3652·2021-09-22 15:02
閱讀 1103·2021-08-24 10:03
閱讀 1756·2019-12-27 12:14