& 跟 && 有什麼差異
& 是拿來做邏輯運算,&& 是拿來作條件判斷用
如果把 && 改成 & 會發生什麼事情
如果是 if(1 & 1) 會 return true; 因為 1 在背後會轉成 bit 去做比較
>> 但其實是錯的, & 若是在 if 內兩邊一定要放 true/false
B: String a = "aa"; String b = "bb"; System.out.println(a + b);會發生什麼事情
M: 背後會把 a 跟 b 使用 toString() 轉成文字
B: 對沒有錯,但希望可以說到他是用 StringBuilder append 起來的
B: Integer a =null; int b = a會發生什麼事情
M: 會發生 nullPointer
B: Integer a = 1000, b = 1000 a == b 會發生什麼事情
M: 會發生 false,因為這是 a 跟 b 各自創立的,所以 address 也會不一樣
B: Integer a = 127, b = 127 a == b 會發生什麼事情
M: 也會是 false
B: 其實是 true,因為 IntegerCache 會自動把 -127 ~ 127 放到緩存
B: 創建Student 放進set,然後修改裡面的參數,再放進set 會發生什麼事情
M: 會無法放成功,因為第一個 Student 跟修改後的 Student 是同一個物件,放過的物件就放不進去 set 內
(這題後台有糾紛,但還是提供上來參考)
B: 現在有 Try catch finally,finally 裡面有個 print 語句,請問 這個 print 會在何時執行
M: finally 會在 try 執行後列印
B: 不對, finally 會在 try return 前列印
B: 我們都知道 finally 是一定會執行到的,有什麼方法或是情境可以讓 finally 執行不到呢
M: 例如發生 outOfMemory 就會執行不到 finally
B: 如果 finally 內有一定要執行的,但因為outOfMemory讓 finally 做不到,該怎麼辦
M: 沒有遇到過這樣的情境,但如果知道這個方法是很重要的,覺得可以在前端發查的時候做檢核,例如在 finally 才要做到扣款(比較極端的例子),可是因為 outOfMemory 所以沒有扣到,這時候前端下一次查詢的時候檢查是否已扣款成功,如果沒有就在發送一次
B: 通常我們都希望服務可以 graceful shutdown,但出於某種原因直接被 shutdown,可以做什麼達到 graceful shutdown
M: 沒有碰過這樣的需求
B: 今天有個 ArrayList 並且有 multi-thread 要做相加,會發生什麼問題,要怎麼改善
M: 由於 ArrayList 是 unthreadsafe 物件,所以可能導致相加的結果不如預期,可以改用其他 concurrent 的物件
B: 可以跟我說說你平常用過哪些 class 然後用了什麼方法
M: 比較常使用到 list map set,然後有用過 size, isEmpty, get, put
B: 這些物件都會繼承 object,可以說說你用過 object 哪些方法嗎
M: 通常不會直接使用到 object 的方法,都是用子類覆寫的方法,像是 equals toString
B: Junit怎麼模擬第三方服務,這樣才可以正常測試
M: 可以使用 MockMVC 模擬第三方服務,確保測試的時候可以解耦,可以讓單元測試不會因為第三方而無法測試
B: Where 跟 having 差別
M: where 跟 having 都用在 filter 資料使用, having 需要搭配 group by 做使用
B: 總共有20筆資料,我要查 10 筆資料,並且下一次要查 11-20 筆怎麼設計,請包涵後端api要送的資料,以及 SQL 內容
M: 使用 oracle 的 procedure,SQL會是 select XX, YY from table where 條件 = AA … ,然後要查前 10 筆,可以使用 row 的方法去取資料,並且在同一個 procedure 查尋筆數,然後將資料、總筆數一起回傳
B: 沒用過 oracle ,以為會有 offset 這種方式
>> 實際上 oracle 有,但我當下忘記了
B: 如果有兩台server,相同的insert method同時執行,怎麼避免資料被改掉
M: 如果 insert Method 是要去取 redis 資料,可以用 lua 的方式去執行,並且搭配 redis 的樂觀鎖,去查看資料的板號,如果資料已經被更新過,則該方法就要立即中斷重新來
B: 假設今天不是要取 redis 資料,而是要取資料庫資料,例如新增一筆資料,該怎麼做
M: 可以 insert 之前,先檢查是否資料已經被新增過
B: redis總共有 1 億筆,要怎麼get 其中的 10 萬筆 key
M: 不能直接做 get 因為這樣會影響效能,我知道 redis 有指令可以讓 redis 有空的時候再去 get 資料
>> 實際上沒有這指令,頂多只能分批處理
B: 一個 key 裡面有好多個資料,隨著時間這個資料越來越多,要怎麼優化這個key
M: 看這個 key 能不能分群,如果 key 都是存帳戶,帳戶一定都是有不同的流水號,可以分批去 get
B: 請跟我說明 kafka 的 broker、offset、partition 做什麼用的
M: kafka 有 producer, consumer, topic,使用相同 topic 的 producer, consumer 會發送與接收訊息,一個 topic 會分散在不同的 broker 裡面,並且每取走一個就會 offset ,避免取道重複的資料,partition 沒用過
A: 剛剛說到的 offset ,如果不用 procedure 可以怎麼讓 query 查回來的資料包含所有符合條件的筆數以及符合條件的資料,例如符合條件有 20 筆,然後第一次要查 10 筆,以及 20 這個總數回來
M: 可以分成兩次查詢,一次是總筆數,一次是符合條件的資料
A: 但這樣就要查兩次,有沒有辦法只查一次
M: 這個我沒有實做過
A: 如果今天查了一筆資料要 1 秒,你有200萬筆要200萬秒,該怎麼優化
M: (一開始沒聽懂以為是要防止前端 timeout)可以把查詢放入 kafka 確保服務是不會被遺忘
A: 沒有解決問題,我要解決的是等待 200 萬秒
M: 這個我不清楚,回去研究一下
A: 如果有個 topic,且有 1 個 producer,以及 10 個 consumer,這時候發布一條 message 會發生什麼事情
M: 這 10 個 consumer 其中一個人會收到並處理