位元組跳動年前再招聘 1W+ 人,距離大廠 Offer,你還差這篇Android乾貨!
大廠的招聘,並不會因為疫情而影響太多。
前段時間,位元組跳動釋出了年前再招 1 萬人的訊息。從位元組的招聘崗位需求來看,研發人員仍佔多數。我身邊的研發朋友們又開始蠢蠢欲動了,是啊,誰還沒個位元組夢呢?
網上也出現遠端入職的位元組跳動員工,還沒去公司就收到膝上型電腦的新聞。
放心,這不是廣告,只是想說明,疫情打不垮中國企業的發展,更不會阻擋中國的用工需求。
而如果你要面試大廠Android崗位,這篇文章或許應該作為你的“面經”。
1、網路
網路協議模型
應用層:負責處理特定的應用程式細節
HTTP、FTP、DNS
傳輸層:為兩臺主機提供端到端的基礎通訊
TCP、UDP
網路層:控制分組傳輸、路由選擇等
IP
鏈路層:作業系統裝置驅動程式、網路卡相關介面
TCP 和 UDP 區別
TCP 連線;可靠;有序;面向位元組流;速度慢;較重量;全雙工;適用於檔案傳輸、瀏覽器等
- 全雙工:A 給 B 發訊息的同時,B 也能給 A 發
- 半雙工:A 給 B 發訊息的同時,B 不能給 A 發
UDP 無連線;不可靠;無序;面向報文;速度快;輕量;適用於即時通訊、視訊通話等
TCP 三次握手
A:你能聽到嗎?
B:我能聽到,你能聽到嗎?
A:我能聽到,開始吧
A 和 B 兩方都要能確保:我說的話,你能聽到;你說的話,我能聽到。所以需要三次握手
TCP 四次揮手
A:我說完了
B:我知道了,等一下,我可能還沒說完
B:我也說完了
A:我知道了,結束吧
B 收到 A 結束的訊息後 B 可能還沒說完,沒法立即回覆結束標示,只能等說完後再告訴 A :我說完了。
POST 和 GET 區別
Get 引數放在 url 中;Post 引數放在 request Body 中
Get 可能不安全,因為引數放在 url 中
HTTPS
HTTP 是超文字傳輸協議,明文傳輸;HTTPS 使用 SSL 協議對 HTTP 傳輸資料進行了加密
HTTP 預設 80 埠;HTTPS 預設 443 埠
優點:安全
缺點:費時、SSL 證照收費,加密能力還是有限的,但是比 HTTP 強多了
2、Java 基礎&容器&同步&設計模式
StringBuilder、StringBuffer、+、String.concat 連結字串:
- StringBuffer 執行緒安全,StringBuilder 執行緒不安全
- +實際上是用 StringBuilder 來實現的,所以非迴圈體可以直接用 +,迴圈體不行,因為會頻繁建立 StringBuilder
- String.concat 實質是 new String ,效率也低,耗時排序:StringBuilder < StringBuffer < concat < +
Java 泛型擦除
- 修飾成員變數等類結構相關的泛型不會被擦除
- 容器類泛型會被擦除
ArrayList、LinkedList
ArrayList
基於陣列實現,查詢快:o(1),增刪慢:o(n)
初始容量為10,擴容透過 System.arrayCopy 方法
LinkedList
基於雙向連結串列實現,查詢慢:o(n),增刪快:o(1)
封裝了佇列和棧的呼叫
HashMap 、HashTable
HashMap
- 基於陣列和連結串列實現,陣列是 HashMap 的主體;連結串列是為解決雜湊衝突而存在的
- 當發生雜湊衝突且連結串列 size 大於閾值時會擴容,JAVA 8 會將連結串列轉為紅黑樹提高效能
允許 key/value 為 null
HashTable
- 資料結構和 HashMap 一樣
- 不允許 value 為 null
- 執行緒安全
ArrayMap、SparseArray
ArrayMap
1.基於兩個陣列實現,一個存放 hash;一個存放鍵值對。擴容的時候只需要陣列複製,不需要重建雜湊表
2.記憶體利用率高
3.不適合存大量資料,因為會對 key 進行二分法查詢(1000以下)
SparseArray
1.基於兩個陣列實現,int 做 key
2.記憶體利用率高
3.不適合存大量資料,因為會對 key 進行二分法查詢(1000以下)
volatile 關鍵字
- 只能用來修飾變數,適用修飾可能被多執行緒同時訪問的變數
- 相當於輕量級的 synchronized,volatitle 能保證有序性(禁用指令重排序)、可見性;後者還能保證原子性
- 變數位於主記憶體中,每個執行緒還有自己的工作記憶體,變數在自己執行緒的工作記憶體中有份複製,執行緒直接操作的是這個複製
- 被 volatile 修飾的變數改變後會立即同步到主記憶體,保持變數的可見性。
雙重檢查單例,為什麼要加 volatile?
1.volatile想要解決的問題是,在另一個執行緒中想要使用instance,發現instance!=null,但是實際上instance還未初始化完畢這個問題
2.將instance =newInstance();拆分為3句話是。1.分配記憶體2.初始化3.將instance指向分配的記憶體空
3.volatile可以禁止指令重排序,確保先執行2,後執行3
wait 和 sleep
- sleep 是 Thread 的靜態方法,可以在任何地方呼叫
- wait 是 Object 的成員方法,只能在 synchronized 程式碼塊中呼叫,否則會報 IllegalMonitorStateException 非法監控狀態異常
- sleep 不會釋放共享資源鎖,wait 會釋放共享資源鎖
lock 和 synchronized
- synchronized 是 Java 關鍵字,內建特性;Lock 是一個介面
- synchronized 會自動釋放鎖;lock 需要手動釋放,所以需要寫到 try catch 塊中並在 finally 中釋放鎖
- synchronized 無法中斷等待鎖;lock 可以中斷
- Lock 可以提高多個執行緒進行讀/寫操作的效率
- 競爭資源激烈時,lock 的效能會明顯的優於 synchronized
可重入鎖
- 定義:已經獲取到鎖後,再次呼叫同步程式碼塊/嘗試獲取鎖時不必重新去申請鎖,可以直接執行相關程式碼
- ReentrantLock 和 synchronized 都是可重入鎖
公平鎖
- 定義:等待時間最久的執行緒會優先獲得鎖
- 非公平鎖無法保證哪個執行緒獲取到鎖,synchronized 就是非公平鎖
- ReentrantLock 預設時非公平鎖,可以設定為公平鎖
樂觀鎖和悲觀鎖
- 悲觀鎖:執行緒一旦得到鎖,其他執行緒就掛起等待,適用於寫入操作頻繁的場景;synchronized 就是悲觀鎖
- 樂觀鎖:假設沒有衝突,不加鎖,更新資料時判斷該資料是否過期,過期的話則不進行資料更新,適用於讀取操作頻繁的場景
- 樂觀鎖 CAS:Compare And Swap,更新資料時先比較原值是否相等,不相等則表示資料過去,不進行資料更新
- 樂觀鎖實現:AtomicInteger、AtomicLong、AtomicBoolean
死鎖 4 個必要條件
- 互斥
- 佔有且等待
- 不可搶佔
- 迴圈等待
synchronized 原理
- 每個物件都有一個監視器鎖:monitor,同步程式碼塊會執行 monitorenter 開始,motnitorexit 結束
- wait/notify 就依賴 monitor 監視器,所以在非同步程式碼塊中執行會報 IllegalMonitorStateException 異常
3、Java 虛擬機器&記憶體結構&GC&類載入&四種引用&動態代理
JVM
- 定義:可以理解成一個虛構的計算機,解釋自己的位元組碼指令集對映到本地 CPU 或 OS 的指令集,上層只需關注 Class 檔案,與作業系統無關,實現跨平臺
- Kotlin 就是能解釋成 Class 檔案,所以可以跑在 JVM 上
JVM 記憶體模型
- Java 多執行緒之間是透過共享記憶體來通訊的,每個執行緒都有自己的本地記憶體
- 共享變數存放於主記憶體中,執行緒會複製一份共享變數到本地記憶體
- volatile 關鍵字就是給記憶體模型服務的,用來保證記憶體可見性和順序性
JVM 記憶體結構
執行緒私有:
1.程式計數器:記錄正在執行的位元組碼指令地址,若正在執行 Native 方法則為空
2.虛擬機器棧:執行方法時把方法所需資料存為一個棧幀入棧,執行完後出棧
3.本地方法棧:同虛擬機器棧,但是針對的是 Native 方法
執行緒共享:
1.堆:儲存 Java 例項,GC 主要區域,分代收集 GC 方法會吧堆劃分為新生代、老年代
2.方法區:儲存類資訊,常量池,靜態變數等資料
GC
回收區域:只針對堆、方法區;執行緒私有區域資料會隨執行緒結束銷燬,不用回收
回收型別:
1.堆中的物件
- 分代收集 GC 方法會吧堆劃分為新生代、老年代
- 新生代:新建小物件會進入新生代;透過複製演算法回收物件
- 老年代:新建大物件及老物件會進入老年代;透過標記-清除演算法回收物件
2.方法區中的類資訊、常量池
判斷一個物件是否可被回收:
1.引用計數法
缺點:迴圈引用
2.可達性分析法
定義:從 GC ROOT 開始搜尋,不可達的物件都是可以被回收的
GC ROOT
1.虛擬機器棧/本地方法棧中引用的物件
2.方法區中常量/靜態變數引用的物件
四種引用
- 強引用:不會被回收
- 軟引用:記憶體不足時會被回收
- 弱引用:gc 時會被回收
- 虛引用:無法透過虛引用得到物件,可以監聽物件的回收
ClassLoader
類的生命週期:
1.載入;2.驗證;3.準備;4.解析;5.初始化;6.使用;7.解除安裝
類載入過程:
1.載入:獲取類的二進位制位元組流;生成方法區的執行時儲存結構;在記憶體中生成 Class 物件
2.驗證:確保該 Class 位元組流符合虛擬機器要求
3.準備:初始化靜態變數
4.解析:將常量池的符號引用替換為直接引用
5.初始化:執行靜態塊程式碼、類變數賦值
類載入時機:
1.例項化物件
2.呼叫類的靜態方法
3.呼叫類的靜態變數(放入常量池的常量除外)
類載入器:負責載入 class 檔案
分類:
1.引導類載入器 - 沒有父類載入器
2.擴充類載入器 - 繼承自引導類載入器
3.系統類載入器 - 繼承自擴充類載入器
雙親委託模型:
當要載入一個 class 時,會先逐層向上讓父載入器先載入,載入失敗才會自己載入
為什麼叫雙親?不考慮自定義載入器,系統類載入器需要網上詢問兩層,所以叫雙親
判斷是否是同一個類時,除了類資訊,還必須時同一個類載入器
優點:
- 防止重複載入,父載入器載入過了就沒必要載入了
- 安全,防止篡改核心庫類
動態代理原理及實現
- InvocationHandler 介面,動態代理類需要實現這個介面
- Proxy.newProxyInstance,用於動態建立代理物件
- Retrofit 應用: Retrofit 透過動態代理,為我們定義的請求介面都生成一個動態代理物件,實現請求
4、Android 基礎&效能最佳化&Framwork
Activity 啟動模式
- standard 標準模式
- singleTop 棧頂複用模式,
- 推送點選訊息介面
- singleTask 棧內複用模式,
- 首頁
- singleInstance 單例模式,單獨位於一個任務棧中
- 撥打電話介面
細節: - taskAffinity:任務相關性,用於指定任務棧名稱,預設為應用包名
- allowTaskReparenting:允許轉移任務棧
- 撥打電話介面
View 工作原理
- DecorView (FrameLayout)
- LinearLayout
- titlebar
- Content
- 呼叫 setContentView 設定的 View
- LinearLayout
ViewRoot 的 performTraversals 方法呼叫觸發開始 View 的繪製,然後會依次呼叫:
- performMeasure:遍歷 View 的 measure 測量尺寸
- performLayout:遍歷 View 的 layout 確定位置
- performDraw:遍歷 View 的 draw 繪製
事件分發機制
- 一個 MotionEvent 產生後,按 Activity -> Window -> decorView -> View 順序傳遞,View 傳遞過程就是事件分發,主要依賴三個方法:
- dispatchTouchEvent:用於分發事件,只要接受到點選事件就會被呼叫,返回結果表示是否消耗了當前事件
- onInterceptTouchEvent:用於判斷是否攔截事件,當 ViewGroup 確定要攔截事件後,該事件序列都不會再觸發呼叫此 ViewGroup 的 onIntercept
- onTouchEvent:用於處理事件,返回結果表示是否處理了當前事件,未處理則傳遞給父容器處理
- 細節:
- 一個事件序列只能被一個 View 攔截且消耗
- View 沒有 onIntercept 方法,直接呼叫 onTouchEvent 處理
- OnTouchListener 優先順序比 OnTouchEvent 高,onClickListener 優先順序最低
- requestDisallowInterceptTouchEvent 可以遮蔽父容器 onIntercet 方法的呼叫
Window 、 WindowManager、WMS、SurfaceFlinger
- Window:抽象概念不是實際存在的,而是以 View 的形式存在,透過 PhoneWindow 實現
- WindowManager:外界訪問 Window 的入口,內部與 WMS 互動是個 IPC 過程
- WMS:管理視窗 Surface 的佈局和次序,作為系統級服務單獨執行在一個程式
- SurfaceFlinger:將 WMS 維護的視窗按一定次序混合後顯示到螢幕上
View 動畫、幀動畫及屬性動畫
View 動畫:
- 作用物件是 View,可用 xml 定義,建議 xml 實現比較易讀
- 支援四種效果:平移、縮放、旋轉、透明度
幀動畫:
- 透過 AnimationDrawable 實現,容易 OOM
屬性動畫:
- 可作用於任何物件,可用 xml 定義,Android 3 引入,建議程式碼實現比較靈活
- 包括 ObjectAnimator、ValuetAnimator、AnimatorSet
- 時間插值器:根據時間流逝的百分比計算當前屬性改變的百分比
- 系統預置勻速、加速、減速等插值器
- 型別估值器:根據當前屬性改變的百分比計算改變後的屬性值
- 系統預置整型、浮點、色值等型別估值器
- 使用注意事項:
- 避免使用幀動畫,容易OOM
- 介面銷燬時停止動畫,避免記憶體洩漏
- 開啟硬體加速,提高動畫流暢性 ,硬體加速:
- 將 cpu 一部分工作分擔給 gpu ,使用 gpu 完成繪製工作
- 從工作分攤和繪製機制兩個方面最佳化了繪製速度
Handler、MessageQueue、Looper
- Handler:開發直接接觸的類,內部持有 MessageQueue 和 Looper
- MessageQueue:訊息佇列,內部透過單連結串列儲存訊息
- Looper:內部持有 MessageQueue,迴圈檢視是否有新訊息,有就處理,沒就阻塞
- 如何實現阻塞:透過 nativePollOnce 方法,基於 Linux epoll 事件管理機制
- 為什麼主執行緒不會因為 Looper 阻塞:系統每 16ms 會傳送一個重新整理 UI 訊息喚醒
MVC、MVP、MVVM
- MVP:Model:處理資料;View:控制檢視;Presenter:分離 Activity 和 Model
- MVVM:Model:處理獲取儲存資料;View:控制檢視;ViewModel:資料容器
- 使用 Jetpack 元件架構的 LiveData、ViewModel 便捷實現 MVVM
Serializable、Parcelable
- Serializable :Java 序列化方式,適用於儲存和網路傳輸,serialVersionUID 用於確定反序列化和類版本是否一致,不一致時反序列化回失敗
- Parcelable :Android 序列化方式,適用於元件通訊資料傳遞,效能高,因為不像 Serializable 一樣有大量反射操作,頻繁 GC
Binder
- Android 程式間通訊的中流砥柱,基於客戶端-服務端通訊方式
- 使用 mmap 一次資料複製實現 IPC,傳統 IPC:使用者A空間->核心->使用者B空間;mmap 將核心與使用者B空間對映,實現直接從使用者A空間->使用者B空間
- BinderPool 可避免建立多 Service
IPC 方式
- Intent extras、Bundle:要求傳遞資料能被序列化,實現 Parcelable、Serializable ,適用於四大元件通訊
- 檔案共享:適用於交換簡單的資料實時性不高的場景
- AIDL:AIDL 介面實質上是系統提供給我們可以方便實現 BInder 的工具
- Android Interface Definition Language,可實現跨程式呼叫方法
- 服務端:將暴漏給客戶端的介面宣告在 AIDL 檔案中,建立 Service 實現 AIDL 介面並監聽客戶端連線請求
- 客戶端:繫結服務端 Service ,繫結成功後拿到服務端 Binder 物件轉為 AIDL 介面呼叫
- RemoteCallbackList 實現跨程式介面監聽,同個 Binder 物件做 key 儲存客戶端註冊的 listener
- 監聽 Binder 斷開:1.Binder.linkToDeath 設定死亡代理;2. onServiceDisconnected 回撥
- Messenger:基於 AIDL 實現,服務端序列處理,主要用於傳遞訊息,適用於低併發一對多通訊
- ContentProvider:基於 Binder 實現,適用於一對多程式間資料共享
- Socket:TCP、UDP,適用於網路資料交換
Android 系統啟動流程
- 按電源鍵 -> 載入載入程式 BootLoader 到 RAM -> 執行 BootLoader 程式啟動核心 -> 啟動 init 程式 -> 啟動 Zygote 和各種守護程式 ->
- 啟動 System Server 服務程式開啟 AMS、WMS 等 -> 啟動 Launcher 應用程式
App 啟動流程
Launcher 中點選一個應用圖示 -> 透過 AMS 查詢應用程式,若不存在就透過 Zygote 程式 fork
程式保活
- 程式優先順序:1.前臺程式 ;2.可見程式;3.服務程式;4.後臺程式;5.空程式
- 程式被 kill 場景:1.切到後臺記憶體不足時被殺;2.切到後臺廠商省電機制殺死;3.使用者主動清理
- 保活方式:
- 1.Activity 提權:掛一個 1畫素 Activity 將程式優先順序提高到前臺程式
- 2.Service 提權:啟動一個前臺服務(API>18會有正在執行通知欄)
- 3.廣播拉活
- 4.Service 拉活
- 5.JobScheduler 定時任務拉活
- 6.雙程式拉活
網路最佳化及檢測
- 速度:1.GZIP 壓縮(okhttp 自動支援);2.Protocol Buffer 替代 json;3.最佳化圖片/檔案流量;4.IP 直連省去 DNS 解析時間
- 成功率:1.失敗重試策略;
- 流量:1.GZIP 壓縮(okhttp 自動支援);2.Protocol Buffer 替代 json;3.最佳化圖片/檔案流量;5.檔案下載斷點續傳 ;6.快取
- 協議層的最佳化,比如更優的 http 版本等
- 監控:Charles 抓包、Network Monitor 監控流量
UI卡頓最佳化
- 減少佈局層級及控制元件複雜度,避免過度繪製
- 使用 include、merge、viewstub
- 最佳化繪製過程,避免在 Draw 中頻繁建立物件、做耗時操作
記憶體洩漏場景及規避
1.靜態變數、單例強引跟生命週期相關的資料或資源,包括 EventBus
2.遊標、IO 流等資源忘記主動釋放
3.介面相關動畫在介面銷燬時及時暫停
4.內部類持有外部類引用導致的記憶體洩漏
- handler 內部類記憶體洩漏規避:1.使用靜態內部類+弱引用 2.介面銷燬時清空訊息佇列
- 檢測:Android Studio Profiler
LeakCanary 原理
- 透過弱引用和引用佇列監控物件是否被回收
- 比如 Activity 銷燬時開始監控此物件,檢測到未被回收則主動 gc ,然後繼續監控
OOM 場景及規避
- 載入大圖:減小圖片
- 記憶體洩漏:規避記憶體洩漏
5、Android 模組化&熱修復&熱更新&打包&混淆&壓縮
Dalvik 和 ART
- Dalvik
- 谷歌設計專用於 Android 平臺的 Java 虛擬機器,可直接執行 .dex 檔案,適合記憶體和處理速度有限的系統
- JVM 指令集是基於棧的;Dalvik 指令集是基於暫存器的,程式碼執行效率更優
- ART
- Dalvik 每次執行都要將位元組碼轉換成機器碼;ART 在應用安裝時就會轉換成機器碼,執行速度更快
- ART 儲存機器碼佔用空間更大,空間換時間
APK 打包流程
1.aapt 打包資原始檔生成 R.java 檔案;aidl 生成 java 檔案
2.將 java 檔案編譯為 class 檔案
3.將工程及第三方的 class 檔案轉換成 dex 檔案
4.將 dex 檔案、so、編譯過的資源、原始資源等打包成 apk 檔案
5.簽名
6.資原始檔對齊,減少執行時記憶體
App 安裝過程
- 首先要解壓 APK,資源、so等放到應用目錄
- Dalvik 會將 dex 處理成 ODEX ;ART 會將 dex 處理成 OAT;
- OAT 包含 dex 和安裝時編譯的機器碼
元件化路由實現
ARoute:透過 APT 解析 @Route 等註解,結合 JavaPoet 生成路由表,即路由與 Activity 的對映關係
6、音影片&FFmpeg&播放器
FFmpeg
整合編譯了 AAC、MP3、H264 編碼器
播放器原理
影片播放原理:(mp4、flv)-> 解封裝 -> (mp3/aac、h264/h265)-> 解碼 -> (pcm、yuv)-> 音影片同步 -> 渲染播放
音影片同步:
- 選擇參考時鐘源:音訊時間戳、影片時間戳和外部時間三者選擇一個作為參考時鐘源(一般選擇音訊,因為人對音訊更敏感,ijk 預設也是音訊)
- 透過等待或丟幀將影片流與參考時鐘源對齊,實現同步
IjkPlayer 原理
整合了 MediaPlayer、ExoPlayer 和 IjkPlayer 三種實現,其中 IjkPlayer 基於 FFmpeg 的 ffplay
音訊輸出方式:AudioTrack、OpenSL ES;影片輸出方式:NativeWindow、OpenGL ES
文末
有些東西你不僅要懂,而且要能夠很好地表達出來,能夠讓面試官認可你的理解,例如Handler機制,這個是面試必問之題。
有些晦澀的點,或許它只活在面試當中,實際工作當中你壓根不會用到它,但是你要知道它是什麼東西。
客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。
所以需要梳理知識,提升儲備
-
架構師築基必備技能:深入Java泛型+註解深入淺出+併發程式設計+資料傳輸與序列化+Java虛擬機器原理+反射與類載入+動態代理+高效IO
-
Android高階UI與FrameWork原始碼:高階UI晉升+Framework核心解析+Android元件核心+資料持久化
-
360°全方面效能調優:設計思想與程式碼質量最佳化+程式效能最佳化+開發效率最佳化
-
解讀開源框架設計思想:熱修復設計+外掛化框架解讀+元件化框架設計+圖片載入框架+網路訪問框架設計+RXJava響應式程式設計框架設計+IOC架構設計+Android架構元件Jetpack
-
NDK模組開發:NDK基礎知識體系+底層圖片處理+音影片開發
-
微信小程式:小程式介紹+UI開發+API操作+微信對接
-
Hybrid 開發與Flutter:Html5專案實戰+Flutter進階
知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。
這裡附上針對位元組跳動的面試題整理的合集,我們進行了分類,循序漸進,由基礎到深入,由易到簡。
將內容整理成了五個章節:
計算機基礎面試題、資料結構和演算法面試題、Java面試題、Android面試題、其他擴充套件面試題、非技術面試題總共五個章節354頁。
還有一份Android開發相關原始碼解析,這份Android學習PDF大全真的包含了方方面面了
內含微信 MMKV 原始碼、AsyncTask 原始碼、Volley 原始碼、Retrofit原始碼、OkHttp 原始碼等等
位元組跳動真題解析、Android開發相關原始碼解析、簡歷模板可以 【文末】免費獲取
面試時HR也是不可以忽略的環節,我們經常也會遇到很多關於簡歷製作,職業困惑、HR經典面試問題回答等有關面試的問題。
有全套簡歷製作、春招困惑、HR面試等問題解析參考建議。
面試:如果不準備充分的面試,完全是浪費時間,更是對自己的不負責!
資料太多,全部展示會影響篇幅,暫時就先列舉這些部分截圖,以上資源均免費分享,以上內容均放在了開源專案: 【 github 】 中已收錄,大家可以自行獲取。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983917/viewspace-2736204/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 位元組跳動武漢招聘 2000 人,距離大廠 Offer,你還差這篇Android乾貨!Android
- 【位元組跳動】【上海】Android開發實習生招聘Android
- 【位元組跳動】【上海】iOS開發實習生招聘iOS
- 【位元組跳動】【上海】前端開發實習生招聘前端
- 【上海】位元組跳動招聘研發工程師!!!工程師
- 大廠面經: 位元組跳動 iOS開發實習生-飛書iOS
- 你與人工智慧的距離還差一個NLP人工智慧
- 大三實習生,位元組跳動面經分享,已拿Offer
- 位元組跳動的遊戲大冒險遊戲
- 位元組跳動,跳動的“遊戲夢”遊戲
- 位元組跳動實習面經分享(已拿offer附攻略)
- 乾貨 | 一款位元組跳動出品的高質量免費圖示庫
- 你需要的2019春招前端面經。位元組跳動、網易、美團 offer前端
- 位元組跳動雲原生大資料分析引擎 ByConity 與 ClickHouse 有何差異?大資料
- 從APP工廠到遊戲工廠?位元組跳動進攻騰訊腹地APP遊戲
- 1篇Outstanding、5篇Oral!位元組跳動今年ACL這麼猛? 來直播間聊聊!
- 從簡歷被拒,到斬獲位元組跳動offer,這份學習集合功不可沒!
- 坐穩休閒遊戲山頭,位元組跳動“遊戲大棋局”再落一子遊戲
- 位元組跳動ios面經iOS
- 4 大系列、33 課時,距離你成為架構師還差這一套課程架構
- 轉行薪資翻5倍,騰訊/阿里/位元組跳動一線大廠都在瘋搶這樣的人才阿里
- 自學兩個月,拿到位元組跳動的Offer 後,我決定分享這份學習集合!
- 45天拿下位元組跳動offer!就靠這個面試真題庫,內幕首次公開!面試
- 為上市搭橋,位元組跳動收割遊戲還缺什麼?遊戲
- 位元組跳動的「遊戲」法則遊戲
- 位元組跳動如何做遊戲?遊戲
- 位元組跳動遊戲突圍戰遊戲
- 位元組跳動揮劍亞馬遜電商?亞馬遜
- 位元組跳動遊戲版圖再擴充套件 入股仙境傳說CP遊戲套件
- 位元組跳動近日申請多個“位元組遊戲”商標遊戲
- 4面位元組跳動拿到2-2 Offer,入職就是30K16薪,全靠這份Android知識點PDF大全Android
- 位元組跳動殺入遊戲戰場,但想複製「頭騰大戰」還很難遊戲
- 2020 校招,我是如何拿到小米、京東、位元組大廠前端offer前端
- 位元組跳動的16款重度遊戲遊戲
- 位元組跳動的技術架構架構
- 位元組遊戲,跳動到哪兒了?遊戲
- 位元組跳動 Flink 大規模雲原生化實踐
- 網飛進軍遊戲,這與位元組跳動們有什麼不同?遊戲