都說金三銀四,對於找工做的人來講,由於每一年的三月或四月是很多互聯網公司的年終季,很多人都是拿到年終獎後不滿意,或者感受職業發展受限,以後跑路。這樣很多部門由於人員流動,就會有hc空缺出來。 ==這裏要說的是每一年三、4月份確實是hc最多的季節,但同時是跳槽旺季,競爭大,你要想找到好的坑位,那就須要絕對的實力才行。== 相對來講,其實年末是個好時候,俗話說,鐵打的營盤流水的兵,互聯網的陣地上很多崗位是常年招人,常年缺人,固然hc並不富裕,可是年末的時候,看機會的人也少。畢竟很多人仍是很在乎「年終獎」的嘛。因此說,年末跳槽你可能會損失一部分年終獎,但換工做的競爭性相對來講也會少不少,競爭的人少了嘛,說不定你就能夠憑「運氣的實力」脫穎而出呢?java
面試官很親切,說Excel表用過吧,Excel表中的編號通常是這樣的,A....Z AA...AZ BA...BZ,分別對應數字0...25 26....51 52...77,類比作數字映射,給出一個字符串,求映射的結果。mysql
分析 這個題目其實很基礎,能夠理解爲是以26爲基準的進制轉換,一個for循環,除了末尾的字符直接加到結果上以外,其餘的字符位-'A'+1的結果乘以26*(該字符位置與末尾的差值)。作這種題目必定要先思考,本身手動實現一下。 若是想看具體代碼答案,能夠掃碼關注【程序員之道】,後臺回覆「快手列轉換」。 程序員
第二個算法,就稍微有一點偏了,如何實現redis的分佈式鎖。面試
若是沒有接觸太高併發,或者沒有使用過redis做爲分佈式鎖,那這這個算法確定是寫不出來的,並且像這種算法,通常來講可能也就是讓講講思路。具體實現確實有點難。 關於分佈式鎖,實際上是有幾個坑的:redis
思考了這些,你能寫成正確的加鎖,解鎖方式嗎?具體的坑及正確的加解鎖方式,關注【程序員之道】,後臺回覆「redis分佈式鎖」。算法
(1)儘可能減小like,但不是絕對不可用,」xxxx%」 是能夠用到索引的
(2)表的主鍵、外鍵必須有索引
(3 誰的區分度更高(同值的最少),誰建索引,區分度的公式是count(distinct(字段))/count(*)
(4)單表數據太少,不適合建索引
(5)where,order by ,group by 等過濾時,後面的字段最好加上索引
(6)若是既有單字段索引,又有這幾個字段上的聯合索引,通常能夠刪除聯合索引;
(7)聯合索引的創建須要進行仔細分析;儘可能考慮用單字段索引代替:
(8)聯合索引: mysql 從左到右的使用索引中的字段,一個查詢能夠只使用索引中的一部份,但只能是最左側部分。例如索引是key index(a,b,c). 能夠支持 a|a,b|a,b,c 3種組合進行查找,但不支持 b,c 進行查找.當最左側字段是常量引用時,索引就十分有效。
(9)前綴索引: 有時候須要索引很長的字符列,這會讓索引變得大且慢。一般能夠索引開始的部分字符,這樣能夠大大節約索引空間,從而提升索引效率。其缺點是不能用於ORDER BY和GROUP BY操做,也不能用於覆蓋索引 Covering index(即當索引自己包含查詢所需所有數據時,再也不訪問數據文件自己)。
(10)NULL會致使索引形同虛設
複製代碼
=和in能夠亂序,好比a = 1 and b = 2 and c = 3 創建(a,b,c)索引能夠任意順序,mysql的查詢優化器會幫你優化成索引能夠識別的形式。sql
redis裏有哪些數據結構,都用過什麼?redis裏Sorted Set怎麼用,須要傳什麼參數? 要點: redis的數據結構:String,Hash、List、Set、Sorted Set,用過哪些就說哪些就好了,沒用過的,估計你根據名詞也能大概猜出是什麼。 面試官問Sorted Set大概是你聽到你說了Sorted Set,因此問一下你命令,看你是否是真的知道啊,不知道的話,這下無法矇混過關了吧。有序集合,設置每一個key的時候須要傳入一個score參數。具體命令zadd key score value。還有一些其餘的命令google學習一下吧!數據庫
java volatile幹什麼用的。public int incrment() { count++},兩個線程同時訪問是否有問題,count若是用volatile修飾呢? 要點: volatile主要是保證多線程訪問時的可見性。咱們知道計算機爲了提升訪問內存的速度,引入了工做內存和主內存的機率,多線程訪問數據時,訪問的是工做內存的數據,各個線程之間的工做內存是分別隔離的。這就可能致使同一個變量,因爲工做內存的存在,在不一樣線程「看到的值」是不同的。但volatile關鍵字,強制了各線程讀取變量時必須從主內存讀取,同時對變量的修改也直接刷新到主內存,這樣就保證了同一變量修改的同時能夠馬上被其餘線程「看到」。這裏面使用了「內存屏障」的技術。 對於count++,操做系統執行時,並非一個原子操做,分爲三步:1)將count變量load到內存。2)執行count+1。3)將結果存入內存。非原子性操做,任何一個步驟執行的時候,均可能被其餘線程打斷,因此多線程執行時會有問題。 使用volatile修飾也是不能夠的,由於始終不是原子操做,也只是保證可見性而已,原子性的問題沒法解決。數組
jvm裏內存分配什麼樣的,分別用來幹什麼? 要點: JVM內存分配幾乎是每一個java開發人員的面試必考點,單純這部分的內容都夠寫幾個篇章的了。這裏只是簡單的介紹一下。 JVM內存分爲年輕代和老年代,其中年輕代又分爲S0、S一、Eden區,JVM採用分代垃圾回收算法,由於這樣才能更充分的利用年輕代和老年代的對象特色,最大化的提升垃圾回收效率。bash
類對象定義後分配在年輕代。
大對象或大數組直接分配在老年代。
常見的垃圾回收算法有複製算法、標記清除、標記整理,而後又引出不一樣的垃圾回收器,垃圾回收器的迭代是不斷髮現問題並優化的過程,新生代收集器使用的收集器:Serial、PraNew、Parallel Scavenge;老年代收集器使用的收集器:Serial Old、Parallel Old、CMS。而後結合本身的理解再說一下!
jvm的棧是作什麼,爲何有堆又有棧,只使用堆能夠嗎? 要點: JVM的棧是線程私有的,一些基本變量都是存儲在棧中的,Java棧中存放的是一個個的棧幀,每一個棧幀對應一個被調用的方法,在棧幀中包括局部變量表(Local Variables)、操做數棧(Operand Stack)、指向當前方法所屬的類的運行時常量池(運行時常量池的概念在方法區部分會談到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些額外的附加信息。當線程執行一個方法時,就會隨之建立一個對應的棧幀,並將創建的棧幀壓棧。當方法執行完畢以後,便會將棧幀出棧。 爲何有了堆以後還要有棧?棧的存在能夠說是爲了解決遞歸調用的問題。若是隻有堆內存,那就不會有遞歸調用了。
分佈式自增id怎麼實現,若是用redis實現,怎麼保證與數據庫的一致性? 分佈式自增id通常使用MySQL的自增id、redis的incr函數,還有比較經典的雪花算法。 MySQL自增id受數據庫訪問速度的限制,在分佈式使用時qps不大。 使用redis產生自增id,就要防止redis崩潰的可能性,通常在MySQL或hbase中記錄當前最大的value值。或者若是你設計的是一個聊天室,那確定是有持久化存儲當前聊天室的最大seqId,若是redis集羣出現崩潰,從持久化存儲的地方取出最大seqId而後自增便可。
ArrayList,LinkedList有什麼區別,分別何時使用? ArrayList的底層實現是數組,數組的擴容是不斷經過複製來完成的,因此存儲的數據容量不斷髮生變化時,ArrayList的性能是比較差的。使用ArrayList時通常都是預知數據的最大容量。若是能直接使用數組,那使用數組固然是最好的了。 LinkedList的底層實現是鏈表,發生數據擴容時,性能較好,但同容量狀況下佔用的空間比ArrayList要大。對於數據頻繁擴容的狀況,推薦使用LinkedList。
面試的內容還有不少,限於篇幅問題,在下一篇介紹。 程序員的小夥伴們,以爲本身孤單麼,那就加入公衆號[程序員之道],一塊兒交流溝通,走出咱們的程序員之道!