2019面試

和信貸面試

HashMap的hash是如何計算的堂鲜? 負載因子是什么筒扒?什么時候rehash的可柿?

  • hash的代碼如下鸠踪。
  static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

Java 左移運算 << ,丟棄最高位,0補最低位;帶符號右移運算 >> 符號位不變复斥,左邊補上符號位;無符號右移運算 >>> 忽略了符號位擴展营密,0補最高位

^ 是異或運算符。如果a目锭、b兩個值不相同评汰,則異或結(jié)果為1。如果a痢虹、b兩個值相同被去,異或結(jié)果為0

  • 負載因子 loadFactor,默認值是0.75。 threshold = loadFactor * capacity奖唯。

  • 什么時候rehash呢编振?

    • 插入數(shù)據(jù)時,如果 transient Node<K,V>[] table 變量為null臭埋,則進行初始化。

    • putVal成功之后,size代表當前HashMap中的元素個數(shù)臀玄。

      if (++size > threshold)
          resize();
      

ConcurrentHashMap是如何實現(xiàn)多線程安全的呢瓢阴?

  • jdk1.8中,使用cas + sychornized 來實現(xiàn)線程安全。

ReentrantLock 的實現(xiàn)原理

  • ReentrantLock 實現(xiàn)鎖的底層原語是LockSupport.park()?unpark()?
  • 在調(diào)用lock()方法是,會首先用cas樂觀鎖嘗試獲取鎖健无,在獲取鎖失敗的情況下會將當前線程封裝成一個node存入一個雙端隊列荣恐。
  • 在調(diào)用unlock()方法時,如果隊列不為空,則會將隊列中的下一個線程喚醒叠穆。
  • 如果不使用雙端隊列少漆,還有別的實現(xiàn)方式嗎?這里回答的不太好硼被,說官方的實現(xiàn)方式即是最優(yōu)的實現(xiàn)方式示损,暫時想不到最優(yōu)的實現(xiàn)方式。

分布式鎖的實現(xiàn)方式

  • redis setnx(key,value,expiretime)
    • 實現(xiàn)原理
  • zookeeper
    • zookeeper在創(chuàng)建分布式鎖時會在leader節(jié)點創(chuàng)建一個目錄,當有 (n / 2) + 1 個節(jié)點返回ack時,鎖即獲取成功嚷硫。

redis 實現(xiàn)原理 (技術(shù)總監(jiān)面)

  • redis 網(wǎng)絡(luò)模型检访, 純內(nèi)存操作,高效的數(shù)據(jù)結(jié)構(gòu)仔掸,數(shù)據(jù)備份方式四個主題一一詳細的詢問脆贵。

Mysql (技術(shù)總監(jiān)面)

  • MySQL 索引類型(B+Tree, Hash), B+tree是一個什么樣的數(shù)據(jù)結(jié)構(gòu)。
  • 分布分表
    • 分庫分表策略
    • 當分庫分表達到數(shù)千個數(shù)據(jù)庫時起暮,如何進行匯總查詢(要求在一個http request response timeout 內(nèi)返回)卖氨。
      • 我回答將查詢同時發(fā)送到數(shù)千個實例,取到結(jié)果后本地內(nèi)存merge , sort 负懦。但是對此回答不滿意筒捺,后來沒有思路了,只能說在MySQL技術(shù)范疇之內(nèi)我的技術(shù)儲備能夠解決的方法僅此一個了密似。

火花思維面試

手寫代理模式(技術(shù)總監(jiān)面)

dubbo 一次request發(fā)送完畢之后,如何獲取相應(yīng)結(jié)果的 (技術(shù)總監(jiān)面焙矛,他說dubbo請求一個請求拿到結(jié)果之后下一個才能發(fā)送請求)

  • 在 dubbo org.apache.dubbo.rpc.protocol.dubbo.ChannelWrappedInvoker#doInvoke 中可以看到currentClient.request(inv).get()這行請求的關(guān)鍵代碼

     if (closed) {
                throw new RemotingException(this.getLocalAddress(), null, "Failed to send request " + request + ", cause: The channel " + this + " is closed!");
            }
            // create request.
            Request req = new Request();
            req.setVersion(Version.getProtocolVersion());
            req.setTwoWay(true);
            req.setData(request);
            DefaultFuture future = DefaultFuture.newFuture(channel, req, timeout);
            try {
                channel.send(req);
            } catch (RemotingException e) {
                future.cancel();
                throw e;
            }
            return future;
    

