Java
這次竟然沒有一個Java基礎相關的。。。。
我極度懷疑面試官看了我博客,故意避開我會的。。。
框架
1. @bean的作用
聲明該返回值是一個bean
運行還是編譯 運行
bean如何起作用
通過@ComponentScan對包進行掃描
通過什麼查看註解
反射有個查看annotation方法
2. 爲什麼@Before可以AOP
在spring的生命週期的後置方法中,先查找實現了pointcutAdvisor的切面類,該類包含了Pointcut和Advice對象,檢查在Pointcut中的表達式能否匹配到當前的bean類,如果匹配則對bean進行織如
代理類沒有接口怎麼辦 cglib
如何代理final 通過aspectJ或者動態代理
3. SpringBoot的@SpringBootApplication
有三個nb註解@EnableAutoConfiguration,@ComponentScan和@SpringBootConfiguration,第一個裏面會有一個@Import註解,導入一個Select.class,該class會通過拿到每一個starter裏面的resources/META-INF的文件
如何寫一個starter
在自定義的starter裏面增加一個spring.proprites文件用來通知SpringBoot配置類的位置,然後在配置類中注入bean,如果需要映射參數的時候,可以通過@ConfigurationProperties註解
DB
4. 爲什麼索引用B+樹
深度淺,每個節點的key值更多
5. 爲什麼只有右模糊查詢走索引
用B+樹來解釋,MySQL的B+樹索引是按照從左向右的原則進行匹配的,如果其他模糊效率將是index
網絡
6. 面試時語音走得所有協議
語音如何通過網絡傳輸
微信文字的傳輸
微信發文字和圖片傳輸的區別
反正沒有回答到點上,有知道的logo可以發消息給我
算法
7. 瞭解哪些數據結構和算法
dp,貪心,dfs,bfs,prime,kruskal,樹,棧,圖,鏈表,數組,字符串
堆排序是穩定的嗎 不穩定
堆排序的最終結果集是平衡二叉樹嗎 不是
Arrays.sort()源碼
有三種排序方式:雙軸快排,併發歸併,以及修改的歸併
主要是修改的歸併:如果長度小於7的話會使用插入排序(即將刪除)
另外一種修改的歸併排序是TimSort:
-
掃描數組,確定其中的單調上升段和嚴格單調下降段,將嚴格下降段反轉;
-
定義最小基本片段長度,短於此的單調片段通過插入排序集中爲長於此的段;
-
反覆歸併一些相鄰片段,過程中避免歸併長度相差很大的片段,直至整個排序完成,所用分段選擇策略可以保證O(n log n)時間複雜性。
可以看到,原則上TimSort是歸併排序,但小片段的合併中用了插入排序。TimSort的最好複雜度是O(N),但是普通規並是O(nlogn)
OS
8. .java文件如何被OS執行
我回答的是虛擬機的那一塊
項目
9. 如何提高併發量
集羣,緩存,數據庫
10. 如何保證數據一致性
加鎖,雙刪,MQ
做題
面試官說給我個不常見的題,我吐。。。
11. 請用JAVA代碼完成以下功能,要求使用多線程
cat /home/admin/logs/*.log | grep "Login"| sort -nr | uniq -c
/**
* 讀取 這個文件夾下 以.log結尾的文件
* 匹配包含Login的字符串
* 並將字符串逆序排列相同的字符串合在一起
* 並在左側標出重複出現的次數
*
* @author wxxlamp
* @date 2020/03/11~14:53
*/
public class Ali {
public static String dir = "/home/admin/logs/";
public static String target = "Login";
public static void run() throws ExecutionException, InterruptedException {
Tree tree = new Tree();
List<String> stringList = getMultiFile(dir);
for (String s : stringList) {
tree.add(s);
}
tree.print();
}
private List<String> getMultiFile(String dir) throws ExecutionException, InterruptedException {
File fileDir = new File(dir);
File[] files = fileDir.listFiles();
List<String> list = new ArrayList<>();
assert files != null;
for (File file : files) {
if (file.getName().matches("^((?!log).*).log$")) {
FutureTask<List<String>> futureTask = new FutureTask<>(new Worker(file));
new Thread(futureTask).start();
list.addAll(futureTask.get());
}
}
return list;
}
private List<String> getTargetStringLine(File file) {
Charset charset = StandardCharsets.UTF_8;
StringBuilder sb = new StringBuilder();
try(FileChannel fin = new FileInputStream(file).getChannel()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (fin.read(buffer) != -1) {
buffer.flip();
sb.append(charset.decode(buffer));
buffer.clear();
}
} catch (IOException e) {
e.printStackTrace();
}
String[] ss = sb.toString().split("\\r");
List<String> stringList = new ArrayList<>();
for (String s : ss) {
if (s.contains(target)) {
stringList.add(s);
}
}
return stringList;
}
private class Worker implements Callable<List<String>> {
private File file;
public Worker (File file){
this.file = file;
}
@Override
public List<String> call() {
return getTargetStringLine(file);
}
}
private static class Tree {
private Map<String,Integer> map = new TreeMap<>(
Comparator.reverseOrder());
public synchronized void add(String str) {
if(!map.containsKey(str)) {
map.put(str,1);
return;
}
Integer num = map.get(str);
map.put(str, ++num);
}
public void print() {
print(map);
}
public void print(Map<String, Integer> map) {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}
}
12. LeetCode打家劫舍
13. 寫一個黑名單過濾系統
這兩個算法題是淘寶一面後的筆試題,不是本次面試題
覆盤
以前都是聽說阿里越往後項目越多,爲什麼這次全是基礎啊QAQ
突然發現面試官會看我CSDN,我在考慮要不要把我的面經設爲私人可見,因爲最近發現面試官問的問題基本剛好撇開了我整理的
這次的面試官和往常的大不一樣,完全不走常規路,就像是和我討論問題一樣,一點一點問,完全問到我不會。還有一個就是寫第一個場景題的時候,我多線程寫完沒來得及提交就到時間了,淦。這個場景題據我所知會成爲最終評級考覈的參考之一,我傷心555
面試官誇說我在本科生中還不錯,對我印象挺好,但是還是要多實踐。幸好二面險過。