實(shí)習(xí)面試記錄

參考資料:
[1]. 協(xié)程
[2]. 冒泡排序
[3.] Why Hashtable does not allow null keys or values?
[4.] redis的特點(diǎn)
[5.] 深度解讀Tomcat中的NIO模型
[6.] Java線程池「異常處理」正確姿勢:有病就得治
[7].HashMap工作原理和擴(kuò)容機(jī)制
[8].MySQL 樂觀鎖與悲觀鎖

面試感悟:
1、大廠的實(shí)習(xí)面試比較偏重基礎(chǔ)类垦。
2氯析、有時(shí)聊得好并不代表結(jié)果好,發(fā)現(xiàn)如果前面幾個(gè)問題不能讓面試官滿意的話弥锄,那么后面可能就瞎扯起項(xiàng)目來绸狐,雖然感覺他們很感興趣的樣子,但其實(shí)就是他們在向下兼容你躏碳,走完整個(gè)面試流程惑申。
3、知識(shí)的掌握很多還是不夠扎實(shí)的話,很快就被問蒙了黄刚。
4臂寝、運(yùn)氣也是其中很大一部分怜珍,同學(xué)問到的都是前面準(zhǔn)備好的問題,但卻栽在心理面試上燎竖,我卻被問到幾個(gè)不懂的問題仅孩,前面問的問題全都沒有被問到袁梗。

3.25 騰訊實(shí)習(xí)面試

  1. N個(gè)數(shù)據(jù)蛤肌,每個(gè)都在N的范圍里面驹闰,找兩個(gè)重復(fù)數(shù)字蝴猪,時(shí)間復(fù)雜度O(n),空間復(fù)雜度O(1)
  1. 用過哪些數(shù)據(jù)庫?表鎖跟行鎖的區(qū)別肠仪?
    MYSQL

  2. java垃圾回收機(jī)制
    參考:思維導(dǎo)圖

  3. 三次握手有哪些攻擊方式?
    Syn攻擊就是 攻擊客戶端 在短時(shí)間內(nèi)偽造大量不存在的IP地址,向服務(wù)器不斷地發(fā)送syn包,服務(wù)器回復(fù)確認(rèn)包比默,并等待客戶的確認(rèn)塞祈,由于源地址是不存在的醇锚,服務(wù)器需要不斷的重發(fā)直 至超時(shí),這些偽造的SYN包將長時(shí)間占用未連接隊(duì)列绽快,正常的SYN請求被丟棄,目標(biāo)系統(tǒng)運(yùn)行緩慢紧阔,嚴(yán)重者引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓坊罢。
    Syn攻擊是一個(gè)典型的DDOS攻擊。檢測SYN攻擊非常的方便擅耽,當(dāng)你在服務(wù)器上看到大量的半連接狀態(tài)時(shí)活孩,特別是源IP地址是隨機(jī)的,基本上可以斷定這是一次SYN攻擊.在Linux下可以如下命令檢測是否被Syn攻擊秫筏。

  4. 進(jìn)程線程協(xié)程的區(qū)別
    線程和進(jìn)程的區(qū)別:進(jìn)程包含線程诱鞠,線程比進(jìn)程要更輕量,進(jìn)程切換的時(shí)候是操作系統(tǒng)級(jí)別这敬;線程共享同一個(gè)進(jìn)程的資源航夺,而進(jìn)程與進(jìn)程之間是獨(dú)立的。進(jìn)程是資源分配的最小單位崔涂,線程是CPU調(diào)度的最小單位阳掐。
    協(xié)程:我的理解,在一個(gè)線程中控制函數(shù)的切換,“因?yàn)樽映绦蚯袚Q不是線程切換缭保,而是由程序自身控制汛闸,因此,沒有線程切換的開銷艺骂,和多線程比诸老,線程數(shù)量越多,協(xié)程的性能優(yōu)勢就越明顯钳恕”鸱”,跟子函數(shù)有點(diǎn)像忧额,但是運(yùn)行的時(shí)候可以在子函數(shù)之間切換厘肮。
    優(yōu)點(diǎn):單線程,減少線程開銷睦番,不需要線程的鎖機(jī)制类茂。需要多核的時(shí)候,需要開啟多個(gè)進(jìn)程然后在每個(gè)進(jìn)程里面開啟一個(gè)協(xié)程托嚣。

  5. 進(jìn)程通信方式+信號(hào)量的實(shí)現(xiàn)機(jī)制
    信號(hào)量巩检,隊(duì)列,共享內(nèi)存注益,套接字
    共享內(nèi)存:
    共享內(nèi)存是進(jìn)程間通信中最簡單的方式之一碴巾。共享內(nèi)存允許兩個(gè)或更多進(jìn)程訪問同一塊內(nèi)存,就如同 malloc() 函數(shù)向不同進(jìn)程返回了指向同一個(gè)物理內(nèi)存區(qū)域的指針丑搔。當(dāng)一個(gè)進(jìn)程改變了這塊地址中的內(nèi)容的時(shí)候厦瓢,其它進(jìn)程都會(huì)察覺到這個(gè)更改。
    因?yàn)橄到y(tǒng)內(nèi)核沒有對(duì)訪問共享內(nèi)存進(jìn)行同步啤月,您必須提供自己的同步措施煮仇。例如,在數(shù)據(jù)被寫入之前不允許進(jìn)程從共享內(nèi)存中讀取信息谎仲、不允許兩個(gè)進(jìn)程同時(shí)向同一個(gè)共享內(nèi)存地址寫入數(shù)據(jù)等浙垫。解決這些問題的常用方法是通過使用信號(hào)量進(jìn)行同步。

  6. TCP擁塞控制和流量控制區(qū)別
    都擁有一個(gè)窗口郑诺,擁塞控制是根據(jù)固定的流程自己計(jì)算出來夹姥,流量控制是接收方發(fā)送過來的。
    擁塞控制是為了避免網(wǎng)絡(luò)流量過大辙诞,流量控制是為了協(xié)調(diào)接收方的緩存區(qū)大小辙售。

3.27 阿里實(shí)習(xí)面試

  • redis特點(diǎn)
    參考[4]