這行代碼的調(diào)用如上,可以看到dubbo client 組裝了請求參數(shù)之后残腌,就通過 `

  •  if (closed) {
                throw new RemotingException(this.getLocalAddress(), null, "Failed to send request " + request + ", cause: The channel " + this + " is closed!");
            }
            // create request.
            Request req = new Request();
            req.setVersion(Version.getProtocolVersion());
            req.setTwoWay(true);
            req.setData(request);
            DefaultFuture future = DefaultFuture.newFuture(channel, req, timeout);
            try {
                channel.send(req);
            } catch (RemotingException e) {
                future.cancel();
                throw e;
            }
            return future;
    
這行代碼的調(diào)用如上村斟,可以看到dubbo client 組裝了請求參數(shù)之后,就通過`DefaultFuture.newFuture(channel, req, timeout)` 構(gòu)造了一個DefaultFuture 抛猫。通過 channel將請求`send`即返回蟆盹。這里并沒有拿到response 。但是在返回`DefaultFuture`之后闺金,在`dubbo org.apache.dubbo.rpc.protocol.dubbo.ChannelWrappedInvoker#doInvoke `中的 `currentClient.request(inv)`拿到`DefaultFuture`之后即調(diào)用`get`方法返回了RPC請求的結(jié)果逾滥。

```java
if (timeout <= 0) {
            timeout = Constants.DEFAULT_TIMEOUT;
        }
        if (!isDone()) {
            long start = System.currentTimeMillis();
            lock.lock();
            try {
                while (!isDone()) {
                    done.await(timeout, TimeUnit.MILLISECONDS);
                    if (isDone() || System.currentTimeMillis() - start > timeout) {
                        break;
                    }
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
            if (!isDone()) {
                throw new TimeoutException(sent > 0, channel, getTimeoutMessage(false));
            }
        }
        return returnFromResponse();
```

get的實際邏輯如上,線程在請求參數(shù)發(fā)送出去之后即進入while循環(huán)中進行阻塞等待败匹,通過設(shè)置阻塞等待的時間寨昙,如果超過指定時間服務(wù)端還沒有相應(yīng)結(jié)果則會跳出循環(huán),拋出超時異常掀亩。如果在timeout時間范圍內(nèi)RPC響應(yīng)結(jié)果返回舔哪,則 有如下代碼

```java
private void doReceived(Response res) {
        lock.lock();
        try {
            response = res;
            done.signalAll();
        } finally {
            lock.unlock();
        }
        if (callback != null) {
            invokeCallback(callback);
        }
    }
```

此時將會喚醒前面`get` 方法 while中的線程阻塞, 將結(jié)果返回槽棍。這就是一個請求響應(yīng)的過程捉蚤。

## redis 集群的幾種實現(xiàn)方式(技術(shù)總監(jiān)面)

> 這個問題回答的不是很好抬驴,只是簡單的說是通過 redisClient 來實現(xiàn)的客戶端分片,redis集群互相不感知缆巧。然后被問到當集群中有一臺掛了會有什么樣的結(jié)果時布持,就說到了一致性hash。當問掛了的數(shù)據(jù)對線上的操作造成影響時怎么辦陕悬,然后回答說通過redis一主一叢题暖。但是這個問題大體上來回回答的不是特別好。應(yīng)當明確redis實現(xiàn)集群的幾種方式(客戶端分片,redis 原生cluster等),實現(xiàn)原理墩莫,`故障應(yīng)對策略`等芙委。

##  

# 惠金所面試(技術(shù)一面)

兩個排序的數(shù)組merge到一個大的數(shù)組里。手寫代碼

業(yè)務(wù)場景測試 (線上活動7天狂秦,給一個文件灌侣,里面有n(百萬級別)的活動碼,用戶若想獲取獎品,就必須提將指定的活動碼傳遞到服務(wù)器裂问,一個用戶只能獲取一個獎品)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侧啼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子堪簿,更是在濱河造成了極大的恐慌痊乾,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椭更,死亡現(xiàn)場離奇詭異哪审,居然都是意外死亡,警方通過查閱死者的電腦和手機虑瀑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門湿滓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舌狗,你說我怎么就攤上這事叽奥。” “怎么了痛侍?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵朝氓,是天一觀的道長。 經(jīng)常有香客問我主届,道長赵哲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任君丁,我火速辦了婚禮枫夺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谈截。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布簸喂。 她就那樣靜靜地躺著毙死,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喻鳄。 梳的紋絲不亂的頭發(fā)上扼倘,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音除呵,去河邊找鬼再菊。 笑死,一個胖子當著我的面吹牛颜曾,可吹牛的內(nèi)容都是我干的纠拔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼泛豪,長吁一口氣:“原來是場噩夢啊……” “哼稠诲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诡曙,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤臀叙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后价卤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劝萤,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年慎璧,在試婚紗的時候發(fā)現(xiàn)自己被綠了床嫌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡炸卑,死狀恐怖既鞠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盖文,我是刑警寧澤嘱蛋,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站五续,受9級特大地震影響洒敏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疙驾,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一凶伙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧它碎,春花似錦函荣、人聲如沸显押。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乘碑。三九已至,卻和暖如春金拒,著一層夾襖步出監(jiān)牢的瞬間兽肤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工绪抛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留资铡,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓幢码,卻偏偏與公主長得像笤休,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛤育,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容