從一個面試開始的Map
以下是面試我的面試題。
1丽声、你使用java多久了莉撇,在使用java過程中骆膝,你和我說一下java 的基本類型,int占用幾個字節(jié)嚼摩,它的最大值是多少(用冪指函數(shù)形式表示就可以)為什么钦讳?
答:byte、short枕面、int愿卒。。潮秘。琼开。布拉布拉。4個字節(jié)枕荞,最大是2^31-1(其他的同學(xué)面試者回答多少的都有柜候,還有回答是-128--127 的,這個讓我真的是一口老血噴出來啊躏精,當(dāng)時我就說那就是說int a = 1000渣刷,這樣賦值是不對的嘍?)
3矗烛、那你在工作中使用過HashMap嗎辅柴?你可以和我談?wù)勊鼏幔?/p>
答:key-value形式,線程不安全等等瞭吃,key可以為null碌识,等等xxxxx
4、那你知道它的初始容量是多少嗎虱而?那要是我使用Map map = new HashMap(12);這個在什么時候開始擴容的?
答:初始容量是16开泽,在 12*0.75=9的時候開始擴容 牡拇,這個同學(xué)開始一頓 什么加載因子啦一大堆開始了。
5、接著我又問 如果要是 Map? map = new HashMap(11);這個在什么時候開始擴容惠呼,這時候面試者語塞了导俘,因為他發(fā)現(xiàn)11*075 好像是不知道是多少了,乘出來的不是一個整數(shù)剔蹋,這下子就完全懵逼了旅薄。其實的話面試過程中Map這個類有很多的問題要問,但是今天我先和大家來一起討論以下這個
接下來開始上答案泣崩,以jdk1.8版本為例少梁。
其實我們在初始創(chuàng)建一個HashMap 的時候,當(dāng)我們不給任何參數(shù)的時候矫付,各個參數(shù)都會使用默認(rèn)的值凯沪。
當(dāng)我們在初始化 HashMap 的時候,傳入相應(yīng)容量的時候买优,其實這時候會在 調(diào)用 tableSizeFor(int cap) 這個方法妨马,這個方法總會返回2^n 的值。
從下面這個方法可以看出來杀赢,你自己可以定義一個擴容因子烘跺,例如:Map<String,Object> map = new HashMap<String,Object>(11,0.45f); 但是建議是使用默認(rèn)的0.75,在這里不做解釋為什么脂崔,可以自己出門左轉(zhuǎn) 輸入www.google.com 之后查查為什么使用0.75滤淳。
例如一個數(shù)字5,在 二進(jìn)制中的表示方式是?00000000 00000000?00000000?00000101 脱篙,通過下面的方法是 首先將本上的值減去1娇钱,然后不停的右移或上本身的值,這樣就是所有的位上都是會1绊困,然后在在通過n+1之后一定是一個2^n 的結(jié)果文搂。這就是為什么在開始的時候要減去1的原因。
這樣即使是你傳入的是一個11秤朗,或者是一個其他數(shù)的值煤蹭,那么它開始擴容的時候一定是 2^n * 0.75(這里假如你用的是默認(rèn)的擴容因子)。