1、Redis 是一個(gè)基于內(nèi)存的高性能key-value數(shù)據(jù)庫飞涂,
2旦部、Redis最大的魅力是支持保存多種數(shù)據(jù)結(jié)構(gòu)祈搜,此外單個(gè)value的最大限制是1GB,不像 memcached只能保存1MB的數(shù)據(jù)士八,支持list容燕,集合等數(shù)據(jù)類型。
3婚度、Redis也可以對(duì)存入的Key-Value設(shè)置expire時(shí)間蘸秘,因此也可以被當(dāng)作一 個(gè)功能加強(qiáng)版的memcached來用。(豐富的特性)
4陕见、支持事務(wù)秘血,操作都是原子性,所謂的原子性就是對(duì)數(shù)據(jù)的更改要么全部執(zhí)行评甜,要么全部不執(zhí)行。
5仔涩、可以持久化忍坷。
6、memcached所有的值均是簡單的字符串熔脂,redis作為其替代者佩研,支持更為豐富的數(shù)據(jù)類型。

  • redis數(shù)據(jù)類型
    string霞揉、list旬薯、hash、set适秩、zset绊序。

  • 樂觀鎖,悲觀鎖秽荞,樂觀鎖實(shí)現(xiàn)
    參考[8]

樂觀鎖(Optimistic Lock)骤公,顧名思義,就是很樂觀扬跋,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改阶捆,所以不會(huì)上鎖,但是在提交更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù)钦听。樂觀鎖適用于讀多寫少的應(yīng)用場景洒试,這樣可以提高吞吐量。
樂觀鎖:假設(shè)不會(huì)發(fā)生并發(fā)沖突朴上,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性垒棋。
樂觀鎖一般來說有以下2種方式:
使用數(shù)據(jù)版本(Version)記錄機(jī)制實(shí)現(xiàn),這是樂觀鎖最常用的一種實(shí)現(xiàn)方式余指。
何謂數(shù)據(jù)版本捕犬?即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí)跷坝,一般是通過為數(shù)據(jù)庫表增加一個(gè)數(shù)字類型的 “version” 字段來實(shí)現(xiàn)。當(dāng)讀取數(shù)據(jù)時(shí)碉碉,將version字段的值一同讀出柴钻,數(shù)據(jù)每更新一次,對(duì)此version值加一垢粮。當(dāng)我們提交更新的時(shí)候贴届,判斷數(shù)據(jù)庫表對(duì)應(yīng)記錄的當(dāng)前版本信息與第一次取出來的version值進(jìn)行比對(duì),如果數(shù)據(jù)庫表當(dāng)前版本號(hào)與第一次取出來的version值相等蜡吧,則予以更新毫蚓,否則認(rèn)為是過期數(shù)據(jù)。
使用時(shí)間戳(timestamp)昔善。樂觀鎖定的第二種實(shí)現(xiàn)方式和第一種差不多元潘,同樣是在需要樂觀鎖控制的table中增加一個(gè)字段,名稱無所謂君仆,字段類型使用時(shí)間戳(timestamp), 和上面的version類似翩概,也是在更新提交的時(shí)候檢查當(dāng)前數(shù)據(jù)庫中數(shù)據(jù)的時(shí)間戳和自己更新前取到的時(shí)間戳進(jìn)行對(duì)比,如果一致則OK返咱,否則就是版本沖突钥庇。

  • 查看MYSQL執(zhí)行計(jì)劃的命令
    explain

  • 網(wǎng)絡(luò)三次握手四次揮手

  • Mybatis的DAO實(shí)現(xiàn),其他的ORM框架使用過嗎咖摹?
    Mybatis底層實(shí)現(xiàn)是用動(dòng)態(tài)代理做的评姨,MyBatis一開始掃描注解或者XML配置,為每個(gè)方法(接口全路徑+方法名)生成一個(gè)MappedStatement萤晴,然后對(duì)應(yīng)每個(gè)Mapper接口吐句,MyBatis生成一個(gè)動(dòng)態(tài)代理類,當(dāng)調(diào)用對(duì)應(yīng)的方法的時(shí)候硫眯,取出之前掃描的配置蕴侧,包括MySQL語句和參數(shù)等,然后調(diào)用JDBC執(zhí)行两入。

  • NIO跟BIO的區(qū)別
    BIO(同步阻塞):通常由一個(gè)獨(dú)立的 Acceptor 線程負(fù)責(zé)監(jiān)聽客戶端的連接净宵。我們一般通過在while(true) 循環(huán)中服務(wù)端會(huì)調(diào)用 accept() 方法等待接收客戶端的連接的方式監(jiān)聽請求,請求一旦接收到一個(gè)連接請求裹纳,就可以建立通信套接字在這個(gè)通信套接字上進(jìn)行讀寫操作择葡,此時(shí)不能再接收其他客戶端連接請求,只能等待同當(dāng)前連接的客戶端的操作執(zhí)行完成剃氧, 不過可以通過多線程來支持多個(gè)客戶端的連接敏储。這就是典型的 一請求一應(yīng)答通信模型 。我們可以設(shè)想一下如果這個(gè)連接不做任何事情的話就會(huì)造成不必要的線程開銷朋鞍,不過可以通過 線程池機(jī)制 改善已添,線程池還可以讓線程的創(chuàng)建和回收成本相對(duì)較低妥箕。使用FixedThreadPool 可以有效的控制了線程的最大數(shù)量,保證了系統(tǒng)有限的資源的控制更舞。
    AIO(同步非阻塞):我覺得首先肯定要從 NIO 流是非阻塞 IO 而 IO 流是阻塞 IO 說起畦幢。然后,可以從 NIO 的3個(gè)核心組件/特性為 NIO 帶來的一些改進(jìn)來分析缆蝉。

