百度(offered)
百度一面
1 手寫ArrayList
2 手寫
進制轉換算法,求出一個數的二進制數1的個數
A、十進制轉換其餘java
十進制轉成二進制
Integer.toBinaryString(int i) mysql
十進制轉成八進制
Integer.toOctalString(int i) linux
十進制轉成十六進制:
Integer.toHexString(int i)c++
B、其餘轉換十進制git
二進制轉十進制
Integer.valueOf("1010",2).toString()github
八進制轉成十進制
Integer.valueOf("125",8).toString() web
十六進制轉成十進制
Integer.valueOf("ABCDEF",16).toString() 面試
求二進制1的個數?redis
num&(num-1)的結果即爲把最右邊的1置零;
3 equals和==
(1.基本類型;2.基本類型封裝;3.String;4.普通對象;)
4
多線程方式、
threadlocal,各類
鎖,
synchronized和lock
synchronized和lock異同?
(1.屬性;2.trylock;3.釋放;4.線程交互)
1)lock是接口,syn是Java中的關鍵字;
2)lock的tryLock方法能夠選擇性獲取鎖,可以規避死鎖;而syn會一直獲取下去;
3)syn發生異常或者同步塊結束的時候,會自動釋放鎖;而Lock必須手動釋放unlock;
4)syn線程交互,用到的是同步對象的wait/notify/notifyAll方法;lock獲得一個Condition對象,調用Condition對象的await/signal/signalAll;
5 設計模式、
spring類加載方式、實例保存在哪、
aop ioc、
反射機制
定義bean的方式?
1)XML配置方式;2)註解方式;
bean存儲?
利用java反射機制,生成bean實例,實例化的單例bean放入HashMap存儲,id做爲key;
aop?ioc?
反射機制?
反射機制實際上就是動態的加載一些類,這些類在編譯時不須要加載,但運行時再調用。
反射是在運行時獲取類信息,經過動態的調用來改變程序行爲。
6
類加載器,
雙親委派模型,熱部署
類加載器ClassLoader?
(三類、加載的類庫、實現)
系統提供的類加載器包括三類:啓動類加載器Bootstrap、擴展類加載器Extension、應用程序類加載器Application。
啓動類加載器Bootstrap,加載JDK/jre/lib下的類庫,也就是Java的核心庫;啓動類加載器是用原生代碼而不是java實現的,並不繼承自java.lang.ClassLoader,除此以外基本上全部的類加載器都是java.lang.ClassLoader類的一個實例。啓動類加載器是沒法被Java程序直接引用的。
擴展類加載器Extension,加載/lib/ext目錄的擴展庫;能夠被開發者直接使用。
應用程序類加載器Application,加載Java應用類路徑ClassPath所指定的類。
雙親委派模型?
(流程、優勢、舉例)
工做流程是:若是若是一個類加載器收到了類加載的請求,不會首先本身去加載,而是把請求委託給父加載器去完成,依次向上。只有當父加載器在搜索範圍中沒有找到所需的類時,即沒法完成加載,子加載器才嘗試加載該類。
雙親委派模型優勢是Java類隨着類加載器具有了待友優先級的層次關係,對於保證Java程序穩定運做很重要。例如Object類在lib的rt.jar中。
熱部署?
熱部署,簡單點來講,就是咱們將打包好的應用直接替換掉原有的應用。
每個應用程序的類都會被ClassLoader加載,因此,要實現一個支持熱部署的應用,咱們能夠對每個用戶自定義的應用程序使用一個單獨的ClassLoader進行加載。而後,當某個用戶自定義的應用程序發生變化的時候,咱們首先銷燬原來的應用,而後使用一個新的ClassLoader來加載改變以後的應用。而全部其餘的應用程序不會受到一點干擾。
7
jvm內存模型,內存結構、
堆的分代算法、
堆的分區、
gc算法、
gc過程。
JVM內存模型?
JVM內存模型包括5個部分,分爲線程共享的和線程隔離的部分。
線程共享的數據區是堆和方法區;
線程隔離的數據區是虛擬機棧、本地方法棧和程序計數器;
1)
程序計數器:是一個比較小的內存區域,,用於指示當前線程所執行的字節碼執行到了第幾行,能夠理解爲是當前線程的行號指示器。每一個程序計數器只用來記錄一個線程的行號,因此是線程私有的。(行號指示、線程私有)
2)
虛擬機棧:一個線程的每一個方法在執行的同時,都會建立一個
棧幀,棧幀中存儲的有
局部變量表、操做數棧、動態連接、返回地址等,當方法被調用時,棧幀在JVM棧中入棧,當方法執行完成時,棧幀出棧。每一個線程對應着一個虛擬機棧,所以虛擬機棧也是線程私有的。(棧幀)
3)
本地方法棧:本地方法棧在做用,運行機制,異常類型等方面都與虛擬機棧相同,惟一的區別是:
虛擬機棧是執行Java方法的,而本地方法棧是用來執行native方法的。
4)
方法區:方法區是各個線程共享的區域,用於
存儲已經被虛擬機加載的類信息(即加載類時須要加載的信息,包括版本、field、方法、接口等信息)、final常量、靜態變量、編譯器即時編譯的代碼等。
5)
堆區:堆區的存在是爲了
存儲對象實例,原則上講,全部的對象都在堆區上分配內存。堆區也是Java GC機制所管理的主要內存區域。
堆的分代算法?分區?GC算法?GC過程?
內存分配,主要指的是在堆上的分配。Java內存分配和回收的機制歸納的說,就是:
分代分配,分代回收。對象將
根據存活的時間被分爲:年輕代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法區)。
算法的選擇:在新生代中,
每次垃圾收集時都發現有大批對象死去,只有少許存活,那就選用複製算法,只須要付出少許存活對象的複製成本就能夠完成收集。而老年代中由於對象存活率高、沒有額外空間對它進行分配擔保,就必須使用「標記-清理」或「標記-整理」算法來進行回收。方法區永久代,回收方法同老年代。
年輕代:分區 Eden S0 S1;Minor GC;複製算法:將Eden區和一個Survivor中仍然存活的對象拷貝到另外一個Survivor中。
年老代:Full GC 標記整理算法:標記出仍然存活的對象(存在引用的),將全部存活的對象向一端移動,以保證內存的連續。
8 tcp ip
七層模型
rest接口規範
get和post區別,長度,安全。
七層模型?
自底向上是:物理層、鏈路層、網絡層、傳輸層、會話層、表示層、應用層;
rest接口規範?
get和post區別?
(1.http規範:冪等、安全;2.應用:參數/保密性、長度 3.總結)
根據HTTP規範:
1)get用於信息獲取,是安全的和冪等的。安全是針對服務端而言,get不會引發數據的變化,例如對數據庫的增刪改。產生的結果是冪等的,指同一個url和一樣的get參數,呈現給用戶的結果相同。
2)post可能引發數據的變化。好比填寫表單更新數據。
從應用角度來看:
1)get請求參數放在URL後面,格式是URL?key1=value&key2=value...即?在URL後面,多個參數用&隔開,能夠在連接看到參數。長度方面:理論上HTTP對get參數沒有長度限制,可是通常打開連接都是經過瀏覽器,所以會受到瀏覽器或者操做系統限制長度,比較常見的限制長度是1024字節。
2)post請求數據會放在HTTP包中,保密性相對安全。HTTP標準也沒有對POST數據進行限制,可是會受到服務端的長度限制,如處理的程序(PHP),服務器引擎(Apache)。
總結:
1)get適合於查詢區分某些特定數據的頁面,如商品展現。
2)因爲post的HTTP標準,所以更適合作數據的改變,並且因爲應用角度上的數據傳遞方式,更適合用於登陸註冊功能頁,由於數據不會顯示在url中,相對安全一些。
9 tcp ip的
ARP協議,兩個同一網絡的主機如何得到對方的mac地址。
ARP協議?
(功能、工做原理)
ARP(Address Resolution Protocol)是地址解析協議;
OSI模型把網絡工做分爲七層,IP地址在OSI模型的第三層,MAC地址在第二層,彼此不直接打交道。在經過以太網發送IP數據包時,須要先封裝第三層(32位IP地址)、第二層(48位MAC地址)的報頭,但因爲發送時只知道目標IP地址,不知道其MAC地址,又不能跨第2、三層,因此須要使用地址解析協議。使用地址解析協議,可根據網絡層IP數據包包頭中的IP地址信息解析出目標硬件地址(MAC地址)信息,以保證通訊的順利進行。(歸納:在不一樣層,不能傳輸)
工做原理:
(1.查;2.有,沒有-ARP請求;3.不一致,一致-ARP響應;4.收到,沒收到)
0)ARP緩衝區,ARP列表-IP地址和MAC地址的對應關係;
1)檢查ARP列表;
2)列表沒有;發起ARP請求的廣播包,包括源主機IP、MAC以及目的主機IP地址;
3)網絡中全部主機收到ARP請求,檢查IP和本身IP是否一致,不一樣則忽略;
4)相同:1.首先將發送端MAC和IP添加到本身的ARP,若是以及存在則覆蓋;2.給源主機發送一個ARP響應數據包,告訴對方本身是它須要查找的MAC地址;
5)源主機收到ARP響應包,將目的主機IP和MAC添加到ARP列表;並開始數據傳輸;
6)若是源主機一致沒有收到ARP響應數據包,表示ARP查詢失敗。
10 負載均衡、高併發、高可用的架構
11
mysql的引擎區別
MyISAM和InnoDB:(1.事務;2.鎖;3.效率;4.查詢/插入更新)
12
redis緩存,redis的集羣部署,熱備份,主從備份,主從數據庫,hash映射找到知道指定節點。
todo
13 瞭解雲計算麼,瞭解雲容器docker麼,容器和虛擬機的區別。
百度二面
1自我介紹 項目中負責哪些 作了哪些
2項目中的數據庫備份,主從數據庫、集羣
3
數據庫的
索引原理,
b+樹原理,
trie樹引伸,
二叉查找樹的原理
索引?
索引:數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現一般使用B樹及其變種B+樹。在數據以外,數據庫系統還維護着知足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就能夠在這些數據結構上實現高級查找算法。這種數據結構,就是索引。
二叉查找樹原理?
對於樹的每一個節點,大於左子節點的值,小於右子節點的值;
B樹?
(把B樹和B+樹的兩張圖多熟悉一點)
B樹是多路搜索樹;B樹的結構保證了它是比較平衡的,每一個結點的子樹都不能過少,且從根到葉的路徑長度都相同,這對於提升查找效率很是有利。
1)每一個節點存放M/2-1(上取整)到M-1個關鍵字;
2)根節點的兒子樹是[2,M];
3)除根節點外非葉子節點的兒子數是[M/2,M];
4)非葉子節點的關鍵字個數 = 指向兒子的指針個數 - 1;
B樹的搜索:從根結點開始,對結點內的關鍵字(有序)序列進行二分查找,若是命中則結束,不然進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指針爲空,或已是葉子結點。
B樹的特性:關鍵字分佈在整棵樹中;搜索性能等價於在關鍵字全集內作一次二分查找;
B+樹?
B+樹是B樹的變體,也是多路搜索樹;不一樣的是:
1)非葉子節點的子樹指針與關鍵字個數相同;
2)非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間)
3)爲全部葉子結點增長一個鏈指針;
4)全部關鍵字都在葉子結點出現;
B+的搜索與B樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹能夠在非葉子結點命中),其性能也等價於在關鍵字全集作一次二分查找;
B+樹的特性:
1.全部關鍵字都出如今葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字剛好是有序的;
2.只會在葉子結點命中;
3.非葉子結點至關因而葉子結點的索引(稀疏索引),葉子結點至關因而存儲(關鍵字)數據的數據層;
trie樹?
即字典樹/單詞查找樹;是一種樹形結構,是一種哈希樹的變種。典型應用是用於統計和排序大量的字符串(但不只限於字符串),因此常常被搜索引擎系統用於文本詞頻統計。它的優勢是:最大限度地減小無謂的字符串比較,查詢效率比哈希表高。
3個基本性質:
- 根節點不包含字符,除根節點外每個節點都只包含一個字符。
- 從根節點到某一節點,路徑上通過的字符鏈接起來,爲該節點對應的字符串。
- 每一個節點的全部子節點包含的字符都不相同。
參考:Trie樹
4
海量數據中查找一個單詞,分佈式計算map reduce ,或者用hsah映射篩選部分結果
5java的
抽象類和接口區別、java的
hashmap,java的
內存模型,分區,分代
垃圾回收算法。實例、常量放在哪裏。
抽象類和接口區別?
(1.變量;2.方法(抽象、public);3.一/多;)
1)變量:接口的變量默認是final的,而抽象類能夠包含非final變量;
2)方法:接口中的方法默認是public,抽象類方法能夠是private/protected/public;接口中只能提供抽象方法,而抽象類中既能夠提供抽象方法,也能夠提供實現方法;
3)一個類能夠實現不少接口,但只能繼承一個抽象類;
hashmap?
(1.結構;2.put/get;3.參數-容量、負載係數、閾值)
(講到容量是2的n次方的時候能夠延伸講一下緣由;)
6 int 4個字節,double 8個字節。
基本數據類型?
整型4種:byte/short/int/long 字節數:1/2/4/8
字符型1種:char 2
浮點型2種:float/double 4/8
布爾型1種:boolean 1/8
7
多線程中的
wait和sleep區別,
notify的做用
wait和sleep區別?
(1.屬性;2.鎖;3.範圍;)
1)屬性:wait()是Object的方法,而sleep()是線程類Thread的方法;
2)鎖:wait會放棄對象鎖,進入等待隊列,只有調用了notify(),纔會結束wait狀態,參與競爭同步資源鎖;而sleep()只讓出了cpu,而不會釋放同步資源鎖,sleep指定時間後CPU再回到該線程繼續往下執行;
3)範圍:sleep能夠在任何地方使用,wait只能在同步方法或同步塊中使用;
8
設計模式瞭解哪些,寫一個
觀察者模式。實現兩個接口,一個是主題一個是觀察者,並寫出對應方法。
觀察者模式?
觀察者模式包括:抽象主題、具體主題;抽象觀察者、具體觀察者;
抽象主題,提供attach、detach、notify三個方法;
抽象觀察者,提供update方法;
9寫一個
生產者消費者隊列的方法,分別寫兩個類表明生產者和消費者,而且用隊列模擬其生產消費。用while循環和wait notify能夠實現,但我忘記在隊列上加synchronize關鍵字,因而讓我再寫一題。寫的是:輸入一個字符串,輸入第一個只出現一次的字符,寫出來了。
10:tcp ip的
四次揮手
子網掩碼的做用, 子網掩碼(subnet mask)又叫 網絡掩碼、地址掩碼、子網絡遮罩,它是一種用來指明一個IP地址的哪些位標識的是主機所在的子網,以及哪些位標識的是主機的位掩碼。子網掩碼不能單獨存在,它必須結合IP地址一塊兒使用。子網掩碼只有一個做用,就是將某個IP地址劃分紅 網絡地址 和 主機地址 兩部分。
四次揮手?
(流程;TIME_WAIT狀態強調一下;四次揮手緣由;)
子網掩碼?
todo
11 :瞭解linux麼,說一下linux的內核鎖?沒接觸過。
12 有沒有用過sed 使用shell腳本寫一個將文本中的字符替換掉的腳本,大概說了一下用grep || 替換。沒再問linux的
百度三面
1自我介紹
2負責模塊,哪些模塊,項目一的架構,我說過久了忘了,說最近的項目。
3
數據庫鏈接池用的是什麼,配置文件呢,數據庫驅動怎麼下載的,持久層框架呢。
數據庫鏈接池?
c3p0, druid;
配置?
初始化鏈接數量 initialSize
最大鏈接數 maxActive
最大空閒鏈接數 maxIdle
最小空閒連接數 minIdle
空閒時間 maxWait
持久層框架?
MyBatis (和hibernate區別?)
4爲何要用
數據庫鏈接池,有什麼好處。
做用?優缺點?
1)資源重用。避免了頻繁建立、釋放鏈接引發的大量性能開銷。
2)更快的系統響應速度 。數據庫鏈接池在初始化過程當中,每每已經建立了若干數據庫鏈接置於池中備用。此時鏈接的初始化工做均已完成。對於業務請求處理而言,直接利用現有可用鏈接,避免了數據庫鏈接初始化和釋放過程的時間開銷,從而縮減了系統總體響應時間。
5java的
內存模型,變量和實例存在哪。java棧的做用,java的堆存什麼,方法區存什麼。java的
分代回收。
6項目如何部署到雲主機上,有什麼速度提高,爲何有提高,答主要是設備性能和帶寬。
7tomcat的配置,堆得初始大小是多少,答不知道。
8在網易實習的相關事項。
9問遇到過什麼難題。
10問臺灣交流經歷,學習內容。
11問在遇到問題時候的辦法。
12抗壓能力
13優缺點
14接受加班。
15遇到工做問題,同事不配合怎麼辦。
16快速上手工做的辦法。
先對大的結構有所瞭解,再深刻各個部分。
17平時學習的方法,舉幾點。
學習新知識先過一遍基礎教程,再在項目中學習,遇到重要的再深刻學習。
18爲何要換工做,我的,女朋友。詳情。
19何時能來。
20職業規劃
三次面試每一次都是1個小時,只能說面試質量好高。
而後經過了。
阿里一面:
1 項目
2 項目中的問題
3
java三大特性
(1.特性;2.優勢)
封裝、繼承、多態;
封裝:封裝隱藏了類的內部實現機制,能夠在不影響使用的狀況下改變類的內部結構,同時也保護了數據。對外界而已它的內部細節是隱藏的,暴露給外界的只是它的訪問方法。優勢:1.隱藏對象的屬性來保護對象內部狀態;2.禁止對象的不良交互提升模塊化;
繼承:給對象提供了從基類獲取字段和方法的能力。優勢:提升代碼的重用性;
多態:指容許不一樣類的對象對同一消息作出相應。所謂多態就是指程序中定義的引用變量所指向的具體類型和經過該引用變量發出的方法調用在編程時並不肯定,而是在程序運行期間才肯定,即一個引用變量倒底會指向哪一個類的實例對象,該引用變量發出的方法調用究竟是哪一個類中實現的方法,必須在由程序運行期間才能決定。由於在程序運行時才肯定具體的類,這樣,不用修改源程序代碼,就可讓引用變量綁定到各類不一樣的類實現上,從而致使該引用調用的具體方法隨之改變,即不修改程序代碼就能夠改變程序運行時所綁定的具體代碼,讓程序能夠選擇多個運行狀態,這就是多態性。
實現多態的三個條件:
1)繼承:在多態中必須存在有繼承關係的子類和父類。
2)重寫:子類對父類中某些方法進行從新定義,在調用這些方法時就會調用子類的方法。
3)向上轉型:在多態中須要將子類的引用賦給父類對象,只有這樣該引用纔可以具有技能調用父類的方法和子類的方法。
多態的特色:父類對象引用子類;1.能夠調用父類方法;2.子類重寫父類則調用子類方法;3.只存在子類的方法不可調用,子類重載父類的方法不可調用(重載的方法父類中不存在!);
多態的優勢:可擴充性,能夠方便的增長新的子類不影響已存在類的功能特性。
4
jvm虛擬機 結構、算法、
垃圾回收、分代
5
集合類 鏈表數組 map幾種 set等
集合類?
集合類的最頂層接口是Collection和Map接口,Collection表明一組對象,Map是保存鍵值對;
Collection接口包括List、Set、Queue三個接口;
List接口實現類:
ArrayList、
LinkedList、Vector; Stack繼承Vector類;
Set接口實現類:SortedSet(i)、
HashSet、EnumSet;
TreeSet實現SortedSet,LinkedHashSet繼承HashSet;
Queue接口實現類:Deque(i)、PriorityQueue;ArrayDeque和LinkedList實現Deque
Map接口包括
HashMap、
TreeMap;
Set和List?
Set不容許重複元素、容許一個null值,沒有索引;
List容許重複元素、容許多個null值、有索引、按插入順序顯示;
HashSet?
內部實現了hashmap;
6
二分查找代碼
(經典二分、第一個、最後一個、旋轉排序最小值、旋轉排序tar、)
7 mysql相關
(事務、引擎、索引、樹)
8
spring
(IoC、AOP、動態代理、)
9 先後端數據交互
10 網絡、操做系統
11 用過哪些技術
阿里二面:
1 項目
2 spring springmvc mybatis
3 GitHub上的代碼是什麼 代碼包括 劍指offer 項目一 項目二 遊戲項目 校招筆試題 Android項目
4 大三機器人項目
5 實習經歷
6 github上某個項目的開發過程
7 學院排名
20分鐘直接過了,十分開心,基本沒問什麼技術問題。
阿里hr面
1自我介紹
2項目經歷
3實習經歷
4實習經歷 具體
5實習爲何找這裏
6實習方向,開發方向轉變
7評價本身
8缺點
9大學時期獲獎
10爲何選擇支付寶部門,其餘部門呢
11有什麼問題
問了好多問題,基本是一個問題接着上一個。hr面也順利結束
可是做死的事發生了,背景調查的時候時間沒談妥,我原本覺得後續會再商討,結果20天沒有一個電話再打進來,因爲是總機號碼我也打不回去。直到今天流程被回絕,累覺不愛。不得不吐槽一下這坑爹的安排。來年再來,今年實習進不了來年校招再見吧。
五層:1.源端口16+目的端口16; 2.序列號32; 3.確認號32;4.頭部4+保留位6+標誌位6+窗口大小16位;5.校驗和16+緊急指針16;
testOnReturn,testOnBorrow這兩個參數爲true,表示會在每次請求以前和以後進行鏈接池測試,若是鏈接失效,就會將這條鏈接對象銷燬,建立一個新的鏈接對象。
testWhileIdle參數。這個參數爲true時候,表示空閒時是進行驗證,檢查對象是否有效。而後minEvictableIdleTimeMillis配合timeBetweenEvictionRunsMillis,每過timeBetweenEvictionRunsMillis秒對鏈接池進行一次檢測,將對象閒置時間超過minEvictableIdleTimeMillis秒的對象進行銷燬,建立新的對象來取代。這樣就能保證時刻都有正常的鏈接池對象存在。
優勢:使Java類隨着類加載器具有了帶有優先級的層次關係,對於保正Java程序穩定運做很重要。例如Object類在lib的rt.jar中,防止不可靠甚至惡意的代碼代替由父類裝載器裝在的可靠代碼。
3.注入:${}是字符串替換,會存在sql注入問題;好比select * from table where name = ${smith or 1 = 1},這樣不管是否匹配,都能查到結果;
在Java中,內存泄漏就是存在一些被分配的對象,這些對象有下面兩個特色,首先,這些對象是可達的,即在有向圖中,存在通路能夠與其相連;其次,這些對象是無用的,即程序之後不會再使用這些對象。若是對象知足這兩個條件,這些對象就能夠斷定爲Java中的內存泄漏,這些對象不會被GC所回收,然而它卻佔用內存。
Java內存泄漏的根本緣由是什麼呢?長生命週期的對象持有短生命週期對象的引用就極可能發生內存泄漏,儘管短生命週期對象已經再也不須要,可是由於長生命週期持有它的引用而致使不能被回收,這就是Java中內存泄漏的發生場景。
3)SQL語句方面:1.優化SQL語句,減小比較次數;如避免select * from而使用具體的字段列表代替,避免在where中使用!=或<>操做符,不然將放棄索引而進行全表掃描; 2.限制返回條目limit;