1)Non-blocking IO(非阻塞IO)
IO流是阻塞的宇葱,NIO流是不阻塞的。
Java NIO使我們可以進(jìn)行非阻塞IO操作刊头。比如說黍瞧,單線程中從通道讀取數(shù)據(jù)到buffer,同時(shí)可以繼續(xù)做別的事情原杂,當(dāng)數(shù)據(jù)讀取到buffer中后印颤,線程再繼續(xù)處理數(shù)據(jù)。寫數(shù)據(jù)也是一樣的穿肄。另外膀哲,非阻塞寫也是如此。一個(gè)線程請求寫入一些數(shù)據(jù)到某通道被碗,但不需要等待它完全寫入,這個(gè)線程同時(shí)可以去做別的事情仿村。
Java IO的各種流是阻塞的锐朴。這意味著,當(dāng)一個(gè)線程調(diào)用 read()write() 時(shí)蔼囊,該線程被阻塞焚志,直到有一些數(shù)據(jù)被讀取,或數(shù)據(jù)完全寫入畏鼓。該線程在此期間不能再干任何事情了
2)Buffer(緩沖區(qū))
IO 面向流(Stream oriented)酱酬,而 NIO 面向緩沖區(qū)(Buffer oriented)。
Buffer是一個(gè)對(duì)象云矫,它包含一些要寫入或者要讀出的數(shù)據(jù)膳沽。在NIO類庫中加入Buffer對(duì)象,體現(xiàn)了新庫與原I/O的一個(gè)重要區(qū)別让禀。在面向流的I/O中·可以將數(shù)據(jù)直接寫入或者將數(shù)據(jù)直接讀到 Stream 對(duì)象中挑社。雖然 Stream 中也有 Buffer 開頭的擴(kuò)展類,但只是流的包裝類巡揍,還是從流讀到緩沖區(qū)痛阻,而 NIO 卻是直接讀到 Buffer 中進(jìn)行操作。
在NIO厙中腮敌,所有數(shù)據(jù)都是用緩沖區(qū)處理的阱当。在讀取數(shù)據(jù)時(shí)俏扩,它是直接讀到緩沖區(qū)中的; 在寫入數(shù)據(jù)時(shí),寫入到緩沖區(qū)中弊添。任何時(shí)候訪問NIO中的數(shù)據(jù)录淡,都是通過緩沖區(qū)進(jìn)行操作。
最常用的緩沖區(qū)是 ByteBuffer,一個(gè) ByteBuffer 提供了一組功能用于操作 byte 數(shù)組表箭。除了ByteBuffer,還有其他的一些緩沖區(qū)赁咙,事實(shí)上,每一種Java基本類型(除了Boolean類型)都對(duì)應(yīng)有一種緩沖區(qū)免钻。
3)Channel (通道)
NIO 通過Channel(通道) 進(jìn)行讀寫彼水。
通道是雙向的,可讀也可寫极舔,而流的讀寫是單向的凤覆。無論讀寫,通道只能和Buffer交互拆魏。因?yàn)?Buffer盯桦,通道可以異步地讀寫。
4)Selector (選擇器)
NIO有選擇器渤刃,而IO沒有拥峦。
選擇器用于使用單個(gè)線程處理多個(gè)通道。因此卖子,它需要較少的線程來處理這些通道略号。線程之間的切換對(duì)于操作系統(tǒng)來說是昂貴的。 因此洋闽,為了提高系統(tǒng)效率選擇器是有用的玄柠。
3. AIO (Asynchronous I/O)
AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改進(jìn)版 NIO 2,它是異步非阻塞的IO模型诫舅。異步 IO 是基于事件和回調(diào)機(jī)制實(shí)現(xiàn)的羽利,也就是應(yīng)用操作之后會(huì)直接返回,不會(huì)堵塞在那里刊懈,當(dāng)后臺(tái)處理完成这弧,操作系統(tǒng)會(huì)通知相應(yīng)的線程進(jìn)行后續(xù)的操作。
AIO 是異步IO的縮寫俏讹,雖然 NIO 在網(wǎng)絡(luò)操作中当宴,提供了非阻塞的方法,但是 NIO 的 IO 行為還是同步的泽疆。對(duì)于 NIO 來說户矢,我們的業(yè)務(wù)線程是在 IO 操作準(zhǔn)備好時(shí),得到通知殉疼,接著就由這個(gè)線程自行進(jìn)行 IO 操作梯浪,IO操作本身是同步的捌年。(除了 AIO 其他的 IO 類型都是同步的,這一點(diǎn)可以從底層IO線程模型解釋挂洛,推薦一篇文章:《漫話:如何給女朋友解釋什么是Linux的五種IO模型礼预?》
查閱網(wǎng)上相關(guān)資料,我發(fā)現(xiàn)就目前來說 AIO 的應(yīng)用還不是很廣泛虏劲,Netty 之前也嘗試使用過 AIO托酸,不過又放棄了。

拓展:Tomcat運(yùn)用NIO
簡單來說柒巫,LimitLatch控制連接的數(shù)量励堡,Poller的線程輪詢Acceptor,如果有新的事件堡掏,Poller好連接交給線程池去執(zhí)行应结。


  • Resource和Autowired區(qū)別
    @Autowired是默認(rèn)按照類型裝配的
    @Resource默認(rèn)是按照名稱裝配的

  • 哪些設(shè)計(jì)模式
    模板設(shè)計(jì)模式
    責(zé)任鏈模式
    策略模式
    監(jiān)聽器模式(觀察者模式)

  • 冒泡排序和歸并排序
    冒泡排序是每次都冒一個(gè)剩下中最大的值各淀,冒上去的過程中叉存,每次都會(huì)交換順序杏糙,把大的傳到上面须揣。
    冒泡排序的簡單Python代碼

def bubbleSort(arr):
    for i in range(1, len(arr)):
        for j in range(0, len(arr)-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr
  • HashMap和Hashtable的區(qū)別,HashMap是否支持Null循集?
    Hashtable只是簡單地在HashMap的基礎(chǔ)上增加Synchronized關(guān)鍵字蔗怠,因此Hashtable是線程安全的厢拭,HashMap表示線程安全的拴鸵。
    但是HashMap是支持Null鍵和值的肛炮,Hashtable不支持,根據(jù)[3]宝踪,一個(gè)說的是因?yàn)镠ashtable比較老,HashMap比較新碍扔,所以支持Null瘩燥,另外一個(gè)答案說是因?yàn)镠ashtable支持多線程,如果支持null值的話不同,獲取鍵值應(yīng)該用下面的代碼厉膀,因?yàn)間et返回null在這種情況下有歧義,可能是鍵值為null二拐,也可能是因?yàn)闆]有這個(gè)鍵服鹅,所以需要先判斷有沒有這個(gè)鍵。但是如果另外一個(gè)線程在contains之后百新,get之前去掉了鍵企软,但是本線程接下來還是會(huì)get到null,沒有鍵值卻獲取到了null饭望,產(chǎn)生錯(cuò)誤仗哨。
if (map.contains(key)) {
    return map.get(key);
} else {
    throw new KeyNotFoundException;
}
  • 重載與重寫的區(qū)別
    重載是不同的參數(shù)
    重寫是繼承的時(shí)候

  • 類加載器
    應(yīng)用類加載器(application)
    拓展類加載器(extent)
    引導(dǎo)類加載器(Bootstrap)

4.4 騰訊實(shí)習(xí)面試初試

這次面試體驗(yàn)非常好形庭,面試官循循善誘,給提示厌漂,問到你不會(huì)為止萨醒。

  • 重載跟重寫的區(qū)別
    重寫是為了增強(qiáng)類的重用性和復(fù)用性,擴(kuò)展性苇倡;重寫是對(duì)類中方法的擴(kuò)充富纸,因?yàn)槔^承用的是父類的東西,重寫則不僅得到父類的東西旨椒,同時(shí)也加入了自己的東西晓褪。

  • HashMap
    HashTable的區(qū)別

當(dāng)map中包含的Entry的數(shù)量大于等于threshold = loadFactor * capacity的時(shí)候,且新建的Entry剛好落在一個(gè)非空的桶上钩乍,此刻觸發(fā)擴(kuò)容機(jī)制辞州,將其容量擴(kuò)大為2倍。(為什么2倍寥粹,而不是1.5倍变过,3倍,10倍涝涤;解釋見最后的補(bǔ)充)
當(dāng)size大于等于threshold的時(shí)候媚狰,并不一定會(huì)觸發(fā)擴(kuò)容機(jī)制,但是會(huì)很可能就觸發(fā)擴(kuò)容機(jī)制阔拳,只要有一個(gè)新建的Entry出現(xiàn)哈希沖突崭孤,則立刻resize。

2倍的原因

通過限制length是一個(gè)2的冪數(shù)糊肠,h & (length-1)和h % length結(jié)果是一致的辨宠。這就是為什么要限制容量必須是一個(gè)2的冪的原因。

  • ArrayList跟Vector的區(qū)別
    1货裹、Vector是線程安全的嗤形,ArrayList不是線程安全的。
    2弧圆、ArrayList在底層數(shù)組不夠用時(shí)在原來的基礎(chǔ)上擴(kuò)展0.5倍赋兵,Vector是擴(kuò)展1倍。
    Vector只要是關(guān)鍵性的操作搔预,方法前面都加了synchronized關(guān)鍵字霹期,來保證線程的安全性。
    自己拓展:StringBuilder和StringBuffer的區(qū)別

StringBuffer is synchronized, StringBuilder is not.

  • final的用法
    類——不能繼承
    方法——不能重寫
    變量——不能修改拯田,常量

  • JVM內(nèi)存分為哪幾塊區(qū)域
    JVM內(nèi)存區(qū)域分為五個(gè)部分历造,分別是堆,方法區(qū),虛擬機(jī)棧帕膜,本地方法棧枣氧,程序計(jì)數(shù)器。


堆:堆是Java對(duì)象的存儲(chǔ)區(qū)域垮刹,任何用new字段分配的Java對(duì)象實(shí)例和數(shù)組达吞,都被分配在堆上,Java堆可使用-Xms -Xmx進(jìn)行內(nèi)存控制荒典,值得一提的是從JDK1.7版本之后酪劫,運(yùn)行時(shí)常量池從方法區(qū)移到了堆上。

方法區(qū):它用于存儲(chǔ)已被虛擬機(jī)加載的類信息寺董,常量覆糟,靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)遮咖,方法區(qū)在JDK1.7版本及以前被稱為永久代滩字,從JDK1.8永久代被移除。

虛擬機(jī)棧:虛擬機(jī)棧中執(zhí)行每個(gè)方法的時(shí)候御吞,都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表麦箍,操作數(shù)棧,動(dòng)態(tài)鏈接陶珠,方法出口等信息挟裂。

本地方法棧:與虛擬機(jī)棧發(fā)揮的作用相似,相比于虛擬機(jī)棧為Java方法服務(wù)揍诽,本地方法棧為虛擬機(jī)使用的Native方法服務(wù)诀蓉,執(zhí)行每個(gè)本地方法的時(shí)候,都會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表暑脆,操作數(shù)棧渠啤,動(dòng)態(tài)鏈接,方法出口等信息添吗。

程序計(jì)數(shù)器:指示Java虛擬機(jī)下一條需要執(zhí)行的字節(jié)碼指令埃篓。
以上五個(gè)區(qū)域是Java虛擬機(jī)內(nèi)存劃分情況,其中方法區(qū)和堆被JVM中多個(gè)線程共享根资,比如類的靜態(tài)常量就被存放在方法區(qū),供類對(duì)象之間共享同窘,虛擬機(jī)棧玄帕,本地方法棧,pc寄存器是每個(gè)線程獨(dú)立擁有的想邦,不會(huì)與其他線程共享裤纹。

  • 程序編譯分為哪幾個(gè)過程,靜態(tài)鏈接和動(dòng)態(tài)鏈接的區(qū)別
    預(yù)處理->編譯->匯編->鏈接
    預(yù)處理:處理比如#include<studio.h>,得到完整的文件鹰椒,結(jié)果后綴為.i
    編譯:轉(zhuǎn)化為匯編锡移,結(jié)果后綴為.s
    匯編:轉(zhuǎn)化為機(jī)器語言指令,結(jié)果后綴為.o
    鏈接:由鏈接器將代碼在執(zhí)行過程用到的其他目標(biāo)代碼和庫文件鏈接成為一個(gè)可執(zhí)行程序也就是目標(biāo)程序漆际。
    靜態(tài)鏈接:在鏈接階段淆珊,會(huì)將匯編生成的目標(biāo)文件.o與引用到的庫一起鏈接打包到可執(zhí)行文件中,因此對(duì)應(yīng)的鏈接方式稱為靜態(tài)鏈接奸汇。
  1. 靜態(tài)庫對(duì)函數(shù)庫的鏈接是放在編譯時(shí)期完成的施符。
  2. 程序在運(yùn)行時(shí)與函數(shù)庫再無瓜葛,移植方便擂找。
  3. 浪費(fèi)空間和資源戳吝,因?yàn)樗邢嚓P(guān)的目標(biāo)文件與牽涉到的函數(shù)庫被鏈接合成一個(gè)可執(zhí)行文件。
    為什么需要?jiǎng)討B(tài)庫贯涎,其實(shí)也是靜態(tài)庫的特點(diǎn)導(dǎo)致听哭,空間浪費(fèi)是靜態(tài)庫的一個(gè)問題。另一個(gè)問題是靜態(tài)庫對(duì)程序的更新塘雳、部署和發(fā)布頁會(huì)帶來麻煩陆盘。如果靜態(tài)庫liba.lib更新了,所以使用它的應(yīng)用程序都需要重新編譯粉捻、發(fā)布給用戶(對(duì)于玩家來說礁遣,可能是一個(gè)很小的改動(dòng),卻導(dǎo)致整個(gè)程序重新下載肩刃,全量更新)祟霍。
    動(dòng)態(tài)庫在程序編譯時(shí)并不會(huì)被連接到目標(biāo)代碼中,而是在程序運(yùn)行是才被載入盈包。不同的應(yīng)用程序如果調(diào)用相同的庫沸呐,那么在內(nèi)存里只需要有一份該共享庫的實(shí)例,規(guī)避了空間浪費(fèi)問題呢燥。動(dòng)態(tài)庫在程序運(yùn)行是才被載入崭添,也解決了靜態(tài)庫對(duì)程序的更新、部署和發(fā)布頁會(huì)帶來麻煩叛氨。用戶只需要更新動(dòng)態(tài)庫即可呼渣,增量更新。
    動(dòng)態(tài)鏈接:




    動(dòng)態(tài)庫特點(diǎn)總結(jié):
    動(dòng)態(tài)庫把對(duì)一些庫函數(shù)的鏈接載入推遲到程序運(yùn)行的時(shí)期寞埠。
    可以實(shí)現(xiàn)進(jìn)程之間的資源共享屁置。(因此動(dòng)態(tài)庫也稱為共享庫)
    將一些程序升級(jí)變得簡單。
    甚至可以真正做到鏈接載入完全由程序員在程序代碼中控制(顯示調(diào)用)仁连。
    動(dòng)態(tài)鏈接缺點(diǎn):
    (1)當(dāng)系統(tǒng)中多個(gè)應(yīng)用程序都用了一個(gè)動(dòng)態(tài)鏈接庫蓝角,但是要求的版本不同,這時(shí)動(dòng)態(tài)鏈接庫之間就會(huì)相互干擾,容易出現(xiàn)dll地獄的問題使鹅。
    (2)性能開銷揪阶。動(dòng)態(tài)鏈接庫為了做到“共享代碼,但是不共享數(shù)據(jù)”患朱,引入了不小的開銷鲁僚,調(diào)用動(dòng)態(tài)鏈接庫中的函數(shù),需要好幾次間接內(nèi)存訪問才能走到函數(shù)入口麦乞,全局?jǐn)?shù)據(jù)也是蕴茴。

  • 進(jìn)程跟線程調(diào)度起來有什么區(qū)別?
    進(jìn)程的優(yōu)點(diǎn)
    多進(jìn)程程序更健壯姐直,多線程程序只要有一個(gè)線程死掉倦淀,整個(gè)進(jìn)程也死掉了,而一個(gè)進(jìn)程死掉并不會(huì)對(duì)另外一個(gè)進(jìn)程造成影響声畏,因?yàn)檫M(jìn)程有自己獨(dú)立的地址空間撞叽。
    為什么線程死掉會(huì)導(dǎo)致進(jìn)程死掉
    會(huì)崩潰。線程沒有自己單獨(dú)的內(nèi)存地址空間插龄。在一個(gè)線程中把另外一個(gè)線程的椩钙澹空間寫壞是再正常不過的事情了。這與進(jìn)程有沒有自己的椌危空間無關(guān)糠雨,因?yàn)闊o論他們有沒有自己的棧空間徘跪,都可以通過內(nèi)存地址訪問到其他線程的椄恃空間,所以指針數(shù)據(jù)的錯(cuò)誤可以導(dǎo)致任何同地址空間內(nèi)其他線程的崩潰垮庐,當(dāng)然也可以導(dǎo)致進(jìn)程崩潰松邪。一般而言,沒有絕對(duì)必要的共享內(nèi)存空間的需求就不要使用線程哨查,用進(jìn)程會(huì)安全很多逗抑。

  • 僵尸進(jìn)程
    簡單來說,父進(jìn)程的子進(jìn)程需要處理善后事宜邮府,但是父進(jìn)程沒有褂傀,造成大量的資源消耗。如果父進(jìn)程死掉那還可以,子進(jìn)程作為孤兒進(jìn)程胸竞,系統(tǒng)會(huì)處理善后事宜马篮。

什么是僵尸進(jìn)程?
Unix進(jìn)程模型中擎值,進(jìn)程是按照父進(jìn)程產(chǎn)生子進(jìn)程,子進(jìn)程產(chǎn)生子子進(jìn)程這樣的方式創(chuàng)建出完成各項(xiàng)相互協(xié)作功能的進(jìn)程的逐抑。當(dāng)一個(gè)進(jìn)程完成它的工作終止之后鸠儿,它的父進(jìn)程需要調(diào)用wait()或者waitpid()系統(tǒng)調(diào)用取得子進(jìn)程的終止?fàn)顟B(tài)。如果父進(jìn)程沒有這么做的話厕氨,會(huì)產(chǎn)生什么后果呢进每?此時(shí),子進(jìn)程雖然已經(jīng)退出了命斧,但是在系統(tǒng)進(jìn)程表中還為它保留了一些退出狀態(tài)的信息田晚,如果父進(jìn)程一直不取得這些退出信息的話,這些進(jìn)程表項(xiàng)就將一直被占用国葬,此時(shí)贤徒,這些占著茅坑不拉屎的子進(jìn)程就成為“僵尸進(jìn)程”(zombie)芹壕。系統(tǒng)進(jìn)程表是一項(xiàng)有限資源,如果系統(tǒng)進(jìn)程表被僵尸進(jìn)程耗盡的話接奈,系統(tǒng)就可能無法創(chuàng)建新的進(jìn)程踢涌。
那么,孤兒進(jìn)程又是怎么回事呢序宦?
孤兒進(jìn)程是指這樣一類進(jìn)程:在進(jìn)程還未退出之前睁壁,它的父進(jìn)程就已經(jīng)退出了,一個(gè)沒有了父進(jìn)程的子進(jìn)程就是一個(gè)孤兒進(jìn)程(orphan)互捌。既然所有進(jìn)程都必須在退出之后被wait()或waitpid()以釋放其遺留在系統(tǒng)中的一些資源潘明,那么應(yīng)該由誰來處理孤兒進(jìn)程的善后事宜呢?這個(gè)重任就落到了init進(jìn)程身上秕噪,init進(jìn)程就好像是一個(gè)民政局钳降,專門負(fù)責(zé)處理孤兒進(jìn)程的善后工作。每當(dāng)出現(xiàn)一個(gè)孤兒進(jìn)程的時(shí)候巢价,內(nèi)核就把孤兒進(jìn)程的父進(jìn)程設(shè)置為init牲阁,而init進(jìn)程會(huì)循環(huán)地wait()它的已經(jīng)退出的子進(jìn)程。這樣壤躲,當(dāng)一個(gè)孤兒進(jìn)程“凄涼地”結(jié)束了其生命周期的時(shí)候城菊,init進(jìn)程就會(huì)代表黨和政府出面處理它的一切善后工作。
這樣來看碉克,孤兒進(jìn)程并不會(huì)有什么危害凌唬,真正會(huì)對(duì)系統(tǒng)構(gòu)成威脅的是僵尸進(jìn)程。
那么漏麦,什么情況下僵尸進(jìn)程會(huì)威脅系統(tǒng)的穩(wěn)定呢客税?
設(shè)想有這樣一個(gè)父進(jìn)程:它定期的產(chǎn)生一個(gè)子進(jìn)程,這個(gè)子進(jìn)程需要做的事情很少撕贞,做完它該做的事情之后就退出了更耻,因此這個(gè)子進(jìn)程的生命周期很短,但是捏膨,父進(jìn)程只管生成新的子進(jìn)程秧均,至于子進(jìn)程退出之后的事情,則一概不聞不問号涯,這樣目胡,系統(tǒng)運(yùn)行上一段時(shí)間之后,系統(tǒng)中就會(huì)存在很多的僵尸進(jìn)程链快,倘若用ps命令查看的話誉己,就會(huì)看到很多狀態(tài)為Z的進(jìn)程。
嚴(yán)格地來說域蜗,僵尸進(jìn)程并不是問題的根源巨双,罪魁禍?zhǔn)资钱a(chǎn)生出大量僵尸進(jìn)程的那個(gè)父進(jìn)程噪猾。因此,當(dāng)我們尋求如何消滅系統(tǒng)中大量的僵尸進(jìn)程時(shí)筑累,答案就是把產(chǎn)生大量僵尸進(jìn)程的那個(gè)元兇槍斃掉(通過kill發(fā)送SIGTERM或者SIGKILL信號(hào))畏妖。槍斃了元兇進(jìn)程之后半夷,它產(chǎn)生的僵尸進(jìn)程就變成了孤兒進(jìn)程,這些孤兒進(jìn)程會(huì)被init進(jìn)程接管巫橄,init進(jìn)程會(huì)wait()這些孤兒進(jìn)程淘邻,釋放它們占用的系統(tǒng)進(jìn)程表中的資源,這樣湘换,這些已經(jīng)“僵尸”的孤兒進(jìn)程就能瞑目而去了宾舅。

  • 線程池的線程拋異常之后怎么處理筹我?
    參考[6]
    ThreadPoolExecutor中會(huì)對(duì)異常進(jìn)行捕獲,然后執(zhí)行afterExecute帆离,但是afterExecute一般是沒有實(shí)現(xiàn)的岸夯。

如何避免這種問題
思路很簡單。
1们妥、在提交的任務(wù)中將異常捕獲并處理猜扮,不拋給線程池。
2监婶、異常拋給線程池旅赢,但是我們要及時(shí)處理拋出的異常。

第二種思路中压储,

  1. 可以繼承ThreadPoolExecutor然后復(fù)寫afterExecute方法鲜漩。


  2. 利用線程工廠復(fù)寫線程的UncaughtExceptionHandler


  3. ?集惋?
  4. Future對(duì)象get的時(shí)候會(huì)拋出異常


  • 怎么在TCP和UDP上的應(yīng)用層建立可靠傳輸孕似?
    序列號(hào)保證發(fā)送和接收的順序相同,丟包重傳機(jī)制刮刑,校驗(yàn)和喉祭。

  • TCP只會(huì)重發(fā)少的那個(gè)包還是后面所有包养渴?
    ACK確認(rèn)的是連續(xù)收到的數(shù)據(jù),然后發(fā)送方會(huì)重發(fā)后面所有的包泛烙,效率比較低理卑。
    SACK是TCP的一個(gè)選項(xiàng),會(huì)選擇性地確認(rèn)收到了蔽氨。

  • TCP的序列號(hào)溢出會(huì)怎么樣藐唠?
    序列號(hào)是隨機(jī)開始的,直接重新從零開始鹉究。

  • TCP怎么分段的宇立?

  • MTU是多少?
    鏈路層最大傳輸字節(jié)個(gè)數(shù)自赔,1500

  • 要查A,B,A和B字段需要建立哪些索引妈嘹?
    A和B,B
    或者
    B和A绍妨,A
    索引最左匹配

4.26騰訊實(shí)習(xí)常規(guī)批

審題很重要H罅场!
暴力解法也可以他去,至少可能有幾率通過1醒薄!

  • 實(shí)現(xiàn)隊(duì)列
    用LinkedList實(shí)現(xiàn)灾测,因?yàn)槭穷}中題尔苦,第二層循環(huán)的時(shí)候需要重新new一個(gè)...

  • 兩堆點(diǎn),求最近的距離


啟發(fā):不懂的話可以暴力

  • 翻牌


  • 兩個(gè)棧模擬一個(gè)隊(duì)列
    75%超時(shí)行施,允坚??

import java.util.Scanner;
import java.util.Stack;

public class Queue {
    private static class Queue1{
        private Stack<Integer> stack1 = new Stack<>();
        private Stack<Integer> stack2 = new Stack<>();

        public void add(Integer num){
            stack1.push(num);
        }

        public Integer peek(){
            if(stack1.size()==0&&stack2.size()==0){
                return null;
            }

            if(stack2.size()==0){
                transfer1to2();
            }

            return stack2.peek();
        }

        public Integer poll(){
            if(stack1.size()==0&&stack2.size()==0){
                return null;
            }

            if(stack2.size()==0){
                transfer1to2();
            }

            return stack2.pop();
        }

        public void transfer1to2(){
            while(stack1.size()!=0) {
                stack2.push(stack1.pop());
            }
        }
    }

    public static void main(String[] args) {
        Queue1 queue = new Queue1();
        Scanner sc = new Scanner(System.in);
        Integer numLines = sc.nextInt();
        sc.nextLine();
        for (int i = 0; i < numLines; i++) {
            String line = sc.nextLine();
            String[] splits = line.split("\\s+");
            String op = splits[0].toLowerCase();
            if(op.equals("add")){
                Integer num = Integer.valueOf(splits[1]);
                queue.add(num);
            }else if(op.equals("peek")){
                Integer peek = queue.peek();
                System.out.println(peek);
            }else if(op.equals("poll")){
                queue.poll();
            }
        }
    }
}
  • 二叉樹的第n層父親
    50%蛾号,錯(cuò)在讀取數(shù)據(jù)的時(shí)候沒有用nextLong稠项,10^18次方,這種要用long鲜结。


import java.util.Scanner;


public class TreeParent {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        long numQuery = sc.nextInt();

        for (int i = 0; i < numQuery; i++) {
            long childIndex = sc.nextLong();
            int parentDepth = sc.nextInt();
            System.out.println(getFather(childIndex, parentDepth));
        }
    }

    private static long getFather(long childIndex, int parentDepth){
        int childDepth = depthOf(childIndex);
        if(parentDepth>=childDepth){
            return -1;
        }else{
            int delta = childDepth - parentDepth;
            return childIndex >> delta;
        }
    }

    private static int depthOf(long index){
        int depth = 0;
        while(index>0){
            depth += 1;
            index /= 2;
        }
        return depth;
    }
}

4.29 華為實(shí)習(xí)面試

  • 字符串去掉k個(gè)字符展运,得到字典序最小的字符串

    貪心,每次去掉一個(gè)精刷,去掉的時(shí)候依次比較得到最小拗胜。
    Java字符串沒有單獨(dú)去掉某個(gè)字符的方法,只能用String s = M.substring(0, j) + M.substring(j + 1);
        Scanner sc = new Scanner(System.in);
        String M = sc.next();
        int k = sc.nextInt();

        for (int i = 0; i < k; i++) {
            String temp = M.substring(1);
            for (int j = 1; j < M.length(); j++) {
                String s = M.substring(0, j) + M.substring(j + 1);
                if(temp.compareTo(s)>0){
                    temp = s;
                }
            }
            M = temp;
        }

        System.out.println(M);
  • 花費(fèi)最小的情況下的最小距離
    Floyd算法的基礎(chǔ)排除掉花費(fèi)不符合的
public class Main2 {
    private static int MAX = 100000000;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int K = sc.nextInt(); // coin
        int N = sc.nextInt(); // city
        int R = sc.nextInt(); // road

        int[][] L_Matrix = new int[N][N];
        int[][] T_Matrix = new int[N][N];

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                L_Matrix[i][j] = 100000000;
            }
        }

        for (int i = 0; i < R; i++) {
            int S = sc.nextInt(); //1~N
            int D = sc.nextInt(); //1~N
            int L = sc.nextInt(); //長度
            int T = sc.nextInt(); //花費(fèi)

            L_Matrix[S-1][D-1] = L;
            T_Matrix[S-1][D-1] = T;
        }

        smallestRoad(L_Matrix, T_Matrix, N, K);

        System.out.println(L_Matrix[0][N-1]);
    }

    private static void smallestRoad(int[][] L_Matrix, int[][] T_Matrix, int NumOfCity, int cost){
        for (int i = 0; i < NumOfCity; i++) {
            for (int j = 0; j < NumOfCity; j++) {
                for (int k = 0; k < NumOfCity; k++) {
                    if(L_Matrix[j][i]!=MAX&&L_Matrix[i][k]!=MAX){
                        int temp_L = L_Matrix[j][i] + L_Matrix[i][k];
                        int temp_T = T_Matrix[j][i] + T_Matrix[i][k];
                        if(temp_T <= cost){
                            if(L_Matrix[j][k] > temp_L ){
                                L_Matrix[j][k] = temp_L;
                                T_Matrix[j][k] = temp_T;
                            }else if(L_Matrix[j][k] == temp_L&&temp_T < T_Matrix[j][k]) {
                                    L_Matrix[j][k] = temp_L;
                                    T_Matrix[j][k] = temp_T;
                            }
                        }
                    }
                }
            }
        }
    }
}


4.30 嗶哩嗶哩實(shí)習(xí)面試

  • Python字典的實(shí)現(xiàn)
    不想知道

  • Python GIL
    為啥要用GIL怒允?

  • HTTPS為什么數(shù)字簽名之后就可以證明是你自己埂软?為什么第三方不能對(duì)它進(jìn)行修改?
    數(shù)字簽名采用的是非對(duì)稱加密纫事,對(duì)方擁有公鑰勘畔,自己擁有私鑰所灸,先私鑰再公鑰可以進(jìn)行解密。
    由于黑客沒有我們的私鑰炫七,修改內(nèi)容后爬立,無法對(duì)內(nèi)容進(jìn)行加密。

  • 布隆過濾器用于緩存擊穿万哪,還其他方案嗎侠驯?

  • IO多路復(fù)用
    參考IO多路復(fù)用

  • 為什么進(jìn)程之間不能共享內(nèi)存?
    每個(gè)進(jìn)程都有他自己在頁表所對(duì)應(yīng)的頁表項(xiàng)奕巍,只能映射到它自己的內(nèi)存陵霉。

  • Java/Python垃圾回收

  • 數(shù)據(jù)庫樂觀鎖和悲觀鎖
    樂觀鎖適用于寫比較少的情況下(多讀場景),即沖突真的很少發(fā)生的時(shí)候伍绳,這樣可以省去了鎖的開銷,加大了系統(tǒng)的整個(gè)吞吐量乍桂。悲觀鎖適用于讀比較少的情況下(多寫場景)冲杀,如果是多寫的情況,一般會(huì)經(jīng)常產(chǎn)生沖突睹酌,這就會(huì)導(dǎo)致上層應(yīng)用會(huì)不斷的進(jìn)行retry权谁,這樣反倒是降低了性能,所以一般多寫的場景下用悲觀鎖就比較合適憋沿。

  • 鏈表是否交叉怎么判斷
    先分別遍歷兩個(gè)列表旺芽,然后長的鏈表長出來的部分先遍歷,然后再一起遍歷辐啄,如果在一起遍歷的過程中有相同的節(jié)點(diǎn)就是交叉的采章。

5.17 華為初面

  • 講講封裝,繼承壶辜,多態(tài)
    悯舟。。砸民。

  • 兩個(gè)隊(duì)列模擬一個(gè)棧

  • JVM垃圾回收

  • 講下堆排序抵怎,穩(wěn)定嗎?


  • 設(shè)計(jì)模式

  • 項(xiàng)目

  • 手?jǐn)]:兩個(gè)有序數(shù)組求中位數(shù)
    參考資料:LeetCode-4 尋找兩個(gè)有序數(shù)組的中位數(shù)
    中位數(shù)求法如下岭参,

    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length, n = nums2.length;
        int l = (m + n + 1) / 2;
        int r = (m + n + 2) / 2;
        return (getKthNum(nums1, 0, nums2, 0, l) + getKthNum(nums1, 0, nums2, 0, r)) / 2.0;
    }

因此題目轉(zhuǎn)化為求兩個(gè)有序數(shù)組第k排序反惕。

    private static int getKthNum(int[] nums1, int start1, int[] nums2, int start2, int k) {
        if(start1 > nums1.length-1) return nums2[start2 + k - 1];
        if(start2 > nums2.length-1) return nums1[start1 + k - 1];

        if(k == 1) return Math.min(nums1[start1], nums2[start2]);

        // 一定一個(gè)數(shù)組的可用個(gè)數(shù)大于k/2的,不管怎么樣演侯,我們?nèi)サ羟懊鎘/2個(gè)
        int nums1Mid = start1 + k/2 - 1 < nums1.length ? nums1[start1 + k/2 - 1] : Integer.MAX_VALUE;
        int nums2Mid = start2 + k/2 - 1 < nums2.length ? nums2[start2 + k/2 - 1] : Integer.MAX_VALUE;

        // nums1 前k/2比較小姿染,去掉,并調(diào)整k=k-k/2
        if(nums1Mid < nums2Mid)
            return getKthNum(nums1, start1 + k/2, nums2, start2, k-k/2);
        else
            return getKthNum(nums1, start1, nums2, start2 + k/2, k-k/2);
    }

5.24 騰訊正式批面試

  1. 介紹自己和項(xiàng)目
  1. 你用戶登錄是怎么樣做的秒际,如果用戶登錄只限定30min盔粹,怎么做隘梨?
    session過期,redis過期舷嗡,延時(shí)隊(duì)列刪除掉對(duì)應(yīng)用戶的登錄信息轴猎。

  2. CSRF攻擊和CORS
    是誰控制了

  3. 寫一個(gè)最熟悉的排序算法
    在面試官面前寫代碼的訣竅:亂的時(shí)候,想清楚思路是比較重要的进萄,不要先動(dòng)手捻脖,把各個(gè)細(xì)節(jié)想清楚在寫。我寫的時(shí)候中鼠,連冒泡排序都寫錯(cuò)了可婶,一開始馬上就寫出來兩層for循環(huán),然后很亂援雇,不知道外層循環(huán)是干什么的矛渴,內(nèi)層循環(huán)是干什么的,故在最里層操作的時(shí)候自然很難寫對(duì)惫搏。
    冒泡

public class Bubble {
    public static void main(String[] args) {
        int[] array = new int[]{4,3,2,1};
        bubble(array);
        System.out.println(Arrays.toString(array));
    }
    
    static void bubble(int[] array){
        // 趟數(shù)
        for (int i = 0; i < array.length; i++) {
            // 每趟比較的次數(shù)
            for (int j = 0; j < array.length - i - 1; j++) {
                if(array[j] > array[j + 1]){
                    swap(array, j);
                }
            }
        }
    }

    static void swap(int[] array, int i){
        int temp = array[i+1];
        array[i+1] = array[i];
        array[i] = temp;
    }
}
  1. 你說你喜歡看源碼具温,例子?
    應(yīng)該說下IOC和AOP的筐赔,tomcat铣猩。

  2. 你還有什么擅長技術(shù)是我沒有問到的嗎?
    創(chuàng)造力茴丰,毅力(田徑隊(duì)达皿,電子設(shè)計(jì)大賽4天3夜)

  3. linux 用過嗎?怎么查看CPU占有率贿肩?系統(tǒng)調(diào)用CPU占用VS用戶調(diào)用CPU占用峦椰?
    top

  4. IOC和AOP解釋下

  5. 問問題?
    沒問汰规,為啥不問問實(shí)習(xí)做什么们何?

  6. 可以實(shí)習(xí)多久?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末控轿,一起剝皮案震驚了整個(gè)濱河市冤竹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茬射,老刑警劉巖鹦蠕,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異在抛,居然都是意外死亡钟病,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肠阱,“玉大人票唆,你說我怎么就攤上這事∫倥牵” “怎么了走趋?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長噪伊。 經(jīng)常有香客問我簿煌,道長,這世上最難降的妖魔是什么鉴吹? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任姨伟,我火速辦了婚禮,結(jié)果婚禮上豆励,老公的妹妹穿的比我還像新娘夺荒。我一直安慰自己,他們只是感情好良蒸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布技扼。 她就那樣靜靜地躺著,像睡著了一般诚啃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上私沮,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天始赎,我揣著相機(jī)與錄音,去河邊找鬼仔燕。 笑死造垛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晰搀。 我是一名探鬼主播五辽,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼外恕!你這毒婦竟也來了杆逗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鳞疲,失蹤者是張志新(化名)和其女友劉穎罪郊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尚洽,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悔橄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癣疟。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挣柬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睛挚,到底是詐尸還是另有隱情邪蛔,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布竞川,位于F島的核電站店溢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏委乌。R本人自食惡果不足惜床牧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遭贸。 院中可真熱鬧戈咳,春花似錦、人聲如沸壕吹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耳贬。三九已至踏堡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咒劲,已是汗流浹背顷蟆。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腐魂,地道東北人帐偎。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像蛔屹,于是被迫代替她去往敵國和親削樊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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